2016-05-12 13 views
0

Ich bin sehr neu in Python und NLTK. Es gibt mir perfektes ErgebnisNltk Satz Tokenizer gibt AttributeError

Als ich

tokenized = custom_sent_tokenizer.tokenize("some long text") 

tun: Ein Thema ist verwirrend mich. Aber wenn ich auf eine Variable diese hart codierte Zeichenfolge ändere großen Text enthält, es gibt mir den Fehler in Subjekt nämlich erwähnt:

tokenized = custom_sent_tokenizer.tokenize(text) 
... 
AttributeError: 'list' object has no attribute 'abbrev_types' 

unten mein voller Code:

from __future__ import division 
import urllib.request 
import csv 
import nltk 
from string import punctuation 
from nltk.corpus import stopwords 
from nltk.tokenize import PunktSentenceTokenizer 

comments = open("CNPS_Comments.txt").read() 
comments_list = comments.split('\n') 

custom_sent_tokenizer = PunktSentenceTokenizer(comments_list[:300]) 
##tokenized = custom_sent_tokenizer.tokenize("some long text") 
text="" 
for comment in comments_list: 
    text += comment 

tokenized = custom_sent_tokenizer.tokenize(text) 
def process_content(): 
    try: 
    for i in tokenized[:5]: 
     words = nltk.word_tokenize(i) 
     tagged = nltk.pos_tag(words) 
     print(tagged) 

except Exception as e: 
    print(str(e)) 


process_content() 

ich mit Python begann heute und es könnte viele Dinge geben, die ich hier nicht effektiv mache.

+0

für einen Kommentar in comments_list: text + = Kommentar das sieht schlecht aus, weil ich das 'comments' -Objekt selbst anstelle von 'text' hätte verwenden können. Aber ich habe es auch versucht und es hat nicht funktioniert. – Rohit

+0

Dieser Code konvertiert eine Liste in eine einzelne Zeichenfolge. Es gibt bessere Wege, aber Sie irren sich, dass es nicht gebraucht wird. – alexis

Antwort

3

Die Zeile, die Ihnen Probleme bereitet, ist korrekt: So soll der Satz-Tokenizer verwendet werden, mit einer einzigen Zeichenfolge als Argument. Sie erhalten einen Fehler, weil Sie ein Monster erstellt haben :-)

Der Punkt-Satz-Tokenizer basiert auf einem unbeaufsichtigten Algorithmus: Sie geben ihm einen langen Text und er findet heraus, wo die Satzgrenzen liegen müssen. Aber Sie haben Ihren Tokenizer mit einer Liste von Sätzen trainiert (die ersten 300 Elemente in comments_list), was falsch ist. Irgendwie merkt der Tokenizer das nicht und gibt Ihnen etwas, was beim Versuch, es richtig zu benutzen, fehlschlägt.

Um das Problem zu beheben, trainieren Sie Ihren Tokenizer mit einer einzigen Zeichenfolge. Sie können eine Liste von Strings am besten so verbinden:

tokenizer = PunktSentenceTokenizer(" ".join(comments_list[:300])) 

PS. Sie müssen sich irren, dass es erfolgreich funktioniert, als Sie eine Literal-Zeichenfolge in Token umgewandelt haben. Natürlich gab es andere Unterschiede zwischen dem Code, der funktionierte, und dem Code in Ihrer Frage.

+0

Großartig! Sieht so aus, als ob es jetzt funktioniert. Das Problem besteht darin, den Tokenizer mit einer Liste von Sätzen zu trainieren. Irgendein Grund, warum das falsch ist - ich nahm an, dass ich es mit 300 verschiedenen Kommentaren trainierte. – Rohit

+0

Weil es ein unbeaufsichtigter Algorithmus ist. Sie geben keine vorseparierten Sätze, also genügt ein einziger Text. (Wenn deine Kommentare jeweils mehrere Sätze enthalten könnten und du fragst, warum du nicht mit mehreren Texten trainieren kannst: weil niemand sich darum gekümmert hat, es zu implementieren.) – alexis