2017-02-26 2 views
0

Ich brauche Sentiment Analyse für eine Liste von Tweets in niederländischer Sprache gemacht und ich verwende conll2002 für die gleiche. Hier ist der Code, den ich verwende:Sentiment Analyse für niederländische Tweets mit NLTK Corpus confl2002

import nltk.classify.util 
from nltk.classify import NaiveBayesClassifier 
from nltk.corpus import conll2002 
import time 

t=time.time() 

def word_feats(words): 
    return dict([(word, True) for word in words]) 

#negids = conll2002.fileids('neg') 
def train(): 
    #negids = conll2002.fileids('neg') 
    #posids = conll2002.fileids('pos') 
    negids = conll2002.fileids() 
    posids = conll2002.fileids() 

    negfeats = [(word_feats(conll2002.words(fileids=[f])), 'neg') for f in negids] 
    posfeats = [(word_feats(conll2002.words(fileids=[f])), 'pos') for f in posids] 

    negcutoff = len(negfeats)*3/4 
    poscutoff = len(posfeats)*3/4 

    trainfeats = negfeats[:negcutoff] + posfeats[:poscutoff] 
    testfeats = negfeats[negcutoff:] + posfeats[poscutoff:] 
    print 'train on %d instances, test on %d instances' % (len(trainfeats), len(testfeats)) 

    classifier = NaiveBayesClassifier.train(trainfeats) 
    print 'accuracy:', nltk.classify.util.accuracy(classifier, testfeats) 
    classifier.show_most_informative_features() 
x=train() 
print x 
print time.time()-t 

Die obige Code funktioniert, aber mit der Ausgabe wie folgt:

train on 8 instances, test on 4 instances 
accuracy: 0.5 
Most Informative Features 
       poderlas = True    pos : neg =  1.0 : 1.0 
        voert = True    pos : neg =  1.0 : 1.0 
      contundencia = True    pos : neg =  1.0 : 1.0 
      encuestocracia = None    pos : neg =  1.0 : 1.0 
       alivien = None    pos : neg =  1.0 : 1.0 
        Bogotá = True    pos : neg =  1.0 : 1.0 
      Especialidades = True    pos : neg =  1.0 : 1.0 
     hoofdredacteurs = True    pos : neg =  1.0 : 1.0 
       quisieron = True    pos : neg =  1.0 : 1.0 
       asciendan = None    pos : neg =  1.0 : 1.0 
None 
9.21083234 

Die pos: neg Verhältnis kommt 1 heraus: 1 für alle Fälle . Wie kann ich das beheben? Ich dachte, das Problem in den folgenden Aussagen sein könnte, die ich zur Zeit im Code Kommentar gesetzt haben:

negids = conll2002.fileids('neg') 
posids = conll2002.fileids('pos') 

Der Fehler, dass ich, wenn ich die beiden oben genannten Aussagen nicht kommentieren Sie ist:

Traceback (most recent call last): 
    File "naive1.py", line 31, in <module> 
    x=train() 
    File "naive1.py", line 13, in train 
    negids = conll2002.fileids('neg') 
TypeError: fileids() takes exactly 1 argument (2 given) 

Ich habe versucht, mit Selbst, um dieses Problem zu beheben, aber es funktioniert immer noch nicht. Kann mir bitte jemand in die richtige Richtung zeigen? Danke im Voraus.

Antwort

0

Die fileids() Methode akzeptiert ein categories Argument, aber nur in kategorisierten Korpora. Zum Beispiel:

>>> from nltk.corpus import brown 
>>> brown.fileids("mystery") 
['cl01', 'cl02', 'cl03', 'cl04', 'cl05', 'cl06', 'cl07', 'cl08', 'cl09', 
'cl10', 'cl11', 'cl12', 'cl13', 'cl14', 'cl15', 'cl16', 'cl17', 'cl18', 
'cl19', 'cl20', 'cl21', 'cl22', 'cl23', 'cl24'] 

Ihre Aufrufe schlagen fehl, weil die CONLL-Korpora keine Kategorien haben. Und das, weil sie nicht für die Stimmung kommentiert sind: sowohl CONLL 2000 als auch CONLL 2002 sind Chunked Corpora (NP/PP bzw. benannte Entitäten).

>>> conll2002.categories() 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
AttributeError: 'ConllChunkCorpusReader' object has no attribute 'categories' 

So die kurze Antwort auf Ihre Frage ist, können Sie nicht ein Gefühl Analysator auf dem conll2002 corpus trainieren.

+0

Danke, dass Sie darauf hingewiesen haben. Können Sie eine andere Möglichkeit vorschlagen, eine Sentimentanalyse für Tweets in niederländischer Sprache durchzuführen? Sollte ich Neural Network für das gleiche versuchen, indem ich eine Liste positiver Tweets und negativer Tweets habe, die als "gut" und "schlecht" klassifiziert sind, und dann das Modell darauf trainiere? Bitte schlagen Sie eine Alternative vor. –

+0

Ich verstehe deine Frage nicht. Wenn Sie einen Sentiment-Korpus für Niederländisch haben (wie Sie zu sagen scheinen), können Sie ihn einfach dazu verwenden, einen 'NaivenBayesClassifier' zu trainieren, wie im Buch gezeigt. Wenn Sie kein Sentiment Corpus haben, wie wird ein anderer _supervised_ Algorithmus Ihnen helfen? – alexis

+0

Im Moment habe ich eine Liste von 500 Texterklärungen in Niederländisch und ihre entsprechenden Bewertungen basierend auf ihren Gefühlen. Zum Beispiel hat ein positiver Tweet ein% Alter um 90 und ein negativer Tweet ein% Alter um 50. Kann ich das als Trainingsdatensatz für mein künstliches neurales Netzwerkmodell verwenden und trainieren, um den Sentiment Score für andere Tweets vorherzusagen? Deine Hilfe wird geschätzt. –

Verwandte Themen