2016-05-03 2 views
2

Я делаю анализ настроений с использованием NLTK с помощью встроенных корпусов movie_reviews для обучения и каждый раз, когда я получаю neg.NLTK Классификатор, дающий только отрицательный ответ в анализе настроений

Мой код:

import nltk 
import random 
import pickle 
from nltk.corpus import movie_reviews 
from os.path import exists 
from nltk.classify import apply_features 
from nltk.tokenize import word_tokenize, sent_tokenize 

documents = [(list(movie_reviews.words(fileid)), category) 
      for category in movie_reviews.categories() 
      for fileid in movie_reviews.fileids(category)] 

all_words = [] 
for w in movie_reviews.words(): 
    all_words.append(w.lower()) 
all_words = nltk.FreqDist(all_words) 
word_features = list(all_words.keys()) 
print(word_features) 

def find_features(document): 
    words = set(document) 
    features = {} 
    for w in word_features: 
     features[w] = (w in words) 
    return features 

featuresets = [(find_features(rev), category) for (rev, category) in documents] 
numtrain = int(len(documents) * 90/100) 
training_set = apply_features(find_features, documents[:numtrain]) 
testing_set = apply_features(find_features, documents[numtrain:]) 

classifier = nltk.NaiveBayesClassifier.train(training_set) 
classifier.show_most_informative_features(15) 

Example_Text = " avoids annual conveys vocal thematic doubts fascination slip avoids outstanding thematic astounding seamless" 

doc = word_tokenize(Example_Text.lower()) 
featurized_doc = {i:(i in doc) for i in word_features} 
tagged_label = classifier.classify(featurized_doc) 
print(tagged_label) 

Здесь я использую NaiveBayes Classifier, где я готовлю данные с movie_reviews корпусов, а затем использовать этот обученный классификатор, чтобы проверить чувства моего Example_test.

Теперь, когда вы можете видеть мой Example_Text, у него есть случайные слова. Когда я делаю classifier.show_most_informative_features(15), он дает мне список из 15 слов, который имеет наибольшее отношение либо к положительному, либо к отрицательному. Я выбрал положительные слова, показанные в этом списке.

Most Informative Features 
        avoids = True    pos : neg =  12.1 : 1.0 
       insulting = True    neg : pos =  10.8 : 1.0 
       atrocious = True    neg : pos =  10.6 : 1.0 
      outstanding = True    pos : neg =  10.2 : 1.0 
       seamless = True    pos : neg =  10.1 : 1.0 
       thematic = True    pos : neg =  10.1 : 1.0 
       astounding = True    pos : neg =  10.1 : 1.0 
        3000 = True    neg : pos =  9.9 : 1.0 
        hudson = True    neg : pos =  9.9 : 1.0 
       ludicrous = True    neg : pos =  9.8 : 1.0 
        dread = True    pos : neg =  9.5 : 1.0 
        vocal = True    pos : neg =  9.5 : 1.0 
       conveys = True    pos : neg =  9.5 : 1.0 
        annual = True    pos : neg =  9.5 : 1.0 
        slip = True    pos : neg =  9.5 : 1.0 

Так почему я не получаю pos как результат, почему это, что всегда я получаю neg даже когда классификатор обучен должным образом?

ответ

2

Проблема в том, что вы включаете все слова в качестве функций, а функции формы «word: False» создают много дополнительного шума, который заглушает эти положительные черты. Я посмотрел на две логарифмические вероятности, и они довольно похожи: -812 vs -808. В этой проблеме обычно уместно использовать только слова: функции True Style, потому что все остальные будут только добавлять шум.

Я скопировал свой код, но изменил последние три строк следующим образом:

featurized_doc = {c:True for c in Example_Text.split()} 
tagged_label = classifier.classify(featurized_doc) 
print(tagged_label) 

и получил выход «позы»

+0

, где вы с помощью 'featureset'? Наверное, только опечатка, потому что вместо featurized_doc, не так ли? И не могли бы вы объяснить, почему предыдущий метод не работал, а отрицательное значение имеет большее влияние и как я могу проверить вероятность журнала? – Arkham

+0

И не могли бы вы объяснить мне, что делает строка 'featureet = {c: True для c в Example_Text.split()}'? – Arkham

+0

1. Я действительно имел в виду 'featurized_doc', я обновляю свой пост, чтобы это отразить. 2. 'classifier.prob_classify' вместо' classifier.classify' даст вам вероятности журнала каждой метки – akornilo

Смежные вопросы