2011-09-16 25 views
19

通過NLTK書籍,不清楚如何從給定句子生成依賴樹。如何在NLTK中進行依賴分析?

本書的相關部分:sub-chapter on dependency grammar給出了example figure,但它沒有顯示如何解析句子來提出這些關係 - 或者我錯過了NLP中的一些基礎知識?

編輯: 我想類似什麼stanford parser做一些事情: 給出一句「我在我睡覺拍攝大象」,它應該返回類似:

nsubj(shot-2, I-1) 
det(elephant-4, an-3) 
dobj(shot-2, elephant-4) 
prep(shot-2, in-5) 
poss(sleep-7, my-6) 
pobj(in-5, sleep-7) 
+0

可以檢查[本示例](http://www.nltk.org/book/ch08.html#fig-depgraph0)。 NLTK不支持依賴類型。 – eph

回答

6

我想你可以使用基於語料庫的依賴關係解析器而不是NLTK提供的基於語法的依賴關係解析器。

對Python中的少量文本進行基於語料庫的依賴性解析並不是理想的性能方式。所以在NLTK中,他們確實提供了wrapperMaltParser,這是一個基於語料庫的依賴關係解析器。

您可能會發現有關RDF representation of sentences相關的其他問題。

1

從Stanford Parser文檔:「依賴關係可以使用我們的軟件在詞法結構樹上使用解析器包中提供的EnglishGrammaticalStructure類獲得。」 http://nlp.stanford.edu/software/stanford-dependencies.shtml

依賴關係手冊還提到:「或者我們的轉換工具可以將其他選區解析器的 輸出轉換爲Stanford Dependencies表示。」 http://nlp.stanford.edu/software/dependencies_manual.pdf

目前,NLTK似乎沒有實現任何功能。

3

如果你想認真對待依賴解析,不要使用NLTK,所有的算法都是過時的,而且速度慢。試試這樣的:https://spacy.io/

+1

404對我來說 - 必須非常快,並且放大出 – JasTonAChair

+0

轉移到https://spacy.io/,但我不確定它是否包含更高級的...? – CpILL

56

我們可以使用來自NLTK的斯坦福分析器。

首先,從here下載stanford核心nlp工具。然後,提取您喜歡的任何地方的zip文件。

接下來,加載模型,並用它NLTK

from nltk.parse.stanford import StanfordDependencyParser 
path_to_jar = 'path_to/stanford-parser-full-2014-08-27/stanford-parser.jar' 
path_to_models_jar = 'path_to/stanford-parser-full-2014-08-27/stanford-parser-3.4.1-models.jar' 
dependency_parser = StanfordDependencyParser(path_to_jar=path_to_jar, path_to_models_jar=path_to_models_jar) 

result = dependency_parser.raw_parse('I shot an elephant in my sleep') 
dep = result.next() 
list(dep.triples()) 

最後一行的輸出是:

[((u'shot', u'VBD'), u'nsubj', (u'I', u'PRP')), 
((u'shot', u'VBD'), u'dobj', (u'elephant', u'NN')), 
((u'elephant', u'NN'), u'det', (u'an', u'DT')), 
((u'shot', u'VBD'), u'prep', (u'in', u'IN')), 
((u'in', u'IN'), u'pobj', (u'sleep', u'NN')), 
((u'sleep', u'NN'), u'poss', (u'my', u'PRP$'))] 

我想這是你想要的。

+0

應該接受的答案,對我有用,謝謝ywat – JasTonAChair

+2

如果你正在使用Python 3,使用result .__ next __()而不是result.next() – Dinesh

+0

listiterater上的next()會拋出一個錯誤,安裝'graphviz'解決probelm – Bhashithe

2

如果你需要更好的表現,那麼spacy(https://spacy.io/)是最好的選擇。用法很簡單:

import spacy 

nlp = spacy.load('en') 
sents = nlp(u'A woman is walking through the door.') 

你會得到一個依賴關係樹作爲輸出,你可以挖掘出非常容易每次你需要的信息。您也可以定義您自己的自定義管道。查看更多他們的網站。

https://spacy.io/docs/usage/

+1

@Aleksander Jovanovic,我簡單地試了一下,準確性很差。 – craned

相關問題