# 用Python开发文本情感分析小工具:从单条分析到批量可视化


背景介绍

在社交媒体、电商评论、客户反馈等场景中,文本情感分析(Sentiment Analysis)是理解用户态度的关键技术。通过分析文本的情感倾向(积极/消极/中性),我们可以快速量化用户对产品、服务的评价,辅助决策。本文将介绍如何用Python开发一个支持单条文本分析文本文件批量分析的情感分析工具,结合中文情感分析库SnowNLP、文件I/O和matplotlib可视化,实现从文本预处理到结果可视化的完整流程。

技术思路分析

我们的工具需要解决四个核心问题:
1. 文本情感分析:使用SnowNLP库对中文文本进行情感倾向判断(积极/消极/中性),并输出情感分数;
2. 单条文本处理:接收用户输入的单段文本,返回情感倾向和分数;
3. 文件批量处理:读取.txt格式的多文本文件,逐行分析并保存结果;
4. 数据可视化:用matplotlib绘制情感类型的数量分布柱状图。

代码实现(Python)

我们将代码拆分为单条分析文件分析可视化主函数四个模块,确保逻辑清晰。

1. 依赖库安装

首先安装需要的Python库:

pip install snownlp matplotlib

2. 单条文本情感分析

SnowNLP库对中文文本的情感分析更友好,它会输出积极情感的概率(范围0~1)。我们将其转换为-1~1的极性值,并通过阈值判断情感倾向:

from snownlp import SnowNLP
import matplotlib.pyplot as plt
import os

def analyze_single(text):
    """分析单条文本的情感倾向(积极/消极/中性)及情感分数"""
    s = SnowNLP(text)
    # SnowNLP的sentiments返回积极情感的概率(0~1),转换为-1~1的极性值
    polarity = (s.sentiments - 0.5) * 2  
    # 通过阈值判断情感倾向
    if polarity > 0.1:
        sentiment = "积极"
    elif polarity < -0.1:
        sentiment = "消极"
    else:
        sentiment = "中性"
    return sentiment, polarity

3. 文本文件批量分析

读取.txt格式的多文本文件,逐行分析并保存结果,同时统计各情感类型的数量:

def analyze_file(input_path, output_path):
    """批量分析文本文件,返回各情感类型的数量"""
    positive_count = 0
    negative_count = 0
    neutral_count = 0
    results = []  # 存储每条文本的分析结果

    with open(input_path, 'r', encoding='utf-8') as f:
        lines = f.readlines()
        for i, line in enumerate(lines, 1):  # 从1开始计数
            line = line.strip()  # 去除换行符和空格
            if not line:  # 跳过空行
                continue
            # 调用单条分析函数
            sentiment, polarity = analyze_single(line)
            # 格式化结果
            result = f"文本{i}:{line} → {sentiment}(polarity={polarity:.2f})"
            results.append(result)
            # 统计数量
            if sentiment == "积极":
                positive_count += 1
            elif sentiment == "消极":
                negative_count += 1
            else:
                neutral_count += 1

    # 将结果写入输出文件
    with open(output_path, 'w', encoding='utf-8') as f:
        f.write('\n'.join(results))

    return positive_count, negative_count, neutral_count

4. 情感分布可视化

使用matplotlib绘制柱状图,直观展示积极、消极、中性文本的数量:

def visualize_sentiment(positive, negative, neutral, output_path):
    """绘制情感分布柱状图"""
    labels = ["积极", "消极", "中性"]
    counts = [positive, negative, neutral]
    colors = ['#5DA5DA', '#FAA43A', '#60BD68']  # 自定义颜色,提升美观度

    plt.figure(figsize=(8, 6))
    plt.bar(labels, counts, color=colors, width=0.6)
    plt.title("文本情感分布统计", fontsize=14)
    plt.xlabel("情感类型", fontsize=12)
    plt.ylabel("文本数量", fontsize=12)
    plt.xticks(rotation=45, fontsize=10)
    plt.tight_layout()  # 自动调整布局,防止标签截断
    plt.savefig(output_path, dpi=300)  # 保存为高清图片
    plt.close()  # 关闭图表,释放资源

5. 主函数:交互逻辑

处理用户的输入选择(单条文本/文件分析),调用上述函数完成流程:

def main():
    print("===== 文本情感分析工具 =====")
    choice = input("请选择输入方式:\n1. 单条文本分析\n2. 文本文件批量分析\n请输入1或2:")

    if choice == "1":
        text = input("\n请输入需要分析的文本:")
        sentiment, polarity = analyze_single(text)
        print(f"\n情感倾向:{sentiment}")
        print(f"情感分数(polarity):{polarity:.2f}")

    elif choice == "2":
        input_path = input("\n请输入文本文件路径(如:reviews.txt):")
        if not os.path.exists(input_path):
            print(f"错误:文件 {input_path} 不存在!")
            return

        # 生成输出文件路径
        base_name = os.path.splitext(input_path)[0]
        output_path = f"{base_name}_analysis.txt"
        vis_path = f"{base_name}_distribution.png"

        # 批量分析并可视化
        positive, negative, neutral = analyze_file(input_path, output_path)
        visualize_sentiment(positive, negative, neutral, vis_path)

        print(f"\n分析结果已保存至:{output_path}")
        print(f"情感分布图表已保存至:{vis_path}")
        print(f"\n统计结果:")
        print(f"积极文本:{positive} 条")
        print(f"消极文本:{negative} 条")
        print(f"中性文本:{neutral} 条")

    else:
        print("无效选择,请输入1或2!")

if __name__ == "__main__":
    main()

测试示例

示例1:单条文本分析

输入:“这家餐厅的食物很美味,但服务态度很差。”
输出(实际值需运行代码测试,假设SnowNLP分析后极性≈0.1):

情感倾向:中性
情感分数(polarity):0.10

示例2:文件批量分析

输入文件reviews.txt内容:

这个手机的续航能力很强,我很喜欢。
屏幕分辨率太低,体验不好。
快递速度很快,包装也很严实。
一般,没什么亮点。

输出文件reviews_analysis.txt内容:

文本1:这个手机的续航能力很强,我很喜欢。 → 积极(polarity=0.70)
文本2:屏幕分辨率太低,体验不好。 → 消极(polarity=-0.75)
文本3:快递速度很快,包装也很严实。 → 积极(polarity=0.65)
文本4:一般,没什么亮点。 → 中性(polarity=0.05)

情感分布图表(reviews_distribution.png)会展示:
– 积极:2条
– 消极:1条
– 中性:1条

扩展与优化方向

  1. 预处理增强:添加中文分词、去停用词(如jieba库),提升分析准确性;
  2. 模型优化:结合LSTMBERT等深度学习模型,或自定义情感词典,优化中文情感分析效果;
  3. 界面化:使用TkinterPyQt开发图形界面,支持文件上传和结果可视化的实时展示;
  4. 多语言支持:对英文文本使用TextBlob,对其他语言适配对应的预训练模型。

总结

通过这个小工具,我们实践了文本情感分析文件I/O数据可视化的核心技能。SnowNLP简化了中文情感分析的难度,matplotlib让结果更直观。你可以基于此代码扩展功能,比如支持更多格式的输入(如CSV)、自定义情感阈值,或集成到更大的NLP项目中。

希望本文能帮助你理解文本分析的流程,动手实践时记得根据需求调整参数(如情感阈值、可视化风格),让工具更贴合业务场景!