如何在python nltk中消除三元组中重复的双字母组合

时间:2018-04-11 16:24:38

标签: python nltk

我在不同的文件中生成了双字母,三元组。

现在我有如下的bigrams。

high cpu
power supply
nexus 7000
..

现在我有三卦如下。

high cpu due
power supply failure
.. 

对于少数短语,有可能只产生双字母并且三元组可能没有多大意义。但是对于像"high cpu due"这样的短语来说,三卦比双胞胎更有意义。

所以我想消除已经存在于三卦中的重复的双字母并且仅保留三卦中不存在的双字母。我尝试使用下面的代码,它发现了三元组中存在的双字母组,但如果没有发现它没有给回到二元组。

terms=['ios zone','ios zone firewall']
phrases = [
    z for z in terms if z not in [x for x in terms for y in terms if x in y and x != y]
]
print (phrases)

这会返回['ios', 'zone', 'firewall'] 但如果没有匹配则应返回bigrams

2 个答案:

答案 0 :(得分:2)

IIUC,你只想保留任何三卦中没有包含的双字母。一种方法是检查子串匹配:

bigrams = [
    "high cpu",
    "power supply",
    "nexus 7000"
]

trigrams = [
    "high cpu due",
    "power supply failure"
]

new_bigrams = [b for b in bigrams if all(b not in t for t in trigrams)]
print(new_bigrams)
#['nexus 7000']

我们使用列表推导构建new_bigrams,如果它们不包含在任何三元组中,则只会添加双字符串。如果bigram是任何三元组的子字符串,则all(b not in t for t in trigrams)返回False

答案 1 :(得分:0)

要添加@pault答案。

运行查找程序时,您会以字符串列表的形式获得三字母组/二字母组。

要使@pault技术起作用,您必须加入这些列表,例如:

bigrams = finder.nbest(bigram_measures.pmi, 200)
trigrams = tfinder.nbest(trigram_measures.pmi, 200)
trigrams= [" ".join(t) for t in trigrams]
bigrams= [" ".join(b) for b in bigrams]

最后,@ pault答案:

bigrams= [b for b in bigrams if all(b not in t for t in trigrams)]