基于文本的情感分析

代码逻辑顺序说明

  1. 数据加载与特征转换:

    首先加载积极和消极评论数据,并将其转换为特征集。这是情感分析的基础步骤,为后续的模型训练提供数据支持。

  2. 数据集划分:

    将特征集划分为训练集和测试集。通常使用80%的数据作为训练集,20%的数据作为测试集,以评估模型的性能。

  3. 模型训练:

    使用训练集训练朴素贝叶斯分类器。朴素贝叶斯是一种简单而有效的分类算法,适用于文本分类任务。

  4. 模型测试:

    使用测试集评估分类器的准确率。准确率是衡量模型性能的重要指标之一。

  5. 输出信息量较大的特征:

    输出模型中信息量较大的特征,帮助理解模型的决策依据。

  6. 对输入的句子进行情感分析:

    使用训练好的模型对输入的句子进行情感分析,输出情感标签和概率。

  7. 使用SnowNLP进行情感分析:

    提供一个额外的情感分析工具(SnowNLP)的示例,展示不同的情感分析方法。

  8. 主函数:

    将上述步骤封装到主函数中,按逻辑顺序依次执行,使代码结构更加清晰。

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
Logo

技术共进,成长同行——讯飞AI开发者社区

更多推荐