Python案例如何用snownlp做情感倾向

wen python案例 3

本文目录导读:

Python案例如何用snownlp做情感倾向

  1. 基本安装和初始化
  2. 情感分析完整案例
  3. 批量文本情感分析
  4. 情感趋势分析
  5. 实际应用场景:产品评论分析
  6. 高级功能:自定义情感词典
  7. 使用建议

我来分享一个使用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("可通过自定义训练数据来优化情感分析准确性")

使用建议

  1. 适用场景:中文文本情感分析
  2. 准确度:对于通用场景较好,专业领域建议微调
  3. 处理长文本:建议分段分析取平均值
  4. 注意:中性情感判定阈值可根据具体需求调整

这个案例展示了SnowNLP在情感分析中的基本用法和高级应用,可以根据实际需求进行调整和扩展。

抱歉,评论功能暂时关闭!