2012-01-14 68 views
3

在Python中,我正在编写一个自然语言处理模块,并且无法解决如何编写函数以执行以下操作。 输入:从输入的句子中得到的词性列表(POS)作为短字符串。列表中的一些项目是自己的列表,因为该程序的该部分不知道从两个或更多个可能中选择哪一个词类。 例如在["DET", "NOUN", ["VERB", "NOUN"], "CONJ", ["ADJ", "ADV", "NOUN"], "ADV"] 即第一个字一个特定的六个字句子结果绝对是一个DET 第二个字绝对是一个名词 第3个字可以是动词或名词 的第4个字绝对是一个CONJ 的第5个字可能是一个ADJ,ADV或NOUN 第6个字绝对是ADV。树遍历还是什么?

所以INPUT = ["DET", "NOUN", ["VERB", "NOUN"], "CONJ", ["ADJ", "ADV", "NOUN"], "ADV"]

我需要的函数返回每个可能的组合列表的列表。所以上面的返回值应该是:

[["DET", "NOUN", "NOUN", "CONJ", "NOUN", "ADV"], 
["DET", "NOUN", "NOUN", "CONJ", "ADV", "ADV"], 
["DET", "NOUN", "NOUN", "CONJ", "ADJ", "ADV"], 
["DET", "NOUN", "VERB", "CONJ", "NOUN", "ADV"], 
["DET", "NOUN", "VERB", "CONJ", "ADV", "ADV"], 
["DET", "NOUN", "VERB", "CONJ", "ADJ", "ADV"]] 

这些句子可能是从1到n个单词长。每个单词可能会从1到n个词性回来。

+2

你试过了什么?你在用什么库?你可以粘贴一些代码,即使不工作? – 2012-01-14 20:12:06

回答

8

你应该看看itertools module和相关的食谱。看起来你想考虑所有可能的POS分配的笛卡尔乘积。这可以很容易地完成,尽管将INPUT的所有元素都作为列表比较方便,即使它们只是一个列表。无论如何:

>>> import itertools 
>>> 
>>> INPUT = ["DET", "NOUN", ["VERB", "NOUN"], "CONJ", ["ADJ", "ADV", "NOUN"], "ADV"] 
>>> 
>>> I = [[kind] if type(kind) != list else kind for kind in INPUT] 
>>> I 
[['DET'], ['NOUN'], ['VERB', 'NOUN'], ['CONJ'], ['ADJ', 'ADV', 'NOUN'], ['ADV']] 

所以这些是我们想要选择的可能性。这是什么itertools.product用于:

>>> possible_assignments = list(itertools.product(*I)) 
>>> possible_assignments 
[('DET', 'NOUN', 'VERB', 'CONJ', 'ADJ', 'ADV'), ('DET', 'NOUN', 'VERB', 'CONJ', 'ADV', 'ADV'), ('DET', 'NOUN', 'VERB', 'CONJ', 'NOUN', 'ADV'), ('DET', 'NOUN', 'NOUN', 'CONJ', 'ADJ', 'ADV'), ('DET', 'NOUN', 'NOUN', 'CONJ', 'ADV', 'ADV'), ('DET', 'NOUN', 'NOUN', 'CONJ', 'NOUN', 'ADV')] 

如果我明白你是你想要的。那么,他们是元组,而不是列表,但这不重要。


+0

哇!这很好,帝斯曼。我会仔细查看并立即尝试。 – 2012-01-14 20:27:27