如何使用POS tagging提升Naive Bayes的推文分类准确率
基于POS标注优化朴素贝叶斯推文分类的实现方案
核心逻辑是将词性信息和文本内容结合构造特征,相比纯词袋特征可以减少歧义、保留语言学信息,提升分类准确率。
1. 特征工程处理POS标注数据
常用两种特征构造思路,可以组合使用:
- 词+POS组合特征:将
(单词, 词性)元组拼接为单词/词性的独立特征,同一个词不同词性会被识别为不同特征,避免语义歧义 - 筛选高价值词性:过滤标点、语气助词这类无意义词性的内容,只保留名词(NNC/NNP/NNJ)、形容词(JJ)、动词(VP)等有效语义的内容作为特征,降低特征维度减少噪声
如果你的
pos_tagged_tweet列读取后是字符串格式(比如"[(හාමුදුරුවරු, NNC), (...)]"),可以先通过import ast,调用ast.literal_eval()方法将字符串转换为Python原生的元组列表格式。
2. 代码实现(基于NLTK库)
首先导入依赖包,构造特征提取函数:
import nltk import ast import pandas as pd from nltk.classify import NaiveBayesClassifier from nltk.classify.util import accuracy as nltk_accuracy def extract_features(pos_tagged_list): features = {} for word, pos in pos_tagged_list: # 过滤标点符号类无意义特征 if pos == "FS": continue # 构造词+词性的组合特征 feature_key = f"{word}/{pos}" features[feature_key] = True # 可额外添加词性分布特征,比如统计各类词性出现次数 # features[f"pos_count_{pos}"] = features.get(f"pos_count_{pos}", 0) + 1 return features
接下来构造训练测试数据集:
# 读取数据集(此处假设你的数据存为csv格式,根据实际存储格式调整读取逻辑) df = pd.read_csv("你的数据集路径.csv") # 转换pos_tagged_tweet列为元组列表格式 df["pos_tagged_tweet"] = df["pos_tagged_tweet"].apply(ast.literal_eval) # 构造(特征, 标签)对 feature_sets = [] for _, row in df.iterrows(): features = extract_features(row["pos_tagged_tweet"]) feature_sets.append((features, row["Category"])) # 按8:2比例拆分训练集和测试集 train_size = int(len(feature_sets) * 0.8) train_set, test_set = feature_sets[:train_size], feature_sets[train_size:]
训练模型并评估效果:
# 训练朴素贝叶斯分类器 classifier = NaiveBayesClassifier.train(train_set) # 输出测试集准确率 print(f"测试集分类准确率:{nltk_accuracy(classifier, test_set):.2f}") # 输出Top10最具区分度的特征,验证POS特征的作用 print("最具区分度的Top10特征:") classifier.show_most_informative_features(10)
优化调整建议
- 可以对比仅用特定词性(比如仅保留名词、专有名词)作为特征的分类效果,通常健康类推文普通名词占比更高,政治类推文专有名词占比更高,针对性筛选可以进一步提升准确率
- 可以将POS特征和原来的纯词袋特征组合使用,对比准确率变化,选择最优的特征组合
- 如果出现过拟合问题,可以增加特征过滤步骤,仅保留在全数据集中出现次数大于N次的特征
内容的提问来源于stack exchange,提问作者Chandima Samarakoon
相关产品推荐
相关产品推荐

