首页 > 解决方案 > 如何仅生成二元/三元语料库

问题描述

Gensim 有没有办法在单词列表中严格生成二元组、三元组?

我可以成功生成一元、二元、三元,但我只想提取二元、三元。

例如,在下面的列表中:

words = [['the', 'mayor', 'of', 'new', 'york', 'was', 'there'],["i","love","new","york"],["new","york","is","great"]]

我用

bigram = gensim.models.Phrases(words, min_count=1, threshold=1)
bigram_mod = gensim.models.phrases.Phraser(bigram)
words_bigram = [bigram_mod[doc] for doc in words]

这将创建一个 unigrams 和 bigrams 列表,如下所示:

[['the', 'mayor', 'of', 'new_york', 'was', 'there'],
 ['i', 'love', 'new_york'],
 ['new_york', 'is', 'great']]

我的问题是,有没有办法(除了正则表达式)来严格提取二元组,所以在这个例子中只有“new_york”会是结果?

标签: pythonnlpgensim

解决方案


Phrases它不是 gensim功能的内置选项。

如果我们可以假设您的原始 unigrams 中没有一个'_'字符,那么仅选择带有 a 的标记的步骤'_'不应该太昂贵(并且不需要完整的正则表达式)。例如,您的最后一行可能是:

words_bigram = [ [token for token in bigram_mod[doc] if '_' in token] for doc in words ]

(如果由于某种原因你的一元组中有下划线,你可以改变加入字符,并且你不希望那些与 - 组合的二元组混淆Phrases。)

如果这些都不够好,您可能会查看 gensim 中的代码,该代码实际上得分并将 unigrams 组合成 bigrams ......

https://github.com/RaRe-Technologies/gensim/blob/fbc7d0952f1461fb5de3f6423318ae33d87524e3/gensim/models/phrases.py#L300

...并使用您额外需要的选项扩展该模块,或者在您自己的代码中模仿其在类之外的行为。


推荐阅读