Python情感分析案例如何判断文本情感

wen python案例 24

本文目录导读:

Python情感分析案例如何判断文本情感

  1. 使用TextBlob(最简单)
  2. 使用VADER(适合社交媒体文本)
  3. 使用机器学习模型(BERT)
  4. 中文情感分析(使用SnowNLP)
  5. 完整的情感分析函数
  6. 选择建议
  7. 实际应用示例
  8. 优化技巧

我来介绍几种Python情感分析的方法,从简单到复杂都有:

使用TextBlob(最简单)

from textblob import TextBlob
def analyze_sentiment_textblob(text):
    blob = TextBlob(text)
    sentiment = blob.sentiment
    # sentiment.polarity: -1.0(负面) 到 1.0(正面)
    # sentiment.subjectivity: 0.0(客观) 到 1.0(主观)
    if sentiment.polarity > 0:
        return "正面"
    elif sentiment.polarity < 0:
        return "负面"
    else:
        return "中性"
# 示例
texts = [
    "这个产品太棒了,我非常喜欢!",
    "服务很糟糕,再也不来了",
    "今天天气不错"
]
for text in texts:
    result = analyze_sentiment_textblob(text)
    print(f"'{text}' -> {result}")

使用VADER(适合社交媒体文本)

from vaderSentiment.vaderSentiment import SentimentIntensityAnalyzer
def analyze_sentiment_vader(text):
    analyzer = SentimentIntensityAnalyzer()
    scores = analyzer.polarity_scores(text)
    # scores包含: neg, neu, pos, compound
    # compound: -1(最负面) 到 +1(最正面)
    if scores['compound'] >= 0.05:
        return "正面", scores
    elif scores['compound'] <= -0.05:
        return "负面", scores
    else:
        return "中性", scores
# 示例
text = "这电影真的超级好看,剧情很精彩!"
sentiment, scores = analyze_sentiment_vader(text)
print(f"情感: {sentiment}")
print(f"分数: {scores}")

使用机器学习模型(BERT)

from transformers import pipeline
def analyze_sentiment_bert(text):
    # 加载预训练的情感分析模型
    sentiment_analyzer = pipeline(
        "sentiment-analysis",
        model="distilbert-base-uncased-finetuned-sst-2-english"
    )
    result = sentiment_analyzer(text)[0]
    # result格式: {'label': 'POSITIVE', 'score': 0.9998}
    return result['label'], result['score']
# 示例
text = "I love this movie! It's amazing!"
label, score = analyze_sentiment_bert(text)
print(f"情感: {label}, 置信度: {score:.4f}")

中文情感分析(使用SnowNLP)

from snownlp import SnowNLP
def analyze_sentiment_chinese(text):
    s = SnowNLP(text)
    sentiment = s.sentiments  # 0(负面) 到 1(正面)
    if sentiment > 0.6:
        return "正面", sentiment
    elif sentiment < 0.4:
        return "负面", sentiment
    else:
        return "中性", sentiment
# 示例
texts = [
    "这家餐厅的菜非常好吃,服务也很周到",
    "质量太差了,完全不值这个价格",
    "今天去了趟超市,买了些日用品"
]
for text in texts:
    sentiment, score = analyze_sentiment_chinese(text)
    print(f"'{text}' -> {sentiment} (得分: {score:.2f})")

完整的情感分析函数

import re
import jieba
from collections import Counter
class SentimentAnalyzer:
    def __init__(self):
        # 简单的情感词典
        self.positive_words = ['好', '棒', '喜欢', '优秀', '完美', '满意', '开心']
        self.negative_words = ['差', '糟糕', '讨厌', '差劲', '失望', '生气', '伤心']
    def preprocess(self, text):
        # 文本预处理
        text = re.sub(r'[^\w\s]', '', text)  # 去除标点
        words = jieba.cut(text)  # 中文分词
        return list(words)
    def analyze_by_dict(self, text):
        """基于情感词典的分析"""
        words = self.preprocess(text)
        positive_count = sum(1 for word in words if word in self.positive_words)
        negative_count = sum(1 for word in words if word in self.negative_words)
        sentiment_score = positive_count - negative_count
        if sentiment_score > 0:
            return "正面"
        elif sentiment_score < 0:
            return "负面"
        else:
            return "中性"
    def analyze_mixed(self, text):
        """综合多种方法分析"""
        # VADER分析
        from vaderSentiment.vaderSentiment import SentimentIntensityAnalyzer
        vader = SentimentIntensityAnalyzer()
        vader_score = vader.polarity_scores(text)['compound']
        # 词典分析
        dict_result = self.analyze_by_dict(text)
        # 综合判断
        if vader_score > 0.3 and dict_result != "负面":
            return "正面"
        elif vader_score < -0.3 and dict_result != "正面":
            return "负面"
        else:
            return "中性"
# 使用示例
analyzer = SentimentAnalyzer()
test_cases = [
    "这个产品真是太棒了,推荐大家购买!",
    "垃圾服务,再也不会来了",
    "今天天气还行吧"
]
for text in test_cases:
    result = analyzer.analyze_mixed(text)
    print(f"文本: {text}")
    print(f"情感: {result}")
    print("-" * 30)

选择建议

方法 适合场景 准确率 速度
TextBlob 英文简单分析 中等
VADER 社交媒体、短文本
BERT 复杂语义分析 很高
SnowNLP 中文分析 中等
自定义词典 特定领域 可调优

实际应用示例

def sentiment_batch_analysis(texts):
    """
    批量情感分析
    """
    results = []
    for text in texts:
        # 使用VADER进行快速分析
        from vaderSentiment.vaderSentiment import SentimentIntensityAnalyzer
        analyzer = SentimentIntensityAnalyzer()
        scores = analyzer.polarity_scores(text)
        # 分类
        if scores['compound'] >= 0.05:
            category = "正面"
        elif scores['compound'] <= -0.05:
            category = "负面"
        else:
            category = "中性"
        results.append({
            'text': text,
            'sentiment': category,
            'scores': scores,
            'confidence': max(scores['pos'], scores['neg'], scores['neu'])
        })
    return results
# 批量处理示例
reviews = [
    "服务态度很好,价格也合理",
    "产品有质量问题,联系客服没人理",
    "一般般吧,没什么特别的感觉"
]
results = sentiment_batch_analysis(reviews)
for r in results:
    print(f"评论: {r['text']}")
    print(f"情感: {r['sentiment']} (置信度: {r['confidence']:.2%})")
    print("---")

优化技巧

  1. 领域定制:添加行业特定的情感词典
  2. 否定词处理:如"不好" → "差"
  3. 程度副词:如"非常喜欢" → 更强正面
  4. 表情符号:😊 → 积极,😠 → 消极

选择哪种方法取决于你的具体需求、数据量和精度要求,对于生产环境,建议结合多种方法提高准确率。

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