语料库中没有用于 Word2Vec 训练的单词

问题描述

我对 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”文件的数据列中的一些词:“word 1”和“word 2”在语料库文件(“corpus.txt”)中不存在。所以返回这个错误

"word 'setosa' not in vocabulary"

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

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

解决方法

给未知单词赋予原点(全为零)向量真的很容易:

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

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

忽略生词通常更好。如果它们非常罕见,以至于您的训练数据中没有足够的它们来创建向量,那么它们就无法对其他分析做出太大贡献。

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

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

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

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