2016-04-25 4 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])) 

Der Ausgang:NLTK - Entfernen Sie Tags aus Parsed Chunks

(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'.', '.') 

I verwiesen aus: How can I remove POS tags before slashes in nltk?

ich Eigennamen gruppieren wollen und die Tags entfernen, aber wenn ich verwendet, um die Lösung es Effekte der ganze Text und danach ist meine Brockenanalyse weg. Ich habe wirklich versucht, die Baumstruktur zu verstehen, aber wie kann ich die Entfernungsfunktion für die Aussage anwenden. Ich möchte, dass meine Ausgabe wie:

Meine gewünschte Ausgabe:

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

Auch kann ich nicht mit utf-8 umgehen, wie Sie meine Ausgabe sehen von Nicht-ASCII-Zeichen voll ist. Wie kann ich damit umgehen?

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]) 

ich gefunden, was shoul i in den Code schreiben, aber jetzt habe ich folgende Fehlermeldung. Ich denke, ich kann keine Interpunktionen auf meinem Array anhängen.

['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

Versuch 'text = u" 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. " – alvas

+0

Ich habe Angst, dass es nicht funktioniert hat. BTW können Sie mir bitte mit meiner redigierten Frage helfen? –

+1

Was ist Ihre gewünschte Ausgabe? Sie geben eine Zeichenfolge aus und lesen die Zeichenfolge in Tree zurück. Ich denke, wenn wir wissen, was die Ausgabe ist, können Sie das Tree-Objekt direkt manipulieren, um es zu bekommen. – alvas

Antwort

2

Es ist noch ineffizienter als Sie erkennen. Sie erzeugen einen Syntaxbaum, indem Sie ihn in eine Zeichenfolge umwandeln, ihn wie mehrere Bäume umhüllen (was nicht der Fall ist) und dann die eingepackte Zeichenkette in einen Baum zurückverwandeln. Sobald Sie den Syntaxbaum result haben, stoppen Sie und entfernen Sie einfach die POS-Tags.

Ein Nltk-Baum ist eine Art Liste, also iterieren Sie einfach über die Zweige Ihres Baums und entfernen Sie das POS-Tag aus den Blatentupeln. Um das gewünschte Format zu erhalten, müssen Sie auch ein Maß an Umwickeln Wörter hinzuzufügen, die nicht NPs:

... 
>>> 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

Ich frage mich, wie viel Zeit Sie gehört haben, "wie ein Charme gearbeitet!". Das will ich genau. Ich sollte mehr arbeiten um die Struktur zu verstehen Danke @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]) 

ist nicht effizient, sondern gibt meine gewünschte Ausgabe.