2016-08-05 11 views
2

Ich verwende Random Forest, um eine Stimmung auf eine Zeichenfolge anzuwenden. Also im Grunde nach der Reinigung der Bewertungen, die im Wesentlichen bedeutet, dass Stoppwörter (nltk.corpus -> stopwords von wo ich Wörter wie nicht entfernen, nicht, noch, gewann, wasn, weren) entfernt werden, sowie Nicht-Buchstaben-Zeichen, und alles wird gestellt ist kleingeschrieben. Die CountVectorizer mit den Argumenten (analyzer = "word", tokenizer = None, preprocessor = None, ngram_range=(1, 3), stop_words = None, max_features = 5500) bildet das Vokabular und fügt es zu einem numpy Array hinzu. Ich benutze auch 100 Bäume.Random Forest-Handle Negation

Nach dem Teilen der Daten mit test_size = .1 wird der Klassifikator trainiert, angepasst und bewertet.

score = forest.score(X_test, y_test): 0,882180882181

Konfusionsmatrix, ohne Normalisierung:

[[2256 503] 
[ 519 5269]] 

Normalized Konfusionsmatrix:

[[ 0.82 0.18] 
[ 0.09 0.91]] 

ROC-Kurve zeigt Random (RF) und Random mit Lineare Regression (RF + LR):

enter image description here

enter image description here

Das Problem ist also, dass, obwohl die Ergebnisse sehr gut aussehen wir falsch Ergebnisse zu erhalten, zum Beispiel:

"Der Film ist nicht gut" ->negativ

"Der Film ist nicht schlecht" ->negativ

"Die Musik und die Bilder sind nicht gut" ->positive

"Der Film keinen Sinn" -> positive

So die oben genannten sind nur einige Die problematischen Fälle, aber Sie können eine allgemeine Vorstellung davon bekommen, was das Problem ist, dem ich momentan gegenüber stehe (selbst mit einem 3-Gramm kann der Klassifikator die Negation nicht richtig vorhersagen). Ich dachte, dass es auch das Training sein könnte, da es nicht genug Fälle von Negation gibt, damit es nicht gelernt werden kann.

Hätten Sie Vorschläge, was verbessert oder geändert werden könnte, damit die Negation richtig klassifiziert wird?

Antwort

2

Ich glaube, diese Frage eignet sich besser für den Cross Validated Stack Exchange, aber jedenfalls.

Es gibt mehrere Dinge, die Ihre Ergebnisse verbessern könnten:

  1. Für Sentiment-Analyse es sich nicht richtig anfühlt Negation Stoppwörter wie ‚Nein‘ zu entfernen, ‚nicht‘, usw. da sie völlig ändern die positive/negative Stimmung des Satzes bei der Konstruktion der N-Gramme. In Ihren Beispielen, "nicht schlecht", "sind nicht gut", etc. würde in "schlecht", "gut" usw. umgewandelt werden

  2. Wenn Sie der Meinung sind, dass die negative Klasse in Ihrem Trainingssatz unterrepräsentiert ist, können Sie sie durch Unterschätzung der positiven Klasse ausgleichen.

  3. Anstatt predict direkt zu verwenden, verwenden Sie predict_proba und versuchen Sie, verschiedene Wahrscheinlichkeitsschwellenwerte für die Trennung von positiven und negativen Beispielen einzustellen.

  4. Versuchen Sie eine Boosting-Methode wie AdaBoost oder Gradienten Boosted Trees, die besser zum Lernen von Ausnahmen geeignet sind. Zum Beispiel, um zu lernen, dass ein Satz mit dem Wort "schlecht" im Allgemeinen negativ ist, aber wenn "nicht schlecht" auch vorhanden ist, ist es positiv.