本文目录导读:

我来分享一个使用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在情感分析中的基本用法和高级应用,可以根据实际需求进行调整和扩展。
版权声明:NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播