Как предсказать настроения после обучения и тестирования модели с помощью NLTK NaiveBayesClassifier в Python? - PullRequest
0 голосов
/ 21 ноября 2019

Я делаю классификацию настроений, используя NLTK NaiveBayesClassifier. Я тренировался и тестировал модель с помеченными данными. Теперь я хочу предсказать настроение данных, которые не помечены. Однако я сталкиваюсь с ошибкой. Строка с ошибкой:

score_1 = analyzer.evaluate(list(zip(new_data['Articles'])))

Ошибка:

ValueError: недостаточно значений для распаковки (ожидается 2, получено 1)

Ниже приведен код:

import random
import pandas as pd
data = pd.read_csv("label data for testing .csv", header=0)
sentiment_data = list(zip(data['Articles'], data['Sentiment']))
random.shuffle(sentiment_data)
new_data = pd.read_csv("Japan Data.csv", header=0)
train_x, train_y = zip(*sentiment_data[:350])
test_x, test_y = zip(*sentiment_data[350:])

from unidecode import unidecode
from nltk import word_tokenize
from nltk.classify import NaiveBayesClassifier
from nltk.sentiment import SentimentAnalyzer
from nltk.sentiment.util import extract_unigram_feats

TRAINING_COUNT = 350


def clean_text(text):
    text = text.replace("<br />", " ")

    return text


analyzer = SentimentAnalyzer()
vocabulary = analyzer.all_words([(word_tokenize(unidecode(clean_text(instance))))
                                 for instance in train_x[:TRAINING_COUNT]])
print("Vocabulary: ", len(vocabulary))

print("Computing Unigran Features ...")

unigram_features = analyzer.unigram_word_feats(vocabulary, min_freq=10)

print("Unigram Features: ", len(unigram_features))

analyzer.add_feat_extractor(extract_unigram_feats, unigrams=unigram_features)

# Build the training set
_train_X = analyzer.apply_features([(word_tokenize(unidecode(clean_text(instance))))
                                    for instance in train_x[:TRAINING_COUNT]], labeled=False)

# Build the test set
_test_X = analyzer.apply_features([(word_tokenize(unidecode(clean_text(instance))))
                                   for instance in test_x], labeled=False)

trainer = NaiveBayesClassifier.train
classifier = analyzer.train(trainer, zip(_train_X, train_y[:TRAINING_COUNT]))

score = analyzer.evaluate(list(zip(_test_X, test_y)))
print("Accuracy: ", score['Accuracy'])

score_1 = analyzer.evaluate(list(zip(new_data['Articles'])))
print(score_1)

Я понимаю, что проблема возникает из-за того, что мне нужно указать два параметра - это строка, которая выдает ошибку, но я не знаю, как это сделать.

Заранее спасибо.

1 Ответ

1 голос
/ 10 декабря 2019

Документация и пример

Строка, сообщающая об ошибке, вызывает метод SentimentAnalyzer.evaluate (...). Этот метод выполняет следующие действия.

Оценка и печать производительности классификатора на тестовом наборе.

См. SentimentAnalyzer.evaluate .

Метод имеет один обязательный параметр: test_set.

test_set - список (токенов, меток) кортежей для использования в качестве набора золота.

В примере на http://www.nltk.org/howto/sentiment.html test_set имеет следующую структуру:

[({'contains(,)': False, 'contains(.)': True, 'contains(and)': False, 'contains(the)': True}, 'subj'), ({'contains(,)': True, 'contains(.)': True, 'contains(and)': False, 'contains(the)': True}, 'subj'), ...]

Вот символическое представление структуры.

[(dictionary,label), ... , (dictionary,label)]

Ошибка в вашем коде

Вы передаете

list(zip(new_data['Articles']))

в SentimentAnalyzer.evaluate. Я предполагаю, что вы получаете ошибку, потому что

list(zip(new_data['Articles']))

не создает список (токенов, меток) кортежей. Вы можете проверить это, создав переменную, которая содержит список, и распечатав его, или посмотрев на значение переменной во время отладки. EG

test_set = list(zip(new_data['Articles']))
print("begin test_set")
print(test_set)
print("end test_set")

Вы вызываете метод оценки правильно на 3 строки выше той, которая выдает ошибку.

score = analyzer.evaluate(list(zip(_test_X, test_y)))

Полагаю, вы хотите вызвать SentimentAnalyzer.classify (instance) для прогнозирования непомеченногоданные. См. SentimentAnalyzer.classify .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...