我想获取符号(单词字母)的双字母。例如,对于单词“ 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']
,但输出中没有任何内容。
我究竟做错了什么?
谢谢。
答案 0 :(得分:1)
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
与bigram.threshold
的默认10.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']]
因此,对于bigram.threshold=4.0
,您所需的'p_y'
仍然不存在-因为给定threshold
和{{1 }}。