【问题标题】:words not available in corpus for Word2Vec trainingWord2Vec 训练的语料库中不可用的单词
【发布时间】:2021-07-08 21:58:11
【问题描述】:

我对 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"

我应该如何处理输入语料库中不存在的单词?我想在我的实验中将输入语料库中不存在的单词分配为零向量,但我被困在如何做到这一点。

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

【问题讨论】:

    标签: python nlp word2vec


    【解决方案1】:

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

    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 之类的算法,它可以合成优于无的向量——而不是将 所有 未知单词折叠成一个无意义的向量。

    【讨论】:

      猜你喜欢
      • 2014-07-15
      • 2021-10-22
      • 2016-07-28
      • 2019-09-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-09-25
      相关资源
      最近更新 更多