我想得到符号(单词的字母)的二元模型。例如,对于单词"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()
我期望得到['Go', 'od', 'ha', 'py']
的输出,但是输出中没有任何内容。我做错了什么?
谢谢。
发布于 2019-04-29 01:29:46
Gensim的Phrases
类使用基于相对计数的简单统计分析&一些可调的阈值来决定应该将某些标记对(通常是单词对而不是字符对)提升为单个连接的二元语法。潜在的配对会被赋予一个“分数”,那些分数超过可配置的“阈值”的配对将被合并。
即使在其正常的领域中使用,单词,其结果往往不会令人印象深刻的人类评价-遗漏了许多我们认为合乎逻辑的组合,使其他组合,我们将不同的分组。但是,由于有大量的训练数据,并对其参数进行了一些调整,即使其不完美的组合也可能有助于下游模型表现得更好。
对于您的小玩具语料库,根据类的默认值,您希望看到的字符二元语法是不合格的。
您可以在以下位置查看用于评分潜在配对的默认original_scorer()
代码:
您可以在您的模型上为您预期的配对之一运行此代码,以查看其得分:
>>> 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
与10.0
的默认bigram.threshold
相比,这个'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']]
因此,使用bigram.threshold=4.0
,您想要的'p_y'
仍然不在那里-因为考虑到'p'
和'y'
的数量,它需要更低的threshold
。
https://stackoverflow.com/questions/55892073
复制相似问题