2013-10-16 54 views
5

我想寫一個程序,將採取兩個句子,並檢查它們是否相似。我不想使用一個完整的解析器,並使用我認爲最常遇到的簡單語法創建一個語法分析器。現在,我的興趣在於句子中的名詞短語。檢查標記爲名詞短語的子樹是否相等將很容易。我想添加更多內容,並讓用戶決定是否接受缺失/不匹配的判定(部分匹配)。比較兩個相似的,不相同的NLTK樹

輸出樹的形式是(S(NP The/DT bag/NN)is/VBZ(JP blue/JJ)),其中我定義了語法名詞短語(NP)和形容詞短語(JP)

着手匹配,我已經考慮了幾個途徑:

  • 以刪除相關樹確定節點,然後比較
  • 所有確定的節點的值更改爲一個共同的價值,例如,X
  • 以製作所有葉節點的列表,除了標記爲'D T」

我是新來的Python和我在這裏面臨着一些問題:

  • 如果我寫一個遞歸函數,直到它到達葉與確定遍歷名詞短語樹,我無法修改原始樹中的值,因爲它只傳遞值。

  • 我發現的關於nltk樹的唯一刪除函數是一個需要相對於樹根刪除節點的確切索引的格式,例如[0,0]格式,如果它是根節點最左邊的孩子的最左邊的孩子。這很棘手,因爲它最有可能涉及與樹的高度一起增長的整數列表,對於每個節點

  • 我創建了列表列表,其中每個列表具有來自一個名詞短語的所有葉子排除確定者,並對這些進行比較。

所以,我的問題是,

如何刪除從NLTK樹中的節點,而不在形式首先獲得它的指數[0,0,1,0,...]?

如何修改一個葉子值,同樣沒有使用索引?(我想用遞歸函數,只要函數打葉我想修改,我想修改它)

如果這些是不可能的,我怎樣才能獲得葉子的索引?我很困惑。 Ntk樹具有樹形函數,但是這隻適用於子樹。與其他節點相比,Python認爲葉子是不同的類型嗎?因爲樹木不適合我的葉子。這可能是因爲我的葉子是元組而不僅僅是字符串,但我不知道如何改變它,因爲這是pos tagger的輸出。那麼有什麼方法可以替換我的葉子,這是一個[DT /]形式的元組與形式(DT)的子樹?再次定義遞歸過程不會修改原始樹。

任何建議/意見?

回答

3

好的,讓我們逐個解決您的問題。

tree = Tree.parse("(S (NP The/DT bag/NN) is/VBZ (JP blue/JJ))") 

刪除節點:

tree.remove(Tree('JP', ['blue/JJ']))

tree.remove('is/VBZ')

修改的值。你可以通過獲取樹的成員的指數做到這一點(請記住,它繼承列表):

tree.index('is/VBZ')

但同樣,這不是一個好辦法。

遍歷樹葉的最佳方法是獲取葉子tree.leaves(),然後獲取tree.leaf_treeposition(index)的索引,並使用它們來修改/刪除樹葉。

相關問題