从gensim模型中提取令牌频率

问题描述

12之类的问题给出了从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?