使用朴素贝叶斯分类的 Twitter 情绪分析仅返回“中性”标签

Posted

技术标签:

【中文标题】使用朴素贝叶斯分类的 Twitter 情绪分析仅返回“中性”标签【英文标题】:Twitter Sentiment analysis with Naive Bayes Classify only returning 'neutral' label 【发布时间】:2019-10-05 19:52:09 【问题描述】:

我按照这里的教程:https://towardsdatascience.com/creating-the-twitter-sentiment-analysis-program-in-python-with-naive-bayes-classification-672e5589a7ed 创建了一个 twitter 情绪分析器,它使用 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']

【问题讨论】:

我应该提到用于训练数据的推文的“语料库文件”包含 550 条积极标记的推文,等量的消极但中性和不相关的推文要高得多,大约有 4000 条。跨度> 另外,我尝试对训练数据集进行分类,它确实适用,即用 Nbayes_result_labels = [Nbayes] 替换 Nbayes_result_labels = [Nbayes.classify(extract_features(tweet[0])) .classify(extract_features(tweet[0])) 用于处理训练数据中的推文] 【参考方案1】:

您的数据集高度不平衡。您自己在其中一条评论中提到了它,您有 550 条正面和 550 条负面标记的推文,但有 4000 条中立,这就是为什么它总是有利于多数派。如果可能的话,你应该对所有类有相同数量的话语。您还需要了解评估指标,然后您很可能会发现您的回忆不好。一个理想的模型应该在所有评估指标上都表现良好。为了避免过度拟合,有些人还添加了第四个“其他”类,但现在你可以跳过它。

您可以采取以下措施来提高模型的性能,或者(添加更多数据)通过添加可能的相似话语对少数类进行过度采样,或者对多数类进行欠采样,或者同时使用两者。您可以在线阅读有关过采样、欠采样的信息。

在这个新的数据集中,如果可能的话,尝试以 1:1:1 的比例让所有类的话语。最后尝试其他算法以及通过网格搜索、随机搜索或 tpot 调整的超参数。

编辑:在您的情况下,“其他”类无关紧要,因此您现在有 4 个类尝试以每个类 1:1:1:1 的比例拥有数据集。

【讨论】:

以上是关于使用朴素贝叶斯分类的 Twitter 情绪分析仅返回“中性”标签的主要内容,如果未能解决你的问题,请参考以下文章

为啥训练我的朴素贝叶斯分类器会占用这么多内存?

Hashingvectorizer 和多项式朴素贝叶斯不能一起工作

用于情绪分析的 Mahout

使用朴素贝叶斯情感分析实现 PoS

朴素贝叶斯分类器的平衡语料库

朴素贝叶斯分类器仅基于先验概率做出决策