Gensim 短语找不到一些二元组

0 python phrase gensim

我想获得符号(单词字母)的二元组。例如,对于单词“done”和“dog”,我希望能够找到双字词“do”。

我尝试使用 gensim.Phrases 来做到这一点,但它对我不起作用。

这是我的代码:

from gensim.models import Phrases

documents = ["God", "Good","happy","hangry","pypi"]
documents_proc = [list(doc) for doc in documents]

bigram = Phrases(documents_proc, min_count=1)
trigram = Phrases(bigram[documents_proc], min_count=1)

for sent in documents_proc:
    print(sent, bigram[sent])
    bigrams_ = [b for b in bigram[sent] if b.count('_') == 1]
    trigrams_ = [t for t in trigram[bigram[sent]] if t.count('_') == 2]
    print(bigrams_)
    print(trigrams_)
    print()
Run Code Online (Sandbox Code Playgroud)

我期望输出['Go', 'od', 'ha', 'py'],但输出 中没有任何内容。我究竟做错了什么?

谢谢你。

goj*_*omo 5

Gensim 的Phrases类使用基于相对计数和一些可调阈值的简单统计分析来决定一些标记对(通常是单词对而不是字符对)应该提升为单个连接的二元组。潜在配对被赋予一个“分数”,那些得分超过可配置“阈值”的将被合并。

即使在其正常领域中使用单词,其结果对于人类评估而言通常也不会令人印象深刻——缺少许多我们认为合乎逻辑的组合,使我们对其他组合进行不同的分组。但是,有了大量的训练数据,并对其参数进行了一些调整,即使其不完美的组合也可能有助于下游模型表现得更好。

对于您的小型玩具语料库,您希望看到的字符二元组不符合条件,基于类默认值。

您可以在以下位置查看对original_scorer()潜在配对进行评分的默认代码:

https://github.com/RaRe-Technologies/gensim/blob/460dc1cb9921817f71b40b412e11a6d413926472/gensim/models/phrases.py#L663

您可以在您的模型上为您预期的配对之一运行此代码,以查看其分数:

>>> from gensim.models.phrases import original_scorer
>>> original_scorer(bigram.vocab[b'G'], bigram.vocab[b'o'], 
                    bigram.vocab[b'G_o'], len(bigram.vocab), 
                    bigram.min_count, bigram.corpus_word_count)
4.666666666666666
Run Code Online (Sandbox Code Playgroud)

相比默认bigram.threshold10.0,这个'G_o'二元不会获得晋级。

您可以修改 的threshold(或其他参数Phrases)以获得不同的结果,但最佳的值/权衡取决于您的最终目标。例如:

>>> bigram.threshold = 4.0
>>> list(bigram.export_phrases(documents_proc, out_delimiter=b''))
[(b'Go', 4.666666666666666),
 (b'Go', 4.666666666666666),
 (b'od', 4.666666666666666),
 (b'ha', 7.0),
 (b'ha', 7.0)]
>>> list(bigram[documents_proc])
[['G_o', 'd'],
 ['G_o', 'o_d'],
 ['h_a', 'p', 'p', 'y'],
 ['h_a', 'n', 'g', 'r', 'y'],
 ['p', 'y', 'p', 'i']]
Run Code Online (Sandbox Code Playgroud)

因此,对于bigram.threshold=4.0,您想要'p_y'的仍然不存在 - 因为threshold考虑到'p'和的计数,它需要更低'y'