首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >Gensim短语找不到一些二元语法

Gensim短语找不到一些二元语法
EN

Stack Overflow用户
提问于 2019-04-29 00:04:50
回答 1查看 1.8K关注 0票数 0

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

我试着用gensim.Phrases写,但对我不起作用。

下面是我的代码:

代码语言:javascript
复制
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']的输出,但是输出中没有任何内容。我做错了什么?

谢谢。

EN

回答 1

Stack Overflow用户

发布于 2019-04-29 01:29:46

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

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

对于您的小玩具语料库,根据类的默认值,您希望看到的字符二元语法是不合格的。

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

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

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

代码语言:javascript
复制
>>> 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的其他参数)进行修补,以获得不同的结果,但最好的值/折衷将取决于您的最终目标。例如:

代码语言:javascript
复制
>>> 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

票数 6
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/55892073

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档