从 gensim 模型中提取词频
Extract token frequencies from gensim model
类似 and 2 的问题给出了从 gensim word2vec 模型中检索词汇频率的答案。
出于某种原因,他们实际上只是给出了一个从 n(词汇量)到 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
为什么要这样做?给定一个词,我如何从模型中提取词频?
这些答案对于从包含它们的模型中读取声明的 token-counts 是正确的。
但在某些情况下,您的模型可能只使用假的初始化,每个单词的计数为 descending-by-1。这很可能是在使用 Gensim 时,如果它是从计数不可用或未使用的源加载的。
特别是,如果您使用 load_word2vec_format()
创建模型,那么简单的 vectors-only 格式(无论是 binary
还是 plain-text)本质上不包含字数。但是按照惯例,这些词几乎总是按 most-frequent 到 least-frequent 的顺序排序。
因此,Gensim 选择,当频率不存在时,合成假计数,具有线性下降的 int 值,其中(第一个)most-frequent 单词以所有唯一单词的计数开始,并且(最后)least-frequent 个单词的计数为 1。
(我不确定这是个好主意,但 Gensim 已经做了一段时间了,它确保依赖于 per-token count
的代码不会中断,并且会保留原来的顺序,虽然显然不是不可知的原始顺序 true-proportions.)
在某些情况下,文件的原始来源 可能 保存了一个单独的 .vocab
文件,其中 word-frequencies 与 word2vec_format
向量。 (在 Google 的原始 word2vec.c
代码发布中,这是由可选的 -save-vocab
标志生成的文件。在 Gensim 的 .save_word2vec_format()
方法中,可选的 fvocab
参数可用于生成此副文件。)
如果是这样,当您调用 .load_word2vec_format()
时,可能会提供 'vocab' 频率文件名作为 fvocab
参数 - 然后您的 vector-set 将具有真实计数.
如果您 word-vectors 最初是在 Gensim 中从提供实际频率的语料库创建的,并且总是 saved/loaded 使用 Gensim 本机函数 .save()
/.load()
使用Python-pickling 的扩展形式,那么原始的真实 count
信息将永远不会丢失。
如果您丢失了原始频率数据,但您知道数据来自真实的 natural-language 来源,并且您想要一组更真实(但仍然是伪造的)的频率,一个选项可以是使用 Zipfian 分布。 (实际 natural-language 使用频率往往大致符合此 'tall head, long tail' 分布。)答案中提供了创建此类 more-realistic 虚拟计数的公式:
类似
出于某种原因,他们实际上只是给出了一个从 n(词汇量)到 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
为什么要这样做?给定一个词,我如何从模型中提取词频?
这些答案对于从包含它们的模型中读取声明的 token-counts 是正确的。
但在某些情况下,您的模型可能只使用假的初始化,每个单词的计数为 descending-by-1。这很可能是在使用 Gensim 时,如果它是从计数不可用或未使用的源加载的。
特别是,如果您使用 load_word2vec_format()
创建模型,那么简单的 vectors-only 格式(无论是 binary
还是 plain-text)本质上不包含字数。但是按照惯例,这些词几乎总是按 most-frequent 到 least-frequent 的顺序排序。
因此,Gensim 选择,当频率不存在时,合成假计数,具有线性下降的 int 值,其中(第一个)most-frequent 单词以所有唯一单词的计数开始,并且(最后)least-frequent 个单词的计数为 1。
(我不确定这是个好主意,但 Gensim 已经做了一段时间了,它确保依赖于 per-token count
的代码不会中断,并且会保留原来的顺序,虽然显然不是不可知的原始顺序 true-proportions.)
在某些情况下,文件的原始来源 可能 保存了一个单独的 .vocab
文件,其中 word-frequencies 与 word2vec_format
向量。 (在 Google 的原始 word2vec.c
代码发布中,这是由可选的 -save-vocab
标志生成的文件。在 Gensim 的 .save_word2vec_format()
方法中,可选的 fvocab
参数可用于生成此副文件。)
如果是这样,当您调用 .load_word2vec_format()
时,可能会提供 'vocab' 频率文件名作为 fvocab
参数 - 然后您的 vector-set 将具有真实计数.
如果您 word-vectors 最初是在 Gensim 中从提供实际频率的语料库创建的,并且总是 saved/loaded 使用 Gensim 本机函数 .save()
/.load()
使用Python-pickling 的扩展形式,那么原始的真实 count
信息将永远不会丢失。
如果您丢失了原始频率数据,但您知道数据来自真实的 natural-language 来源,并且您想要一组更真实(但仍然是伪造的)的频率,一个选项可以是使用 Zipfian 分布。 (实际 natural-language 使用频率往往大致符合此 'tall head, long tail' 分布。)答案中提供了创建此类 more-realistic 虚拟计数的公式: