2016-10-04 13 views
0

RegexpParserの結果だけでなく、結果のインデックスも取得したいと考えています。 たとえば、単語の開始インデックスと単語の終了インデックス。あなたはパーサトークン化テキストを与えるのでnltk.RegexpParserの結果のインデックスを取得する方法は?

import nltk 
from nltk import word_tokenize, pos_tag 
text = word_tokenize("6 ACCESSKEY attribute can be used to specify many 6.0 shortcut key 6.0") 
tag = pos_tag(text) 

print tag 

# grammar = "NP: {<DT>?<JJ>*<NN|NNS|NNP|NNPS>}" 
grammar2 = """Triple: {<CD>*<DT>?<CD>*<JJ>*<CD>*<VBD|VBG>*<CD>*<NN.*>+<CD>*<MD>*<VB.*>+<JJ>?<RB>?<CD>*<DT>?<NN.*>*<IN*|TO*>?<DT>?<CD>*<JJ>*<CD>*<VBD|VBG>*<CD>*<NN.*>+<CD>*} 
       Triple: {<CD>*<DT>?<CD>*<JJ>*<CD>*<VBD|VBG>*<CD>*<NN.*>+<CD>*<MD>*<VB.*>+<JJ>?<RB>?<CD>*<DT>?<NN.*>*<TO>?<VB><DT>?<CD>*<JJ>*<CD>*<VBD|VBG>*<CD>*<NN.*>+<CD>*} 
       """ 

grammar = """ 
       NP: {<CD>*<DT>?<CD>*<JJ>*<CD>*<VBD|VBG>*<CD>*<NN.*>+<CD>*} 
       VP: {<VB.*>+<JJ>*<RB>*<JJ>*<VB.*>?<DT>?<NN|NP>?<IN*|TO*>?} 
       """ 
cp = nltk.RegexpParser(grammar) 
result = cp.parse(tag) 
print(result) 

result.draw() 

答えて

0

は、それが本来のオフセットを(それがどのようにトークンの間であったどのくらいのスペースを知っている可能性)を推測することができます方法はありません。 しかし、幸いなことに、parse()メソッドは追加情報を受け入れ、単に出力に渡されます。あなたは

[('6', 'CD', 0, 1), 
('ACCESSKEY', 'NNP', 2, 11), 
('attribute', 'NN', 12, 21), 
... 

に変更し、これを供給するために管理する場合

[('6', 'CD'), 
('ACCESSKEY', 'NNP'), 
('attribute', 'NN'), 
... 

:あなたの例では、入力は(あなたが悪いという名前の変数tagでそれを保存した)このようになります

パーサーに設定すると、オフセットは解析ツリーに含まれます:

Tree('S', 
    [Tree('NP', [('6', 'CD', 0, 1), 
        ('ACCESSKEY', 'NNP', 2, 11), 
        ('attribute', 'NN', 12, 21)]), 
     ... 

どのようにd oタグ付きシーケンスへのオフセットを取得しますか? さて、私はこれをあなたにプログラミングの練習として残します。 ヒント:tokenisersという単語のspan_tokenize()メソッドを探します。

+0

なぜあなたはとてもスマートで、 –

+0

実際に私はオフセットを得ることができます、それほど難しいことではありません。いずれにせよ大変ありがとうございます! –

関連する問題