Анализ настроений в Твиттере с Наивным Байесом Классифицирует только возвращающий «нейтральный» ярлык - PullRequest
0 голосов
/ 19 мая 2019

Я следовал этому уроку: https://towardsdatascience.com/creating-the-twitter-sentiment-analysis-program-in-python-with-naive-bayes-classification-672e5589a7ed, чтобы создать анализатор настроений в Твиттере, который использует наивный байесовский классификатор из библиотеки nltk как способ классификации твитов как положительных, отрицательных или нейтральных, но меток, которые он возвращает только нейтральные или неактуальные. Я включил свой код ниже, так как я не очень опытен в машинном обучении, поэтому буду признателен за любую помощь.

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

import nltk

def buildvocab(processedtrainingdata):
    all_words = []

    for (words, sentiment) in processedtrainingdata:
        all_words.extend(words)

    wordlist = nltk.FreqDist(all_words)
    word_features = wordlist.keys()

    return word_features

def extract_features(tweet):
    tweet_words = set(tweet)
    features = {}
    for word in word_features:
        features['contains(%s)' % word] = (word in tweet_words) #creates json key containing word x, its loc.
        # Every key has a T/F according - true for present , false for not
    return features 

# Building the feature vector

word_features = buildvocab(processedtrainingdata)
training_features = nltk.classify.apply_features(extract_features, processedtrainingdata)
# apply features does the actual extraction

Nbayes_result_labels = [Nbayes.classify(extract_features(tweet[0])) for tweet in processedtestset]

# get the majority vote [?]
if Nbayes_result_labels.count('positive') > Nbayes_result_labels.count('negative'):
    print('Positive')
    print(str(100*Nbayes_result_labels.count('positive')/len(Nbayes_result_labels)))
elif Nbayes_result_labels.count('negative') > Nbayes_result_labels.count('positive'):
    print(str(100*Nbayes_result_labels.count('negative')/len(Nbayes_result_labels)))
    print('Negative sentiment')
else:
    print('Neutral')


#the output is always something like this: 
print(Nbayes_result_labels)
['neutral', 'neutral', 'neutral', 'neutral', 'neutral', 'neutral', 'neutral', 'neutral', 'neutral', 'neutral', 'neutral', 'neutral', 'neutral', 'neutral', 'neutral', 'neutral', 'neutral', 'neutral', 'neutral', 'neutral', 'neutral', 'neutral', 'neutral', 'neutral', 'neutral', 'neutral', 'neutral', 'neutral', 'neutral', 'neutral', 'neutral', 'neutral', 'neutral', 'neutral', 'neutral', 'neutral', 'neutral', 'neutral', 'neutral', 'neutral', 'neutral', 'neutral', 'neutral', 'neutral', 'neutral', 'neutral', 'neutral', 'neutral', 'neutral', 'neutral', 'neutral', 'neutral', 'neutral', 'neutral', 'neutral', 'neutral', 'neutral', 'neutral', 'neutral', 'neutral', 'neutral', 'irrelevant', 'neutral', 'neutral', 'neutral', 'neutral', 'neutral', 'neutral', 'neutral', 'neutral', 'neutral', 'neutral', 'neutral', 'neutral', 'neutral', 'neutral', 'neutral', 'neutral', 'neutral', 'neutral', 'neutral', 'neutral', 'neutral', 'neutral', 'neutral', 'neutral', 'neutral', 'neutral', 'neutral', 'neutral', 'neutral', 'neutral', 'neutral', 'neutral', 'neutral', 'neutral', 'neutral', 'neutral', 'neutral', 'neutral']

1 Ответ

0 голосов
/ 21 мая 2019

Ваш набор данных сильно несбалансирован. Вы сами упомянули об этом в одном из комментариев, у вас есть 550 положительных и 550 отрицательно помеченных твитов, но 4000 нейтральных, поэтому это всегда в пользу большинства класса. Вы должны иметь одинаковое количество высказываний для всех классов, если это возможно. Вам также нужно узнать о показателях оценки, и вы, скорее всего, увидите, что ваш отзыв не очень хороший. Идеальная модель должна стоять на всех показателях оценки. Чтобы не перегружать некоторых людей, добавьте также четвертый класс «других», но сейчас вы можете пропустить это.

Вот что вы можете сделать, чтобы улучшить производительность вашей модели: либо (добавьте больше данных) перевыбор классов меньшинства путем добавления возможных похожих высказываний, либо выборки из класса большинства или использования комбинации обоих. Вы можете прочитать о передискретизации, недостаточной выборке онлайн.

В этом новом наборе данных постарайтесь использовать высказывания всех классов в этом соотношении 1: 1: 1, если это возможно. Наконец, попробуйте и другие алгоритмы с гиперпараметрами, настроенными через поиск по сетке, случайный поиск или tpot.

edit: в вашем случае не имеет значения класс «другие», так что теперь у вас есть 4 класса, которые пытаются получить набор данных в этом соотношении 1: 1: 1: 1 для каждого класса.

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