背景介绍
在社交媒体、电商评论、客户反馈等场景中,文本情感分析(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条
扩展与优化方向
- 预处理增强:添加中文分词、去停用词(如
jieba库),提升分析准确性; - 模型优化:结合
LSTM、BERT等深度学习模型,或自定义情感词典,优化中文情感分析效果; - 界面化:使用
Tkinter或PyQt开发图形界面,支持文件上传和结果可视化的实时展示; - 多语言支持:对英文文本使用
TextBlob,对其他语言适配对应的预训练模型。
总结
通过这个小工具,我们实践了文本情感分析、文件I/O和数据可视化的核心技能。SnowNLP简化了中文情感分析的难度,matplotlib让结果更直观。你可以基于此代码扩展功能,比如支持更多格式的输入(如CSV)、自定义情感阈值,或集成到更大的NLP项目中。
希望本文能帮助你理解文本分析的流程,动手实践时记得根据需求调整参数(如情感阈值、可视化风格),让工具更贴合业务场景!