基于文本的情感分析
1. 数据加载与特征转换2. 数据集划分3. 模型训练4. 模型测试5. 输出信息量较大的特征6. 对输入的句子进行情感分析7. 使用SnowNLP进行情感分析8. 主函数
基于文本的情感分析
代码逻辑顺序说明
-
数据加载与特征转换:
首先加载积极和消极评论数据,并将其转换为特征集。这是情感分析的基础步骤,为后续的模型训练提供数据支持。
-
数据集划分:
将特征集划分为训练集和测试集。通常使用80%的数据作为训练集,20%的数据作为测试集,以评估模型的性能。
-
模型训练:
使用训练集训练朴素贝叶斯分类器。朴素贝叶斯是一种简单而有效的分类算法,适用于文本分类任务。
-
模型测试:
使用测试集评估分类器的准确率。准确率是衡量模型性能的重要指标之一。
-
输出信息量较大的特征:
输出模型中信息量较大的特征,帮助理解模型的决策依据。
-
对输入的句子进行情感分析:
使用训练好的模型对输入的句子进行情感分析,输出情感标签和概率。
-
使用SnowNLP进行情感分析:
提供一个额外的情感分析工具(SnowNLP)的示例,展示不同的情感分析方法。
-
主函数:
将上述步骤封装到主函数中,按逻辑顺序依次执行,使代码结构更加清晰。
1. 数据加载与特征转换
首先加载积极和消极评论数据,并将其转换为特征集。这是情感分析的基础步骤,为后续的模型训练提供数据支持。
import jieba
# 1. 数据加载与特征转换
def load_data_and_convert_to_features():
"""
读取积极和消极评论数据,并转换为特征集。
:return: 积极评论特征集和消极评论特征集
"""
pos_data = [] # 用于存储积极评论的特征集
with open('../data/pos.txt', 'r', encoding='utf-8') as pos: # 打开积极评论文件
for line in pos:
words = jieba.cut(line.strip()) # 对评论数据进行分词,并去除首尾空格
features = {word: True for word in words} # 创建特征字典
pos_data.append((features, 'POSITIVE')) # 将特征集和标签(POSITIVE)添加到列表中
neg_data = [] # 用于存储消极评论的特征集
with open('../data/neg.txt', 'r', encoding='utf-8') as neg: # 打开消极评论文件
for line in neg:
words = jieba.cut(line.strip()) # 对评论数据进行分词,并去除首尾空格
features = {word: True for word in words} # 创建特征字典
neg_data.append((features, 'NEGATIVE')) # 将特征集和标签(NEGATIVE)添加到列表中
return pos_data, neg_data
# 验证 load_data_and_convert_to_features()
# pos_data, neg_data = load_data_and_convert_to_features()
# print(pos_data[:2])
# print('=' * 100)
# print(neg_data[:2])
2. 数据集划分:
将特征集划分为训练集和测试集。通常使用80%的数据作为训练集,20%的数据作为测试集,以评估模型的性能。
# 2. 数据集划分
def split_data(pos_data, neg_data):
"""
划分训练集和测试集。
:param pos_data: 积极评论特征集
:param neg_data: 消极评论特征集
:return: 训练集和测试集
"""
pos_num = int(len(pos_data) * 0.8) # 计算积极评论训练集的数量
neg_num = int(len(neg_data) * 0.8) # 计算消极评论训练集的数量
train_data = pos_data[:pos_num] + neg_data[:neg_num] # 组合训练集
test_data = pos_data[pos_num:] + neg_data[neg_num:] # 组合测试集
return train_data, test_data
# 验证 split_data()
# pos_data, neg_data = load_data_and_convert_to_features()
# train_data, test_data = split_data(pos_data, neg_data)
# print(train_data[:2])
# print('=' * 100)
# print(test_data[:2])
3. 模型训练:
使用训练集训练朴素贝叶斯分类器。朴素贝叶斯是一种简单而有效的分类算法,适用于文本分类任务。
# 3. 模型训练
import nltk.classify as cf
def train_classifier(train_data):
"""
训练朴素贝叶斯分类器。
:param train_data: 训练集
:return: 训练好的分类器
"""
model = cf.NaiveBayesClassifier.train(train_data) # 使用训练集训练朴素贝叶斯分类器
return model
4. 模型测试:
使用测试集评估分类器的准确率。准确率是衡量模型性能的重要指标之一。
# 4. 模型测试
import nltk.classify.util as cu
def test_classifier(model, test_data):
"""
测试分类器的准确率。
:param model: 分类器
:param test_data: 测试集
:return: 准确率
"""
accuracy = cu.accuracy(model, test_data) # 计算分类器在测试集上的准确率
print(f'准确率为:{accuracy:.2f}')
return accuracy
# 1. 数据加载与特征转换
# pos_data, neg_data = load_data_and_convert_to_features()
# 2. 数据集划分
# train_data, test_data = split_data(pos_data, neg_data)
# 3. 模型训练
# model = train_classifier(train_data)
# 4. 模型测试
# accuracy = test_classifier(model, test_data)
5. 输出信息量较大的特征
输出模型中信息量较大的特征,帮助理解模型的决策依据。
# 5. 输出信息量较大的特征
def print_top_features(model):
"""
输出信息量较大的特征。
:param model: 分类器
"""
print('\n信息量较大的前10个特征为:')
for feature, _ in model.most_informative_features()[:10]: # 获取信息量较大的前10个特征
print(feature)
# 1. 数据加载与特征转换
# pos_data, neg_data = load_data_and_convert_to_features()
# 2. 数据集划分
# train_data, test_data = split_data(pos_data, neg_data)
# 3. 模型训练
# model = train_classifier(train_data)
# 4. 模型测试
# accuracy = test_classifier(model, test_data)
# 5. 输出信息量较大的特征
# print_top_features(model)
6. 对输入的句子进行情感分析
使用训练好的模型对输入的句子进行情感分析,输出情感标签和概率。
# 6. 对输入的句子进行情感分析
def analyze_sentences(sentences, model):
"""
对输入的句子进行情感分析。
:param sentences: 需要分析情感的句子列表
:param model: 分类器
"""
for sentence in sentences:
words = jieba.cut(sentence) # 对句子进行分词
features = {word: True for word in words} # 创建特征集
pcls = model.prob_classify(features) # 使用分类器进行概率分类
sentiment = pcls.max() # 获取情绪面标签(POSITIVE或NEGATIVE)
probability = pcls.prob(sentiment) # 获取情绪程度的概率
print(f'\n‘{sentence}’的情绪面标签为{sentiment}, 概率为{probability:.2f}%')
# 1. 数据加载与特征转换
# pos_data, neg_data = load_data_and_convert_to_features()
# 2. 数据集划分
# train_data, test_data = split_data(pos_data, neg_data)
# 3. 模型训练
# model = train_classifier(train_data)
# 4. 模型测试
# accuracy = test_classifier(model, test_data)
# 5. 输出信息量较大的特征
# print_top_features(model)
# 6. 对输入的句子进行情感分析
# 测试句子
# sentences = [
# '破烂平板',
# '手感不错,推荐购买',
# '刚开始吧还不错,但是后面越来越卡,差评',
# '哈哈哈哈,我很喜欢',
# '今天很开心'
# ]
# analyze_sentences(sentences, model)
7. 使用SnowNLP进行情感分析
提供一个额外的情感分析工具(SnowNLP)的示例,展示不同的情感分析方法。
# 7. 使用SnowNLP进行情感分析
from snownlp import SnowNLP
def snownlp_analysis():
"""
使用SnowNLP进行情感分析。
"""
s1 = SnowNLP('这东西真的挺不错的') # 创建SnowNLP对象,设置要测试的语句
s2 = SnowNLP('垃圾东西') # 创建SnowNLP对象,设置要测试的语句
print(f'\n调用sentiments方法获取s1的积极情感概率为:{s1.sentiments:.2f}') # 调用sentiments方法获取积极情感概率
print(f'调用sentiments方法获取s2的积极情感概率为:{s2.sentiments:.2f}') # 调用sentiments方法获取积极情感概率
# 验证使用SnowNLP进行情感分析
snownlp_analysis()
调用sentiments方法获取s1的积极情感概率为:0.94
调用sentiments方法获取s2的积极情感概率为:0.13
8. 主函数
将上述步骤封装到主函数中,按逻辑顺序依次执行,使代码结构更加清晰。
def main():
"""
主函数,执行情感分析流程。
"""
# 加载数据并转换为特征集
pos_data, neg_data = load_data_and_convert_to_features()
# 划分训练集和测试集
train_data, test_data = split_data(pos_data, neg_data)
# 训练分类器
model = train_classifier(train_data)
# 测试分类器的准确率
test_classifier(model, test_data)
# 输出信息量较大的特征
print_top_features(model)
# 测试句子
sentences = [
'破烂平板',
'手感不错,推荐购买',
'刚开始吧还不错,但是后面越来越卡,差评',
'哈哈哈哈,我很喜欢',
'今天很开心'
]
# 对测试句子进行情感分析
analyze_sentences(sentences, model)
# 使用SnowNLP进行情感分析
snownlp_analysis()
# 程序入口
if __name__ == '__main__':
main()
准确率为:0.84
信息量较大的前10个特征为:
刚买
月
差评
退
失望
联系
不卡
结果
坑
不想
‘破烂平板’的情绪面标签为NEGATIVE, 概率为0.68%
‘手感不错,推荐购买’的情绪面标签为POSITIVE, 概率为0.97%
‘刚开始吧还不错,但是后面越来越卡,差评’的情绪面标签为NEGATIVE, 概率为1.00%
‘哈哈哈哈,我很喜欢’的情绪面标签为POSITIVE, 概率为0.98%
‘今天很开心’的情绪面标签为NEGATIVE, 概率为0.93%
调用sentiments方法获取s1的积极情感概率为:0.94
调用sentiments方法获取s2的积极情感概率为:0.13
更多推荐
所有评论(0)