我正在尝试使用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_)
即使它捕获“新”,“约克”为“纽约”,它也不会抓住“机器”,学习“机器学习”
然而,在example shown in Gensim Website,他们能够将“机器”,“学习”这些词语称为“机器学习”。
请告诉我如何在上面的例子中将“机器学习”作为一个二元组件
答案 0 :(得分:2)
gensim Phrases
使用的技术纯粹基于共现的统计数据:在受min_count
影响并与{{1}进行比较的公式中,单词出现在一起的频率与单独出现的频率相同价值。
这只是因为你的训练集有'新'和'约克'并排出现两次,而其他单词(比如'机器'和'学习')只相互出现一次,'new_york'成为一个二重奏和其他配对没有。更重要的是,即使你确实发现threshold
和min_count
的组合将'machine_learning'推广到一个二元组,它也也将所有其他二元组合在一起 - 出现一次 - 这可能不是你想要的。
真的,要从这些统计技术中获得好的结果,您需要大量不同的,真实的数据。 (出于玩具大小的原因,玩具大小的例子可能会表面上成功或失败。)
即便如此,他们也会倾向于错过一个人认为合理的组合,并且一个人不会做出组合。为什么?因为我们的思想有更复杂的方法(包括语法和现实世界的知识)来决定什么时候一堆词代表一个单一的概念。
因此,即使有更好的数据,也要为无意义的n-gram做好准备。调整或判断模型是否总体上改善了您的目标,而不是任何单点或特殊检查以匹配您自己的敏感度。
(关于引用的gensim文档评论,我很确定如果你只在那里列出的两个句子上尝试threshold
,它就找不到任何想要的短语 - 不是'new_york'或' machine_learning'。作为比喻示例,省略号Phrases
意味着训练集更大,结果表明额外未显示的文本很重要。这只是因为您添加到代码中的第3个句子'检测到new_york'。如果您添加了类似的示例,使“machine_learning”看起来更像是一个统计上偏远的配对,那么您的代码也可以促进“machine_learning”。)
答案 1 :(得分:0)
可能低于threshold
?
尝试使用更多数据。