私はspaCyで依存関係ツリーを取得する方法を見つけようとしていましたが、ツリーを取得する方法については何も見つかりません。how to navigate the treeにしかありません。spaCyを使って依存関係ツリーを取得するには?
答えて
この文書は、文書内に利用可能なthrough the tokensというツリーがあります。
はあなたがツリーのルートを検索したいでしょう、あなただけの文書かかわらず行くことができます:
def find_root(docu):
for token in docu:
if token.head is token:
return token
、ツリーをナビゲートするには、トークンはthrough the children
私も必要を取得するAPIを持っていますその完全なコードの下にそれを行うには:
import sys
def showTree(sent):
def __showTree(token):
sys.stdout.write("{")
[__showTree(t) for t in token.lefts]
sys.stdout.write("%s->%s(%s)" % (token,token.dep_,token.tag_))
[__showTree(t) for t in token.rights]
sys.stdout.write("}")
return __showTree(sent.root)
をそして、あなたは、端末のための間隔たい場合:
def showTree(sent):
def __showTree(token, level):
tab = "\t" * level
sys.stdout.write("\n%s{" % (tab))
[__showTree(t, level+1) for t in token.lefts]
sys.stdout.write("\n%s\t%s [%s] (%s)" % (tab,token,token.dep_,token.tag_))
[__showTree(t, level+1) for t in token.rights]
sys.stdout.write("\n%s}" % (tab))
return __showTree(sent.root, 1)
私はちょうどregexのようなパターンのツリー(またはノードを見つける)と同様に印刷するためのモジュールを追加しました。興味があれば、 https://github.com/krzysiekfonal/grammaregex これはまだインストール可能ではありませんが、今週は完了し、pipで入手可能です。 – Krzysiek
spacyによって生成された依存関係ツリーを簡単に表示したい場合は、nltk.tree.Tree
に変換してnltk.tree.Tree.pretty_print
メソッドを使用します。次に例を示します。
import spacy
from nltk import Tree
en_nlp = spacy.load('en')
doc = en_nlp("The quick brown fox jumps over the lazy dog.")
def to_nltk_tree(node):
if node.n_lefts + node.n_rights > 0:
return Tree(node.orth_, [to_nltk_tree(child) for child in node.children])
else:
return node.orth_
[to_nltk_tree(sent.root).pretty_print() for sent in doc.sents]
出力:
jumps
________________|____________
| | | | | over
| | | | | |
| | | | | dog
| | | | | ___|____
The quick brown fox . the lazy
編集:あなたがこれを行うことができ、トークンの表現を変更するための:
になりdef tok_format(tok):
return "_".join([tok.orth_, tok.tag_])
def to_nltk_tree(node):
if node.n_lefts + node.n_rights > 0:
return Tree(tok_format(node), [to_nltk_tree(child) for child in node.children])
else:
return tok_format(node)
:
jumps_VBZ
__________________________|___________________
| | | | | over_IN
| | | | | |
| | | | | dog_NN
| | | | | _______|_______
The_DT quick_JJ brown_JJ fox_NN ._. the_DT lazy_JJ
しかし私の意見では、Spacyからの依存関係とポストバックを保持することが重要です。 – Krzysiek
いい仕事です! 2つのノード間に依存関係タグを追加する簡単な方法はありますか? –
@DavidBatista私の編集を参照してください。ツリーに他のものを追加したい場合は 'tok_format(tok)'を編集してください。また、ドキュメントを読む必要があります。 Spacyは2つの異なるPOS表現 'tok.pos_'と' tok.tag_'を使います。 https://spacy.io/docs/#token-postags –
ツリー自体はオブジェクトではありません。あなたはトークン間の関係を通してそれをナビゲートするだけです。だからこそ、文書がツリーをナビゲートすることについて話しているが、それを「取得」しているわけではない。
まずは、Doc
オブジェクトを取得するには、いくつかのテキストを解析してみましょう:
>>> import spacy
>>> nlp = spacy.load('en')
>>> doc = nlp('First, I wrote some sentences. Then spaCy parsed them. Hooray!')
>>> doc[0]
First
>>> doc[1]
,
>>> doc[2]
I
>>> doc[3]
wrote
しかし、それは単一のルートトークンを持っていません。私たちは3つの文からなるテキストを解析したので、3つの異なるツリーがあり、それぞれに独自のルートがあります。それぞれの文の根から解析を開始したい場合は、最初に文を別個のオブジェクトとして取得することができます。幸い、doc
は.sents
プロパティを経由して私たちにこれらを公開:
>>> sentences = list(doc.sents)
>>> for sentence in sentences:
... print(sentence)
...
First, I wrote some sentences.
Then spaCy parsed them.
Hooray!
これらの文章のそれぞれが、そのルートトークンを指す.root
プロパティとSpan
です。(これは、このような動詞のない文章など、異常な文構造のために真ではないかもしれないが)通常、ルートトークンは、文の主動詞になります。
>>> for sentence in sentences:
... print(sentence.root)
...
wrote
parsed
Hooray
たルートトークンで、我々はダウンナビゲートすることができますツリーは各トークンの.children
プロパティを介して例えば、最初の文で動詞の主語と目的語を見つけよう。各子トークンの.dep_
プロパティdescribes its relationship with its parent;例えば、dep_
が'nsubj'
の場合、トークンはその親のという公称サブジェクトであることを意味します。
>>> root_token = sentences[0].root
>>> for child in root_token.children:
... if child.dep_ == 'nsubj':
... subj = child
... if child.dep_ == 'dobj':
... obj = child
...
>>> subj
I
>>> obj
sentences
我々は、同様に、これらのトークンの子の1つ表示することによって、ツリーを下に続けることができます:上記のプロパティとこのように
>>> list(obj.children)
[some]
を、あなたは、ツリー全体をナビゲートすることができます。構造を理解するのに役立つ例文の依存関係ツリーを視覚化したい場合は、displaCyで遊ぶことをお勧めします。
私はパーズについてまだ十分な知識がありません。しかし、私の文献調査の結果は、spaCyがシフト・リデンス依存解析アルゴリズムを持っていることを知っています。これにより、質問/文が解析され、解析ツリーが生成されます。これを視覚化するには、DisplaCy(CSSとJavascriptの組み合わせ)をPythonとCythonで使用できます。 さらに、SpaCyライブラリを使用して解析し、Natural Language Toolkit(NLTK)をインポートできます。これが役に立ちますようにお願いします。
- 1. 依存関係ツリーを取得するには?
- 2. 別の依存関係の依存関係を取得するには?
- 3. Mavenの依存関係ツリーとPOMの依存関係
- 4. Maven - 依存関係を使ってビルド
- 5. std :: sortを使って依存関係ツリーを並べ替える
- 6. ノード:依存関係ライセンスを取得
- 7. Nuget依存関係 - Linux上でNuGetのpackage.config依存関係ツリーを表示するには
- 8. Pythonパッケージの依存関係ツリー
- 9. COM DLLの依存関係ツリー
- 10. maven依存関係に関する集約情報を取得
- 11. jarファイルの親依存関係を取得するには?
- 12. gradle依存関係から.AARファイルを取得するには?
- 13. Enzymeで依存関係コンポーネントを取得するには?
- 14. 依存関係ツリーの制御ロジック - 循環依存関係の検索
- 15. Jar依存関係の取得方法
- 16. 依存関係の取得方法Java
- 17. Jenkins Pipeline Plugin - 依存関係の取得
- 18. Maven 3プラグインで依存関係ツリーを取得する方法は?あなたは依存関係ツリーを取得するには、このようなものを使用することができますMavenの2モジョで
- 19. gradleによって生成された依存関係ツリーを読む方法
- 20. Mavenの依存関係:コピーの依存関係 - javadocとソースの取得
- 21. スタックを取得して依存関係を保存する方法は?
- 22. qmakeを使って依存関係のライブラリをコンパイルする
- 23. configureスクリプトを使って依存関係をチェックする方法
- 24. pysparkからRDD依存関係を取得する方法は?
- 25. 依存関係注入を使ってポストシャープからログ依存関係を解決する方法
- 26. maven依存関係についての情報を取得
- 27. コンフィグレーションなしでプログラマブルに依存関係を取得する
- 28. 依存関係の依存関係
- 29. 依存関係のプロパティ依存関係
- 30. 依存関係ツリーを作成する方法
文書には1文あたり1つの根があります –
ルートを見つけるためにトークンを反復する必要はありません。あなたは文の '.root'プロパティにアクセスできます。私はこれを示す自分の答えを投稿します。 –