SciSpacy 相当于 Gensim 的 functions/parameters

SciSpacy equivalent of Gensim's functions/parameters

对于 Gensim,我经常使用三个函数,例如这个:

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

gensim 的输出,但我无法理解如何在等效的 SciSpacy 命令中设置大小和 min_count 参数:

model = spacy.load('en_core_web_md')

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

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

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

这是来自 SciSpacy 的 gensim/Expected 输出:

[('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'])

SciSpacy 输出 Gensim/Expected 的输出(实际上这个向量的长度为 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)(例如,我查看了 here and here),但我不确定我是否遗漏了它们?

实现您的目标的可能方法是:

  1. parse you documents via nlp.pipe
  2. collect all the words and pairwise similarities
  3. process similarities to get the desired results

让我们准备一些数据:

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 训练它们。