描述
请参考下面的内容,但最常见的短语没有被Phrases
识别为bigram。
步骤/代码/语料库以重现问题
s = ['i went to toys r us',
'we are at babies r us',
'where is babies r us',
'do you mean toys r us']
s = [_.split() for _ in s]
phrases = Phrases(s, min_count=1, threshold=2)
list(phrases.export_phrases(s))
实际结果
# [(b'toys r', 3.625),
# (b'babies r', 3.625),
# (b'babies r', 3.625),
# (b'toys r', 3.625)]
预期结果
鉴于短语"r us"在句子中最为常见,我希望这将是一个常见的提取短语。在#794中有提到,意图是避免重叠的bigrams。根据使用场景,如果所有bigrams都通过了指定的阈值,重叠的bigrams可能不是一个问题。也许可以考虑一个overlapping_phrases标志?
版本
Windows-7-6.1.7601-SP1
Python 3.6.1 |Anaconda自定义(64位)|(默认,2017年5月11日 13:25:24) [MSC v.1900 64位(AMD64)]
NumPy 1.13.3
SciPy 1.0.0
gensim 2.3.0
FAST_VERSION 0
7条答案
按热度按时间mlmc2os51#
感谢@init-random提供的报告,在gensim的最新版本中成功复现了你的问题。
ghg1uchk2#
IMO
Phrases
需要进行适当的重写(既为了性能,也为了清理逻辑和API)。这也与Bounter优化有关。vxqlmq5t3#
短语检测是"贪婪"的;如果一个标记被文本中较早出现的满足当前阈值的短语消耗,那么它将无法用于后续的短语,即使后面的短语更强大(即使在更严格的阈值下也能找到)。据我所知,Google的word2vec.c发布版本中的短语检测,我相信这激发了这段代码的行为方式也是如此。
btxsgosb4#
@gojomo 谢谢你的解释。是的,的确如此。
我使用这个假设的基本前提是它正在查看一个滑动窗口的bigrams,如图5.1中Chris Manning书中所述。此外,在bounter bigram count示例中,它也使用了滑动窗口。
似乎贪婪的方法可能是一个工程/优化决策?考虑到word2phrase针对数十亿个单词,这很可能是一个情况。
如果这是一个功能,也许可以考虑有一个选项来计算/考虑所有的bigrams会更好?
lndjwyie5#
选择更强的搭配似乎是一个更好的策略。前瞻开销不应该太大,尽管你可以想象/构思在单个短语提升发生之前,整个文本的所有搭配都需要被评分的情况。(例如:每个搭配都超过了阈值,但每个都比前一个略强一些,一直到文本的末尾。)
我想知道在这种情况下,是否可以立即检查迭代提升到更长的短语,也许通过合并/扁平化的频率字典来实现,而不是当前模型中完全不同的迭代过程。(也就是说,如果
a b c d e
变成a b c d e
,那么立即检查潜在的短语化(c
,d_e
)的可能性,从相同的频率信息开始——而不是在其他使用单独频率字典的传递中进行。在这种情况下(c
,d_e
)有机会超越(b
,c
),而它没有机会在两个独立的分层传递中做到这一点。)iovurdzv6#
我不明白为什么你不能,但我能想到几个问题:
a b
频繁但b c
不频繁,那么a b c
可能不会频繁(取决于阈值)a b
和b c
都通过了阈值,但a b c
没有通过,你会怎么做;更高的得分bigram是否会被导出hl0ma9xz7#
关于重复的 #3367 ,@chaturv3di 问道:
实现这个优化过的 [prefers-higher-scoring-bigram] 版本的 analyze_sentence() 是否有价值?
[更新] PS:最终是否可以为这个提交一个 PR?
如果替代行为不会花费太多额外成本,并且其优越性有很强的理由,那么欢迎提交 PR。(正如我在之前的评论中提到的,这似乎从直觉上来说是一个更好的策略。)
如果成本是显而易见的——或者确定保留与原始行为的兼容性(来自 Google 论文和
word2vec.c
发布,这些是该功能模型的基础)很重要——那么我们可能希望包括一个选项来保留旧的行为。