【问题标题】:SciSpacy equivalent of Gensim's functions/parametersSciSpacy 等效于 Gensim 的函数/参数
【发布时间】:2020-12-08 11:52:07
【问题描述】:

使用 Gensim,我经常使用三个功能,例如这个:

model = gensim.models.Word2Vec(corpus,size=100,min_count=5)

gensim 的输出,但我不明白如何在等效的 SciSpacy 命令中设置 size 和 min_count 参数:

model = spacy.load('en_core_web_md')

(输出是一个嵌入模型(太大,无法在此处添加))。

这是我经常使用的另一个命令:

model.most_similar(positive=['car'])

这是 gensim 的输出/SciSpacy 的预期输出:

[('vehicle', 0.7857330441474915),
 ('motorbike', 0.7572781443595886),
 ('train', 0.7457204461097717),
 ('honda', 0.7383008003234863),
 ('volkswagen', 0.7298516035079956),
 ('mini', 0.7158907651901245),
 ('drive', 0.7093928456306458),
 ('driving', 0.7084407806396484),
 ('road', 0.7001082897186279),
 ('traffic', 0.6991947889328003)]

这是我经常使用的第三条命令:

print(model.wv['car'])

Gensim 的输出/SciSpacy 的预期输出(实际上这个向量的长度为 100):

    [ 1.0942473   2.5680697  -0.43163642 -1.171171    1.8553845  -0.3164575
  1.3645878  -0.5003705   2.912658    3.099512    2.0184739  -1.2413547
  0.9156444  -0.08406237 -2.2248871   2.0038593   0.8751471   0.8953876
  0.2207374  -0.157277   -1.4984075   0.49289042 -0.01171476 -0.57937795...]

有人能告诉我 SciSpacy 的等效命令吗?例如,对于“gensim.models.Word2Vec”,我找不到如何指定向量的长度(大小参数),或者单词应该在 SciSpacy 的语料库中出现的最小次数(min_count)(例如 I看了herehere),但我不确定我是否错过了它们?

【问题讨论】:

  • 预期输出?
  • 抱歉,我可以添加它们,谢谢(将尝试缩短,因为它们的预期输出只是数字向量,即单词的嵌入)

标签: python nlp spacy gensim


【解决方案1】:

实现目标的一种可能方法是:

  1. 通过nlp.pipe解析您的文档
  2. 收集所有单词和成对相似度
  3. 处理相似性以获得所需结果

让我们准备一些数据:

import spacy
nlp = spacy.load("en_core_web_md", disable = ['ner', 'tagger', 'parser'])

然后,要获得一个向量,就像在model.wv['car'] 中那样:

nlp("car").vector

为了得到最相似的词,比如model.most_similar(positive=['car']),让我们处理语料库:

corpus = ["This is a sentence about cars. This a sentence aboout train"
          , "And this is a sentence about a bike"]
docs = nlp.pipe(corpus)

tokens = []
tokens_orth = []

for doc in docs:
    for tok in doc:
        if tok.orth_ not in tokens_orth:
            tokens.append(tok)
            tokens_orth.append(tok.orth_)
            
sims = np.zeros((len(tokens),len(tokens)))

for i, tok in enumerate(tokens):
    sims[i] = [tok.similarity(tok_) for tok_ in tokens]

然后检索top=3最相似的词:

def most_similar(word, tokens_orth = tokens_orth, sims=sims, top=3):
    tokens_orth = np.array(tokens_orth)
    id_word = np.where(tokens_orth == word)[0][0]
    sim = sims[id_word]
    id_ms = np.argsort(sim)[:-top-1:-1]
    return list(zip(tokens_orth[id_ms], sim[id_ms]))


most_similar("This")

[('this', 1.0000001192092896), ('This', 1.0), ('is', 0.5970357656478882)]

PS

我还注意到您要求提供尺寸和频率的规格。嵌入长度在模型初始化时是固定的,因此之后无法更改。如果您愿意,您可以从一个空白模型开始,并提供您熟悉的嵌入。至于频率,它是可行的,通过计算所有单词并丢弃任何低于所需阈值的单词。但同样,底层嵌入将来自未过滤的文本。 SpaCy 与 Gensim 的不同之处在于它使用现成的嵌入,而 Gensim 训练它们。

【讨论】:

  • 非常感谢。对于嵌入长度,我正在尝试复制 gensim 向量大小:radimrehurek.com/gensim/auto_examples/tutorials/…('是 gensim Word2Vec 将单词映射到的 N 维空间的维数(N)')。但是我能否确认您所说的是在加载模型时设置了长度(即,当您执行 nlp=spacy.load("en_core_web_md") 时,整个模型/词汇的向量长度为​​ 300))。 ..这就是我收集到的:shanelynn.ie/word-embeddings-in-python-with-spacy-and-gensim
  • >>> the length is set when you load in the model。它是在有人将向量加载到空模型中并继续训练 pos、依赖解析器和 ner 时设置的。之后您无法更改向量 - 当您加载经过训练的模型时 - 因为经过训练的管道基于嵌入。当然你可以使用你的嵌入,这是几个小时的练习,但这样做有什么意义,除非你想要一个不可用的语言模型。
猜你喜欢
  • 1970-01-01
  • 2017-08-31
  • 1970-01-01
  • 2013-06-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多