如何检查Word2Vec训练模型中是否存在某个键

45

我使用Gensim训练了一个word2vec模型,使用的语料库是一些文档。一旦模型训练完成,我会编写以下代码来获取单词“view”的原始特征向量。

myModel["view"]

然而,我对这个单词出现了KeyError错误,可能是因为它在word2vec索引的键列表中不存在。在尝试获取原始特征向量之前,如何检查索引中是否存在该键?

8个回答

46
Word2Vec还提供了一个'vocab'成员,您可以直接访问。
使用Pythonic方法:
if word in w2v_model.vocab:
    # Do something

编辑 由于gensim 2.0发布后,Word2Vec的API已经更改。现在您应该使用以下内容访问词汇表:

if word in w2v_model.wv.vocab:
    # Do something

编辑2:属性“wv”正在被废弃,将在gensim 4.0.0中完全删除。现在回到OP最初的答案:

if word in w2v_model.vocab:
    # Do something

1
@MohitJain 那么这不是给他的问题提供了答案吗?我认为我的回答非常有道理,考虑到这正是我自己用来解决这个问题的代码。 - Matt Fortier
1
一行代码的注释更适合简短说明。如果您能为像我这样的读者添加简要说明,您可以获得更多的赞同票。 - Mohit Jain
谢谢解释,已经注意到了! - Matt Fortier
如果使用gensim,请像rakaT建议的那样使用gensim.models.Word2Vec.wv.vocab - Titou
@Titou 是的,gensim Word2Vec 的接口已经改变了。感谢您指出! - Matt Fortier
这个有多快?从w2v.vocab构建一个集合以获得更快的访问是否有意义? - Geoffrey Negiar

35

将模型转换为向量

word_vectors = model.wv

那么我们可以使用

if 'word' in word_vectors.vocab

14

1
我通常使用一个过滤器:


for doc in labeled_corpus:
    words = filter(lambda x: x in model.vocab, doc.words)

这是一种简单的方法,用于解决未知词汇导致的KeyError问题。

1

在这里回答我的问题。

Word2Vec提供了一个名为contains('view')的方法,根据相应单词是否被索引返回True或False。


8
以后参考,这个不再起作用了。 'Word2Vec'对象没有属性'contains'。 - CentAu

1

正如@quemeful所提到的,你可以这样做:

if "view" in model.wv.key_to_index.keys():
    # do something

0

要检查单词是否存在于您的模型中,您可以使用以下方法:

word2vec_pretrained_dict = dict(zip(w2v_model.key_to_index.keys(), w2v_model.vectors))

其中w2v_model.key_to_index为每个单词和序列号提供字典

w2v_model.vectors返回每个单词的向量化形式


0

嘿,我知道这篇文章有点晚了,但是这里有一段代码可以很好地解决这个问题。我自己在我的代码中使用它,它的效果非常好 :)

   size = 300 #word vector size
   word = 'food' #word token

   try:
        wordVector = model[word].reshape((1, size))
   except KeyError:
        print "not found! ",  word

注意: 我正在使用Python的Gensim库进行word2vec模型


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接