繁体   English   中英

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

"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-grams),然后从这些片段中为一个新的未知词组装一个向量来做到这一点。 它通常比随机更好,因为未知单词通常是拼写错误或已知单词的变体,它们共享很多片段。 但它仍然不是很好,对于真正奇怪的字符串,基本上返回一个随机向量。

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM