遍历树结构,是什么意思?

3
在Python中,我正在编写一个自然语言处理模块,但不知道如何编写以下函数。输入:从输入句子中派生的词性(POS)列表,作为短字符串。 列表中的某些项本身是列表,因为该程序部分不知道在两个或多个可能性中选择哪个词性。例如,特定的六个单词的句子结果为["DET", "NOUN", ["VERB", "NOUN"], "CONJ", ["ADJ", "ADV", "NOUN"], "ADV"]。 即第一个单词绝对是DET,第二个单词绝对是NOUN,第三个单词可以是VERB或NOUN,第四个单词绝对是CONJ,第五个单词可以是ADJ,ADV或NOUN,第六个单词绝对是ADV。
因此,输入为["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"]]

这些句子可能由一个到n个单词组成。每个单词可能有一个到n个词性。

1个回答

8
你应该查看itertools模块和相关的技巧。看起来你想考虑所有可能的POS分配的笛卡尔积。这可以很容易地完成,尽管将输入的所有元素都作为列表进行处理会更方便,即使它们只是一个元素的列表也是如此。无论如何:
>>> 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')]

如果我理解正确,您需要的是元组,而不是列表,但这应该没关系。



网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接