为什么不是所有的双字母组都在 gensim 的“短语”工具中创建?

Why aren't all bigrams created in gensim's `Phrases` tool?

我已经使用 gensim 创建了一个二元模型并尝试获取二元句子,但它没有选择所有二元句子,为什么?

from gensim.models.phrases import Phrases, Phraser
phrases = Phrases(sentences, min_count=1, threshold=1)
bigram_model = Phraser(phrases)
sent = [u'the', u'mayor', u'of', u'new', u'york', u'was', u'there']
print(bigram_model[sent])
[u'the', u'mayor', u'of', u'new_york', u'was', u'there']

任何人都可以解释如何获得所有双字母组。

为什么只有 'new_york' 而不是 'the_mayor' 和其他人?

Phrases 算法通过统计分析来决定将哪些词对提升为二连词,该统计分析将每个词的基频单独与它们一起进行频率比较。

因此,一些词对将通过此测试并组合,而另一些则不会。如果你没有得到你期望的配对,那么你可以使用 Phrases class 选项稍微调整算法,包括 thresholdmin_count 和至少一个替代评分机制。

但是,即使是最大程度地调整,它通常也不会创建我们作为自然语言使用者会感知到的所有短语——因为它对语法或世界上实际上逻辑相关的实体一无所知。它只知道训练文本中的频率统计信息。

因此,它会遗漏一些我们认为自然且令人满意的配对,而它创建的一些配对我们会认为是不合逻辑的。尽管如此,即使使用这些不美观的配对——创建人们看起来不合适的文本——转换后的文本通常可以在某些下游 class 化或信息检索任务中更好地工作。

如果您真的只想要所有可能的双字母组,那将是一个更简单的文本转换,不需要 gensim Phrases 的多次传递和内部统计收集。

而且,如果您确实想使用 gensim 的 Phrases 技术,它只有在拥有大量训练数据时才会表现良好。只有几十个单词的玩具大小的文本——甚至数万个单词——不会产生好的结果。您可能需要数百万到数千万个训练词才能真正检测到统计上有效的词对。