基于Naive Bayes的Twitter情感分析仅返回neutral标签求助
解决Twitter情感分析仅返回neutral/irrelevant的问题
咱们一步步排查问题,先从最核心的环节入手:
1. 先检查训练数据的标签与分布
你目标是分positive/negative/neutral三类,但结果出现了irrelevant,这大概率是训练数据的问题:
- 先确认
processedtrainingdata里的标签集合:是不是混入了irrelevant标签?如果训练数据里本身就有这个类别,分类器自然会输出它; - 统计训练数据的标签分布:比如positive和negative样本是不是少得可怜?如果训练集里90%都是neutral/irrelevant,分类器会倾向于输出它见过最多的类别,根本学不到pos/neg的特征;
- 验证训练数据格式:每个元素必须是
(预处理后的单词列表, 情感标签)的结构,比如(['i', 'am', 'happy'], 'positive'),格式错了分类器根本学不到对应关系。
2. 补全缺失的推文预处理步骤
你的代码里没展示预处理逻辑,但这是情感分析的核心环节,没做好的话分类器抓不到关键情感特征:
- 必须做的预处理操作:
- 把所有单词转小写(不然
Happy和happy会被当成两个不同的词); - 去掉停用词(比如
the/and这类无意义的词,会干扰特征); - 清理特殊内容:去掉@用户名、链接、话题标签符号(比如把
#happy变成happy)、非字母字符; - 用NLTK的分词器拆分推文(不要直接按空格拆分,要处理缩写、连字符等)。
- 把所有单词转小写(不然
给你补一个简单的预处理示例:
def preprocess_tweet(tweet): # 转小写 tweet = tweet.lower() # 分词 tokens = nltk.word_tokenize(tweet) # 过滤停用词和非字母字符 stop_words = set(nltk.corpus.stopwords.words('english')) filtered_tokens = [token for token in tokens if token.isalpha() and token not in stop_words] return filtered_tokens
3. 检查分类器的训练与特征提取逻辑
从你的代码看,有几个关键环节可能漏了:
- 确认分类器已训练:你只写了
Nbayes.classify,但没展示训练代码,必须执行这步才能生成有效模型:Nbayes = nltk.NaiveBayesClassifier.train(training_features) - 优化特征选择:
buildvocab里直接用了所有词的keys(),建议取前N个高频词(比如前2000个),减少低频噪声:word_features = list(wordlist.keys())[:2000] - 测试单条推文的特征提取:拿一句明确的positive推文,比如
['i', 'am', 'so', 'happy'],调用extract_features看看是否返回'contains(happy)': True,如果没有,说明特征提取逻辑有问题。
4. 修正结果判断的逻辑
你的代码最后只比较positive和negative的计数,完全忽略了irrelevant标签,建议先打印全部分布:
from collections import Counter print(Counter(Nbayes_result_labels))
这样能直观看到分类器到底输出了哪些标签,再针对性调整。另外,先拿单条明确的测试推文验证,比如:
test_tweet = "I love this sunny day!" processed_test = preprocess_tweet(test_tweet) print(Nbayes.classify(extract_features(processed_test))) # 正常应该输出positive
内容的提问来源于stack exchange,提问作者Zac
相关产品推荐
相关产品推荐

