NLTKの本を読んで、特定の文から依存関係ツリーを生成する方法は明確ではありません。
本の関連セクション: 従属文法のサブチャプター は 例図 を与えるが、それらの関係を思い付くために文を解析する方法を示していない-または多分私はNLPの基本的な何かを見逃していますか?
EDIT:スタンフォードパーサー の機能に似たものが欲しい:「睡眠中に象を撃った」 、次のようなものが返されます:
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)
NLTKのStanford Parserを使用できます。
Webサイトから2つのものをダウンロードする必要があります。
言語モデルのバージョンがStanford CoreNLPパーサーのバージョンと一致していることを確認してください!
2018年5月22日現在のCoreNLPバージョンは3.9.1です。
2つのファイルをダウンロードしたら、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$'))]
これがあなたの望むものだと思います。
より良いパフォーマンスが必要な場合は、spacy( https://spacy.io/ )が最適です。使い方はとても簡単です:
import spacy
nlp = spacy.load('en')
sents = nlp(u'A woman is walking through the door.')
出力として依存関係ツリーを取得し、必要なすべての情報を非常に簡単に掘り下げることができます。独自のカスタムパイプラインを定義することもできます。ウェブサイトで詳細をご覧ください。
NLTKが提供する文法ベースの代わりに、コーパスベースの依存関係パーサーを使用できると思います。
Python=で少量のテキストでもコーパスベースの依存関係解析を行うことは、パフォーマンス面では理想的ではありません。NLTKでは、 wrapper to- MaltParser 、コーパスベースの依存関係パーサー。
RDF文の表現 関連するこの他の質問を見つけるかもしれません。
依存解析について真剣に考えたい場合は、NLTKを使用しないでください。すべてのアルゴリズムは古く、遅いです。次のようなものを試してください: https://spacy.io/
NLTKのStanford Parserを使用するには
1)localhostでCoreNLPサーバーを実行
ダウンロード Stanford CoreNLPこちら (お使いの言語のモデルファイルも)。サーバーは、次のコマンドを実行して起動できます(詳細 here )
# Run the server using all jars in the current directory (e.g., the CoreNLP home directory)
Java -mx4g -cp "*" edu.stanford.nlp.pipeline.StanfordCoreNLPServer -port 9000 -timeout 15000
またはNLTK APIによって(CORENLP_HOME
環境変数が最初)
os.environ["CORENLP_HOME"] = "dir"
client = corenlp.CoreNLPClient()
# do something
client.stop()
2)NLTKから依存関係パーサーを呼び出します
>>> from nltk.parse.corenlp import CoreNLPDependencyParser
>>> dep_parser = CoreNLPDependencyParser(url='http://localhost:9000')
>>> parse, = dep_parser.raw_parse(
... 'The quick brown fox jumps over the lazy dog.'
... )
>>> print(parse.to_conll(4))
The DT 4 det
quick JJ 4 amod
brown JJ 4 amod
fox NN 5 nsubj
jumps VBZ 0 ROOT
over IN 9 case
the DT 9 det
lazy JJ 9 amod
dog NN 5 nmod
. . 5 punct
詳細を参照してください ここにドキュメント 、またこの質問 NLTK CoreNLPDependencyParser:接続の確立に失敗しました 。
スタンフォードパーサーのドキュメントから:「依存関係は、パーサーパッケージで使用可能なEnglishGrammaticalStructureクラスを使用して、フレーズ構造ツリーのソフトウェア[...]を使用して取得できます。」 http://nlp.stanford.edu/software/stanford-dependencies.shtml
依存関係マニュアルには、「または、変換ツールで他のConstituencyパーサーの出力をStanford Dependencies表現に変換できる」とも記載されています。 http://nlp.stanford.edu/software/dependencies_manual.pdf
現在、どちらの機能もNLTKに実装されていないようです。
パーティーに少し遅れましたが、SpaCyで目的の出力を取得するサンプルコードを追加したかったのです。
import spacy
nlp = spacy.load("en_core_web_sm")
doc = nlp("I shot an elephant in my sleep")
for token in doc:
print("{2}({3}-{6}, {0}-{5})".format(token.text, token.tag_, token.dep_, token.head.text, token.head.tag_, token.i+1, token.head.i+1))
そして、これはあなたが望む出力に非常に似た出力です:
nsubj(shot-2, I-1)
ROOT(shot-2, shot-2)
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)
お役に立てば幸いです!