web-dev-qa-db-ja.com

NLTKで依存関係の解析を行うにはどうすればよいですか?

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)
32
MrD

NLTKのStanford Parserを使用できます。

必要条件

Webサイトから2つのものをダウンロードする必要があります。

  1. Stanford CoreNLPパーサー
  2. 言語モデル ご希望の言語(例 英語言語モデル

警告!

言語モデルのバージョンがStanford CoreNLPパーサーのバージョンと一致していることを確認してください!

2018年5月22日現在のCoreNLPバージョンは3.9.1です。

2つのファイルをダウンロードしたら、Zipファイルを好きな場所に解凍します。

Pythonコード

次に、モデルを読み込み、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$'))]

これがあなたの望むものだと思います。

78
ywat

より良いパフォーマンスが必要な場合は、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/

NLTKが提供する文法ベースの代わりに、コーパスベースの依存関係パーサーを使用できると思います。

Python=で少量のテキストでもコーパスベースの依存関係解析を行うことは、パフォーマンス面では理想的ではありません。NLTKでは、 wrapper to- MaltParser 、コーパスベースの依存関係パーサー。

RDF文の表現 関連するこの他の質問を見つけるかもしれません。

7
Neodawn

依存解析について真剣に考えたい場合は、NLTKを使用しないでください。すべてのアルゴリズムは古く、遅いです。次のようなものを試してください: https://spacy.io/

3
CpILL

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:接続の確立に失敗しました

2
dontloo

スタンフォードパーサーのドキュメントから:「依存関係は、パーサーパッケージで使用可能なEnglishGrammaticalStructureクラスを使用して、フレーズ構造ツリーのソフトウェア[...]を使用して取得できます。」 http://nlp.stanford.edu/software/stanford-dependencies.shtml

依存関係マニュアルには、「または、変換ツールで他のConstituencyパーサーの出力をStanford Dependencies表現に変換できる」とも記載されています。 http://nlp.stanford.edu/software/dependencies_manual.pdf

現在、どちらの機能もNLTKに実装されていないようです。

1
Josep Valls

パーティーに少し遅れましたが、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)

お役に立てば幸いです!

0
cheevahagadog