问题描述
1和2之类的问题给出了从gensim word2vec模型中检索词汇频率的答案。
出于某种原因,它们实际上只是给出一个贬值的计数器(从vocab的大小)到0,以及最频繁的标记,顺序排列。
例如:
for idx,w in enumerate(model.vocab):
print(idx,w,model.vocab[w].count)
礼物:
0 </s> 111051
1 . 111050
2,111049
3 the 111048
4 of 111047
...
111050 tokiwa 2
111051 muzorewa 1
为什么要这样做?给定单词,如何从模型中提取词频?
解决方法
这些答案对于从具有它们的模型中读取已声明的令牌计数是正确的。
但是在某些情况下,您的模型可能仅使用每个单词的虚假的降1计数进行了初始化。在使用Gensim的情况下,最有可能是从无法计数或未使用计数的来源加载的。
尤其是,如果您使用load_word2vec_format()
创建了模型,则该简单的纯矢量格式(无论是binary
还是纯文本)固有地不包含字数统计。但是,按照惯例,这些词几乎总是按照最频繁到最不频繁的顺序排序。
因此,Gensim选择了当频率不存在时以线性递减的int值来合成假计数,其中(第一个)最频繁的词以所有唯一词的计数开始,而(最后一个)最少的词开始计数-frequent word的计数为1。
(我不确定这是一个好主意,但是Gensim已经做了一段时间了,它可以确保依赖于每个令牌count
的代码不会中断,并会保留原始顺序,尽管显然不是原始的真实比例。)
在某些情况下,文件的原始来源可能保存了一个单独的.vocab
文件,其单词频率与word2vec_format
向量一起。 (在Google的原始word2vec.c
代码版本中,这是由可选的-save-vocab
标志生成的文件。在Gensim的.save_word2vec_format()
方法中,可选的fvocab
参数可用于生成此文件副文件。)
如果是这样,当您调用.load_word2vec_format()
时,可以提供“ vocab”频率文件名作为fvocab
参数-然后向量集将具有真实计数。
如果单词矢量最初是在Gensim中从给出实际频率的语料库创建的,并且始终使用Gensim本机函数.save()
/ .load()
进行保存/加载,该函数使用扩展形式的Python-腌制,那么原始的真实count
信息将永远不会丢失。
如果您丢失了原始频率数据,但是您知道该数据来自真实的自然语言来源,并且您想要一组更逼真的(但仍然是伪造的)频率,则可以选择使用Zipfian分配。 (实际的自然语言使用频率通常大致符合这种“高头,长尾巴”的分布。)答案中提供了用于创建这种更真实的虚拟计数的公式:
Gensim: Any chance to get word frequency in Word2Vec format?