使用 Gensim 提取短语时出错

3 python data-mining text-mining gensim word2vec

我正在尝试使用 Gensim 中的短语获取句子中的二元组,如下所示。

from gensim.models import Phrases
from gensim.models.phrases import Phraser
documents = ["the mayor of new york was there", "machine learning can be useful sometimes","new york mayor was present"]

sentence_stream = [doc.split(" ") for doc in documents]
#print(sentence_stream)
bigram = Phrases(sentence_stream, min_count=1, threshold=2, delimiter=b' ')
bigram_phraser = Phraser(bigram)

for sent in sentence_stream:
    tokens_ = bigram_phraser[sent]
    print(tokens_)
Run Code Online (Sandbox Code Playgroud)

即使将“new”、“york”捕获为“new york”,它也不会捕获“machine”,将学习作为“机器学习”

但是,在Gensim 网站上显示示例中,他们能够将“机器”、“学习”等词捕获为“机器学习”。

请让我知道如何在上面的示例中将“机器学习”作为二元组

goj*_*omo 5

gensim 使用的技术Phrases完全基于共现统计:在一个公式中,单词一起出现的频率与单独出现的频率相比,也受min_countthreshold值的影响并与该值进行比较。

只是因为你的训练集有 'new' 和 'york' 出现两次,而其他词(如 'machine' 和 'learning')只出现一次,'new_york' 变成了一个二元组,并且其他配对没有。更重要的是,即使你没有发现的组合min_count,并threshold能够促进“machine_learning”到二元,它会这可能不是你想要的东西-所有其他两字,也就是说,出现一次配对在一起。

真的,要从这些统计技术中获得好的结果,您需要大量不同的、真实的数据。(出于表面玩具大小的原因,玩具大小的示例可能表面上成功或失败。)

即便如此,他们也会倾向于错过一个人认为合理的组合,并做出一个人不会的组合。为什么?因为我们的大脑有更复杂的方法(包括语法和现实世界的知识)来决定词块何时代表一个概念。

因此,即使有更多更好的数据,也要为无意义的 n-gram 做好准备。调整或判断模型是否在整体上提高了您的目标,而不是任何单点或临时检查匹配您自己的敏感性。

(关于引用的 gensim 文档注释,我很确定,如果您只尝试Phrases其中列出的两个句子,它不会找到任何所需的短语 - 不是“new_york”或“machine_learning”。举个比喻性的例子,省略号...表示训练集更大,结果表明额外未显示的文本很重要。只是因为您在代码中添加的第 3 句检测到了 'new_york'。如果您添加了类似的示例来使 ' machine_learning' 看起来更像是一个统计上的离群配对,你的代码也可以促进'machine_learning'。)