2012-01-14 71 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