gensim 短语贪婪检测结合了1st,不需要最高得分的重叠二元/多重词组,

juud5qan  于 4个月前  发布在  其他
关注(0)|答案(7)|浏览(64)

描述

请参考下面的内容,但最常见的短语没有被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

mlmc2os5

mlmc2os51#

感谢@init-random提供的报告,在gensim的最新版本中成功复现了你的问题。

ghg1uchk

ghg1uchk2#

IMO Phrases 需要进行适当的重写(既为了性能,也为了清理逻辑和API)。这也与Bounter优化有关。

vxqlmq5t

vxqlmq5t3#

短语检测是"贪婪"的;如果一个标记被文本中较早出现的满足当前阈值的短语消耗,那么它将无法用于后续的短语,即使后面的短语更强大(即使在更严格的阈值下也能找到)。据我所知,Google的word2vec.c发布版本中的短语检测,我相信这激发了这段代码的行为方式也是如此。

btxsgosb

btxsgosb4#

@gojomo 谢谢你的解释。是的,的确如此。

>> cat in.txt 
i went to toys r us
we are at babies r us
where is babies r us
do you mean toys r us
>> ./word2phrase -train in.txt -output phrases.txt -threshold 1 -min-count 1
>> cat phrases.txt 
 i went to toys_r us
 we are at babies_r us
 where is babies_r us
 do you mean toys_r us

我使用这个假设的基本前提是它正在查看一个滑动窗口的bigrams,如图5.1中Chris Manning书中所述。此外,在bounter bigram count示例中,它也使用了滑动窗口。
似乎贪婪的方法可能是一个工程/优化决策?考虑到word2phrase针对数十亿个单词,这很可能是一个情况。
如果这是一个功能,也许可以考虑有一个选项来计算/考虑所有的bigrams会更好?

lndjwyie

lndjwyie5#

选择更强的搭配似乎是一个更好的策略。前瞻开销不应该太大,尽管你可以想象/构思在单个短语提升发生之前,整个文本的所有搭配都需要被评分的情况。(例如:每个搭配都超过了阈值,但每个都比前一个略强一些,一直到文本的末尾。)

我想知道在这种情况下,是否可以立即检查迭代提升到更长的短语,也许通过合并/扁平化的频率字典来实现,而不是当前模型中完全不同的迭代过程。(也就是说,如果 a b c d e 变成 a b c d e ,那么立即检查潜在的短语化( c , d_e )的可能性,从相同的频率信息开始——而不是在其他使用单独频率字典的传递中进行。在这种情况下( c , d_e )有机会超越( b , c ),而它没有机会在两个独立的分层传递中做到这一点。)

iovurdzv

iovurdzv6#

我不明白为什么你不能,但我能想到几个问题:

  • 最大ngram大小是否是超参数
  • 在后续迭代中,阈值通常会降低。如果在单次遍历中完成,阈值是否会是ngram大小的函数,例如,如果T是bigram的阈值,那么trigram的阈值可能是0.67 * T
  • 是否需要存储所有1-到最大n-grams;我想象基于它们的“子ngrams”的计数可以优化更大的ngrams的存储,例如,如果a b频繁但b c不频繁,那么a b c可能不会频繁(取决于阈值)
  • 如果a bb c都通过了阈值,但a b c没有通过,你会怎么做;更高的得分bigram是否会被导出
hl0ma9xz

hl0ma9xz7#

关于重复的 #3367 ,@chaturv3di 问道:
实现这个优化过的 [prefers-higher-scoring-bigram] 版本的 analyze_sentence() 是否有价值?
[更新] PS:最终是否可以为这个提交一个 PR?
如果替代行为不会花费太多额外成本,并且其优越性有很强的理由,那么欢迎提交 PR。(正如我在之前的评论中提到的,这似乎从直觉上来说是一个更好的策略。)
如果成本是显而易见的——或者确定保留与原始行为的兼容性(来自 Google 论文和 word2vec.c 发布,这些是该功能模型的基础)很重要——那么我们可能希望包括一个选项来保留旧的行为。

相关问题