2016-04-13 6 views

答えて

7

この文書は、文書内に利用可能なthrough the tokensというツリーがあります。

はあなたがツリーのルートを検索したいでしょう、あなただけの文書かかわらず行くことができます:

def find_root(docu): 
    for token in docu: 
     if token.head is token: 
      return token 

、ツリーをナビゲートするには、トークンはthrough the children

+2

文書には1文あたり1つの根があります –

+0

ルートを見つけるためにトークンを反復する必要はありません。あなたは文の '.root'プロパティにアクセスできます。私はこれを示す自分の答えを投稿します。 –

4

私も必要を取得する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) 
+0

私はちょうどregexのようなパターンのツリー(またはノードを見つける)と同様に印刷するためのモジュールを追加しました。興味があれば、 https://github.com/krzysiekfonal/grammaregex これはまだインストール可能ではありませんが、今週は完了し、pipで入手可能です。 – Krzysiek

32

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 
+2

しかし私の意見では、Spacyからの依存関係とポストバックを保持することが重要です。 – Krzysiek

+0

いい仕事です! 2つのノード間に依存関係タグを追加する簡単な方法はありますか? –

+2

@DavidBatista私の編集を参照してください。ツリーに他のものを追加したい場合は 'tok_format(tok)'を編集してください。また、ドキュメントを読む必要があります。 Spacyは2つの異なるPOS表現 'tok.pos_'と' tok.tag_'を使います。 https://spacy.io/docs/#token-postags –

24

ツリー自体はオブジェクトではありません。あなたはトークン間の関係を通してそれをナビゲートするだけです。だからこそ、文書がツリーをナビゲートすることについて話しているが、それを「取得」しているわけではない。

まずは、Docオブジェクトを取得するには、いくつかのテキストを解析してみましょう:

>>> import spacy 
>>> nlp = spacy.load('en') 
>>> doc = nlp('First, I wrote some sentences. Then spaCy parsed them. Hooray!') 

docSequenceTokenのオブジェクトです:

>>> 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で遊ぶことをお勧めします。

-2

私はパーズについてまだ十分な知識がありません。しかし、私の文献調査の結果は、spaCyがシフト・リデンス依存解析アルゴリズムを持っていることを知っています。これにより、質問/文が解析され、解析ツリーが生成されます。これを視覚化するには、DisplaCy(CSSとJavascriptの組み合わせ)をPythonとCythonで使用できます。 さらに、SpaCyライブラリを使用して解析し、Natural Language Toolkit(NLTK)をインポートできます。これが役に立ちますようにお願いします。

関連する問題