2016-05-17 64 views
7

我是新來的Python和NLP的世界。谷歌的Syntaxnet最近宣佈對我感興趣。但是我有一個周圍很多麻煩了解文檔的兩個syntaxnet和相關工具(NLTK等)SyntaxNet創建樹根到動詞

我的目標:給定的輸入如「威爾伯把球踢」我想提取根動詞(踢)和它與「球」有關的物體。

我偶然發現「spacy.io」和this visualization似乎封裝了我想要實現的內容:POS標記一個字符串,並將其加載到某種樹結構中,以便我可以從根動詞開始並遍歷句子。

我玩過syntaxnet/demo.sh,並在this thread中建議註釋掉最後幾行以獲得conll輸出。

然後我在Python腳本加載此輸入(kludged在一起我自己,可能不是正確的):

import nltk 
from nltk.corpus import ConllCorpusReader 
columntypes = ['ignore', 'words', 'ignore', 'ignore', 'pos'] 
corp = ConllCorpusReader('/Users/dgourlay/development/nlp','input.conll', columntypes) 

我知道我有機會獲得corp.tagged_words(),但言語之間沒有任何關係。現在我卡住了!我如何將這個語料庫加載到樹型結構中?

任何幫助非常感謝!

+0

對我來說,你似乎錯過了解析部分。一旦你佔據了你的數據,即標記原始文本,POS標籤並將其轉換爲conll格式,你需要將它傳遞給解析器(SyntaxNet)。然後,您可以在解析器輸出中執行任何類型的提取操作。 – Riyaz

回答

2

你要做的是找到一個依賴關係,即dobj。我還不熟悉SyntaxNet/Parsey,告訴你如何從輸出中提取依賴關係,但我相信answer可能會對你有所幫助。簡而言之,您可以將Parsey配置爲使用ConLL語法進行輸出,將其解析爲任何您容易遍歷的內容,然後查找ROOT依賴關係以查找動詞和* obj依賴關係以查找其對象。

+1

謝謝。我想我被卡住的部分是解析ConLL輸出。正如你在上面的例子中看到的,我已經使用ConllCorpusReader加載了它,但我無法弄清楚如何將它作爲來自根動詞的樹來遍歷。 –

3

這可能是更好的評論,但我還沒有所需的聲譽。

我之前沒有使用過ConllCorpusreader(你會考慮上傳你正在加載的文件並提供一個鏈接嗎?測試會容易得多),但是我寫了一篇博客文章,可能有助於樹解析方面:here

尤其是,您可能想要分塊每個句子。 Chapter 7 of the NLTK book對此有一些更多的信息,但是這是從我的博客的例子:

# This grammar is described in the paper by S. N. Kim, 
# T. Baldwin, and M.-Y. Kan. 
# Evaluating n-gram based evaluation metrics for automatic 
# keyphrase extraction. 
# Technical report, University of Melbourne, Melbourne 2010. 
grammar = r""" 
NBAR: 
    # Nouns and Adjectives, terminated with Nouns 
    {<NN.*|JJ>*<NN.*>} 

NP: 
    {<NBAR>} 
    # Above, connected with in/of/etc... 
    {<NBAR><IN><NBAR>} 
""" 

chunker = nltk.RegexpParser(grammar) 
tree = chunker.parse(postoks) 

注意:您也可以使用一個上下文無關文法(覆蓋Chapter 8)。

每個分塊(或分析)的句子(或在本例中是名詞短語,根據上面的語法)將是一個子樹。要訪問這些子樹,我們可以使用這個功能:

def leaves(tree): 
    """Finds NP (nounphrase) leaf nodes of a chunk tree.""" 
    for subtree in tree.subtrees(filter = lambda t: t.node=='NP'): 
    yield subtree.leaves() 

每個產生的對象將是一個字 - 標籤對列表。從那裏你可以找到動詞。

接下來,你可以玩上面的語法或解析器。動詞分裂名詞短語(見this diagram in Chapter 7),所以你可能只需在VBD之後訪問第一個NP

對不起,解決方案不是特定於您的問題,但希望這是一個有益的起點。如果您上傳文件,我會再拍攝一次:)

0

如果使用任何解析器解析了conll格式的原始文本,則可以按照以下步驟遍歷您所在節點的依賴項興趣:

  1. 構建來自輸出conll句子鄰接矩陣
  2. 找你有興趣(在你的情況動詞)和鄰接矩陣提取其家屬的節點(索引)
  3. 爲每個依賴項在conll格式的第8列中查找它的依賴標籤。

PS:我可以提供代碼,但如果您自己編寫代碼會更好。