Word2Vec 训练语料库中不可用的单词

words not available in corpus for Word2Vec training

我对 Word2Vec 完全陌生。我想在我的数据中找到单词对之间的余弦相似度。我的代码如下:

import pandas as pd
from gensim.models import Word2Vec
model = Word2Vec(corpus_file="corpus.txt", sg=0, window =7, size=100, min_count=10, iter=4)
vocabulary = list(model.wv.vocab)
data=pd.read_csv("experiment.csv")
cos_similarity = model.wv.similarity(data['word 1'], data['word 2'])

问题是我的“experiment.csv”文件的数据列中的一些词:语料库文件中不存在“词 1”和“词 2”(corpus.txt") .所以返回这个错误:

"word 'setosa' not in vocabulary"

我应该如何处理输入语料库中不存在的词?我想在我的实验中将输入语料库中不存在的词分配给向量零,但我不知道该怎么做。

对我的问题有什么想法吗?

给生词原点(全部'zero')向量真的很容易:

word = data['word 1']
if word in model.wv:
    vec = model[word]
else: 
    vec = np.zeros(100)

但是,这不太可能是您想要的。与其他向量相比,零向量不能具有余弦相似性。

最好忽略不认识的单词。如果它们非常罕见以至于您的训练数据中没有足够的它们来创建向量,那么它们对其他分析的贡献不大。

如果它们仍然很重要,最好的方法是获取更多数据和实际使用上下文,以便它们获得有意义的向量。

另一种方法是使用一种算法,例如 word2vec 变体 FastText,它总是可以根据训练数据为任何词汇外 (OOV) 的词合成一个猜测向量.它通过学习单词片段(charactewr n-grams)的单词向量,然后从这些片段中为新的未知单词组装一个向量来做到这一点。它通常比随机好,因为未知词通常是已知词的拼写错误或变体,它们共享很多片段。但它仍然不是很好,对于非常奇怪的字符串,本质上是 returns 一个随机向量。

我见过的另一种策略,但我个人不推荐,是用一些单独的词替换很多本来会被忽略的词——比如那些出现次数少于 min_count 的词插件令牌,比如 '<OOV>'。然后那个合成标记变成了一个很常见的词,但得到了一个几乎完全没有意义的词:一个随机的低幅度向量。 (与简单地消除低频词相比,这种假词和噪声向量在训练中的普遍存在会使周围其他词的向量变得更糟或训练速度变慢。)但是,当处理后来的未知词时,您可以使用相同的 '<OOV>' 伪词向量作为不太有害的替代品。

但是再说一遍:做一些组合几乎总是更好 – (a) 更多数据; (b) 忽略生僻词; (c) 使用像 FastText 这样的算法,它可以合成胜于无的向量——而不是将 所有 未知词折叠成一个无意义的向量。