Я делаю анализ настроений с использованием 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
даже когда классификатор обучен должным образом?
, где вы с помощью 'featureset'? Наверное, только опечатка, потому что вместо featurized_doc, не так ли? И не могли бы вы объяснить, почему предыдущий метод не работал, а отрицательное значение имеет большее влияние и как я могу проверить вероятность журнала? – Arkham
И не могли бы вы объяснить мне, что делает строка 'featureet = {c: True для c в Example_Text.split()}'? – Arkham
1. Я действительно имел в виду 'featurized_doc', я обновляю свой пост, чтобы это отразить. 2. 'classifier.prob_classify' вместо' classifier.classify' даст вам вероятности журнала каждой метки – akornilo