本文目录导读:

我来分享一个使用SnowNLP进行情感倾向分析的完整Python案例。
基本安装和初始化
# 安装:pip install snownlp
from snownlp import SnowNLP
# 基本使用示例
text = "这部电影真的很精彩,演员演技精湛,剧情引人入胜"
s = SnowNLP(text)
# 获取情感倾向值(0-1之间)
sentiment_score = s.sentiments
print(f"情感得分: {sentiment_score}")
情感分析完整案例
from snownlp import SnowNLP
def analyze_sentiment(text):
"""分析文本情感"""
s = SnowNLP(text)
score = s.sentiments
# 根据得分判断情感倾向
if score > 0.6:
return "正面", score
elif score < 0.4:
return "负面", score
else:
return "中性", score
# 测试不同文本
texts = [
"这个产品太棒了,质量很好,性价比高",
"质量太差了,用了三天就坏了,非常失望",
"今天的天气不错,适合出去散步",
"服务态度恶劣,客服爱答不理的",
"一般般吧,没什么特别的,很普通的产品"
]
for text in texts:
sentiment, score = analyze_sentiment(text)
print(f"文本: {text}")
print(f"情感: {sentiment}, 得分: {score:.3f}")
print("-" * 50)
批量文本情感分析
import pandas as pd
from snownlp import SnowNLP
def batch_sentiment_analysis(texts):
"""批量情感分析"""
results = []
for text in texts:
s = SnowNLP(str(text))
sentiment_score = s.sentiments
# 分类
if sentiment_score > 0.6:
category = "正面"
elif sentiment_score < 0.4:
category = "负面"
else:
category = "中性"
results.append({
'text': text,
'score': sentiment_score,
'category': category,
'keywords': s.keywords(3), # 提取关键词
'summary': s.summary(2) # 提取摘要
})
return pd.DataFrame(results)
# 示例数据
reviews = [
"这家餐厅的菜品非常美味,环境优雅,服务周到",
"等了很久才上菜,价格还贵,不推荐",
"性价比不错,可以尝试",
"味道一般,没有特别惊艳",
"强烈推荐!太好吃了,下次还会来"
]
df = batch_sentiment_analysis(reviews)
print(df[['text', 'category', 'score']])
情感趋势分析
import matplotlib.pyplot as plt
import seaborn as sns
from snownlp import SnowNLP
import datetime
# 生成示例时间序列数据
def generate_timeline_sentiment():
"""生成时间序列的情感分析"""
# 模拟一周的评论
dates = pd.date_range('2024-01-01', periods=7, freq='D')
daily_comments = [
["新品发布,非常惊喜", "质量不错"],
["有点小瑕疵", "整体还满意"],
["太失望了", "服务需要改进"],
["开始好转了", "问题解决了"],
["非常满意", "推荐给大家"],
["一如既往的好", "会继续支持"],
["产品升级了", "更好了"]
]
daily_scores = []
for i, comments in enumerate(daily_comments):
scores = [SnowNLP(comment).sentiments for comment in comments]
daily_scores.append({
'date': dates[i],
'avg_score': sum(scores) / len(scores),
'comments': comments
})
return pd.DataFrame(daily_scores)
# 绘制情感趋势图
df_timeline = generate_timeline_sentiment()
plt.figure(figsize=(10, 6))
plt.plot(df_timeline['date'], df_timeline['avg_score'], marker='o', linewidth=2)
plt.axhline(y=0.5, color='gray', linestyle='--', alpha=0.5)'情感趋势分析(1月1日-1月7日)')
plt.xlabel('日期')
plt.ylabel('平均情感得分')
plt.ylim(0, 1)
plt.grid(True)
plt.show()
实际应用场景:产品评论分析
class ProductReviewAnalyzer:
"""产品评论分析器"""
def __init__(self, product_name):
self.product_name = product_name
self.reviews = []
def add_review(self, review_text):
"""添加评论"""
self.reviews.append(review_text)
def analyze_all(self):
"""分析所有评论"""
results = []
for review in self.reviews:
s = SnowNLP(review)
results.append({
'review': review,
'sentiment': s.sentiments,
'positive_words': [word for word in s.words if s.sentiments > 0.5]
})
return results
def get_statistics(self):
"""获取统计分析"""
sentiments = [SnowNLP(r).sentiments for r in self.reviews]
stats = {
'total_reviews': len(self.reviews),
'avg_sentiment': sum(sentiments) / len(sentiments),
'positive_rate': sum(1 for s in sentiments if s > 0.6) / len(sentiments),
'negative_rate': sum(1 for s in sentiments if s < 0.4) / len(sentiments),
'neutral_rate': sum(1 for s in sentiments if 0.4 <= s <= 0.6) / len(sentiments)
}
return stats
# 使用示例
analyzer = ProductReviewAnalyzer("智能手表")
analyzer.add_review("功能强大,续航持久,非常满意")
analyzer.add_review("屏幕太小,操作不便捷")
analyzer.add_review("性价比很高,值得购买")
analyzer.add_review("收到就有划痕,包装太差")
results = analyzer.analyze_all()
stats = analyzer.get_statistics()
print(f"产品:{analyzer.product_name}")
print(f"平均情感得分:{stats['avg_sentiment']:.2f}")
print(f"正面评价率:{stats['positive_rate']*100:.1f}%")
print(f"负面评价率:{stats['negative_rate']*100:.1f}%")
高级功能:自定义情感词典
from snownlp import SnowNLP
from snownlp import sentiment
# 查看默认情感词典
print("默认情感词数量:", len(sentiment.data))
# 自定义训练数据(如果需要)
def train_custom_sentiment():
"""训练自定义情感模型"""
from snownlp import sentiment
# 准备训练数据(格式:文本\t情感标签)
train_data = [
("这个产品太好了,无限回购", "pos"),
("质量太差了,强烈不建议购买", "neg"),
("价格适中,性价比还行", "pos"),
("服务态度恶劣,投诉到底", "neg")
]
# 保存训练数据
with open('custom_train.txt', 'w', encoding='utf-8') as f:
for text, label in train_data:
f.write(f"{text}\t{label}\n")
# 训练新模型(需要较长时间)
# sentiment.train('custom_train.txt', 'custom_sentiment.marshal')
# sentiment.save('custom_sentiment.marshal', 'custom_sentiment.marshal')
print("可通过自定义训练数据来优化情感分析准确性")
使用建议
- 适用场景:中文文本情感分析
- 准确度:对于通用场景较好,专业领域建议微调
- 处理长文本:建议分段分析取平均值
- 注意:中性情感判定阈值可根据具体需求调整
这个案例展示了SnowNLP在情感分析中的基本用法和高级应用,可以根据实际需求进行调整和扩展。