2016-04-25 18 views
0
#!/usr/bin/env python 
# -*- coding: utf-8 -*- 
import os 
import nltk 
import re 

from nltk.tree import * 
from nltk.chunk.util import tagstr2tree 
from nltk import word_tokenize, pos_tag 

text = "Yarın, Mehmet ile birlikte Ankara'da ki Nüfus Müdürlüğü'ne, Aziz 
Yıldırım ile birlikte, Şükrü Saraçoğlu Stadı'na gideceğiz.".decode("utf-8") 

tagged_text = pos_tag(word_tokenize(text)) 
tagged_text2 = word_tokenize(text) 

grammar = "NP:{<NNP>+}" 

cp = nltk.RegexpParser(grammar) 
result = cp.parse(tagged_text) 

for tree in result: 
    print(tree) 

wrapped = "(ROOT "+ str(result) + ")" # Add a "root" node at the top 
trees = nltk.Tree.fromstring(wrapped, read_leaf=lambda x: x.split("/")[0]) 

for tree in trees: 
    print(tree.leaves()) 

for tree2 in result: 
    print(nltk.Tree.fromstring(str(tree2), read_leaf=lambda x: x.split("/")[0])) 

出力:私はから参照NLTKは - 解析されたチャンクからタグを削除

(NP Yar\u0131n/NNP) 
(u',', ',') 
(NP Mehmet/NNP) 
(u'ile', 'NN') 
(u'birlikte', 'NN') 
(NP Ankara'da/NNP ki/NNP Nufus/NNP Mudurlugu'ne/NNP) 
(u',', ',') 
(NP Aziz/NNP Y\u0131ld\u0131r\u0131m/NNP) 
(u'ile', 'NN') 
(u'birlikte', 'NN') 
(u',', ',') 
(NP Sukru/NNP Saracoglu/NNP Stad\u0131'na/NNP) 
(u'gidece\u011fiz', 'NN') 
(u'.', '.') 


['Yar\\u0131n', ',', 'Mehmet', 'ile', 'birlikte', "Ankara'da", 'ki', 'Nufus', "Mudurlugu'ne", ',', 'Aziz', 'Y\\u0131ld\\u0131r\\u0131m', 'ile', 'birlikte', ',', 'Sukru', 'Saracoglu', "Stad\\u0131'na", 'gidecegiz', '.'] 


(NP Yar\u0131n) 
(u',', ',') 
(NP Mehmet) 
(u'ile', 'NN') 
(u'birlikte', 'NN') 
(NP Ankara'da ki Nufus Mudurlugu'ne) 
(u',', ',') 
(NP Aziz Y\u0131ld\u0131r\u0131m) 
(u'ile', 'NN') 
(u'birlikte', 'NN') 
(u',', ',') 
(NP Sukru Saracoglu Stad\u0131'na) 
(u'gidece\u011fiz', 'NN') 
(u'.', '.') 

:私は固有名詞をグループ化し、タグを削除したいHow can I remove POS tags before slashes in nltk?

しかし、私は解決策を使用するときに効果テキスト全体とその後、私の塊の解析はなくなっています。私は実際にツリー構造を理解しようとしましたが、for文の中で削除関数をどのように適用できますか?

マイ所望の出力:あなたは私の出力は、非ASCII文字がいっぱいです見るよう

[Yar\u0131n] 
[,] 
[Mehmet] 
[ile] 
[birlikte] 
[Ankara'da ki Nufus Mudurlugu'ne] 
... 
... 

また、私はUTF-8を扱うことができない私のような私の出力が欲しいです。どうすればそれに対処できますか?

EDIT:

for i in range(len(tree)): 
    arr.append(nltk.Tree.fromstring(str(tree[i]), read_leaf=lambda x: x.split("/")[0]).leaves()) 
    print(arr[i]) 

私は、私は、コードで何を書くshoulが、今、私は次のエラーを持っていました。私は私の配列に句読点を付けることはできないと思う。

['Yar\\u0131n'] 
Traceback (most recent call last): 
    File "./chunk2.py", line 61, in <module> 
    arr.append(nltk.Tree.fromstring(str(tree[i]), read_leaf=lambda x: x.split("/")[0]).leaves()) 
    File "/usr/local/lib/python2.7/dist-packages/nltk/tree.py", line 630, in fromstring 
    cls._parse_error(s, match, open_b) 
    File "/usr/local/lib/python2.7/dist-packages/nltk/tree.py", line 675, in _parse_error 
    raise ValueError(msg) 
ValueError: Tree.read(): expected u'(' but got ',' 
      at index 0. 
       "," 
       ^
+1

試し 'テキスト= U"Yarın、メフメットのILEのbirlikte Ankara'da KINüfusMüdürlüğü'ne、アジズ :ご希望の形式を取得するには、あなたはまた、NPのない単語をラップアラウンドのレベルを追加する必要があります" – alvas

+0

私はそれがうまくいかないことを恐れています。 Btwあなたは私の編集された質問で私を助けてくれる? –

+1

希望する出力は何ですか?文字列に出力し、文字列をTreeに読み戻しています。私は出力が何であるか知っていれば、それを得るためにTreeオブジェクトを直接操作できます。 – alvas

答えて

2

これは、あなたが実現するよりもはるかに非効率的です。パースツリーを生成して文字列に変換し、それを複数のツリーのようにラップします(そうでない場合)。ラップされた文字列を解析してツリーに戻します。解析ツリーresultを取得したらすぐに停止し、POSタグを削除してください。

nltkツリーは一種のリストなので、ツリーのブランチを繰り返して、リーフタプルからPOSタグを削除してください。

... 
>>> result = cp.parse(tagged_text) 
>>> terms = [] 
>>> for e in result: 
    if isinstance(e, tuple): 
     terms.append([ e[0] ]) 
    else: 
     terms.append([w for w, t in e]) 
>>> pprint.pprint(terms) 
[['Yarın'], 
[','], 
['Mehmet'], 
['ile'], 
['birlikte'], 
["Ankara'da", 'ki', 'Nüfus', "Müdürlüğü'ne"], 
[','], 
['Aziz', 'Yıldırım'], 
... 
+0

あなたは "魅力的なように働いた"と聞いて何回知ったのだろうか?これはちょうど私が欲しい。私は構造を理解するために多くの作業を置く必要がありますありがとう@alexis –

0
for i in range(len(tree)): 
    try: 
     arr.append(nltk.Tree.fromstring(str(tree[i]), read_leaf=lambda x: x.split("/")[0]).leaves()) 
     print(arr[i]) 
    except ValueError: 
     arr.append(tree[i]) 
     print(arr[i]) 

効率的ではありませんが、私の所望の出力を提供します。

関連する問題