Python 机器学习案例情感分析(建议收藏)

在这里插入图片描述

整体功能概述

这段代码的主要功能是对一组中文文本进行情感分析,将情感细分为“喜”“怒”“哀”“乐”“积极”“消极”“中性”等类别,并输出每段文本的情感倾向和对应的情感得分。代码借助 SnowNLP 库完成基本的情感极性判断,同时结合自定义的情感词典进一步细化情感分类。

代码结构及各部分功能

1. 导入必要的库
from snownlp import SnowNLP

这行代码导入了 SnowNLP 库,它是一个用于中文自然语言处理的 Python 库,可进行文本的情感分析、分词、词性标注等操作。在本代码中,主要使用其情感分析功能。

2. 构建情感词典
joy_words = ["开心", "快乐", "兴奋", "惊喜", "愉悦", "狂喜", "欣喜"]
anger_words = ["生气", "愤怒", "恼火", "气愤", "恼怒", "发火"]
sorrow_words = ["伤心", "难过", "悲痛", "哀伤", "沮丧", "忧郁"]
amusement_words = ["有趣", "好玩", "逗乐", "欢乐"]

这里定义了四个列表,分别存储与“喜”“怒”“哀”“乐”相关的情感词汇。这些词汇将用于后续的情感细分,当文本中出现这些词汇时,会将其情感归为对应的类别。

3. 定义情感分类函数
def classify_emotion(text):
    s = SnowNLP(text)
    sentiment_score = s.sentiments
    # 先根据 SnowNLP 的得分判断大致积极消极
    if sentiment_score > 0.5:
        for word in joy_words:
            if word in text:
                return "喜", sentiment_score
        for word in amusement_words:
            if word in text:
                return "乐", sentiment_score
        return "积极", sentiment_score
    elif sentiment_score < 0.5:
        for word in anger_words:
            if word in text:
                return "怒", sentiment_score
        for word in sorrow_words:
            if word in text:
                return "哀", sentiment_score
        return "消极", sentiment_score
    else:
        return "中性", sentiment_score
  • 输入:一个中文文本字符串 text
  • 功能
    1. 使用 SnowNLP 对输入的文本进行情感分析,得到情感得分 sentiment_score。该得分范围在 0 到 1 之间,越接近 1 表示积极情感越强,越接近 0 表示消极情感越强。
    2. 根据情感得分进行初步的积极、消极或中性判断:
      • 若得分大于 0.5,认为文本具有积极情感。接着检查文本中是否包含 joy_wordsamusement_words 中的词汇,如果包含则分别返回“喜”或“乐”及对应的得分;若不包含则返回“积极”及得分。
      • 若得分小于 0.5,认为文本具有消极情感。检查文本中是否包含 anger_wordssorrow_words 中的词汇,如果包含则分别返回“怒”或“哀”及对应的得分;若不包含则返回“消极”及得分。
      • 若得分等于 0.5,认为文本情感为中性,返回“中性”及得分。
  • 输出:一个元组,包含情感倾向(如“喜”“怒”等)和对应的情感得分。
4. 定义待分析的中文文本列表
chinese_texts = [
    # 此处省略具体文本内容
]

这是一个包含 40 条中文文本的列表,这些文本涵盖了积极、消极和中性等不同情感倾向的内容,用于后续的情感分析。

5. 进行情感分析并输出结果
# 进行情感分析
for text in chinese_texts:
    emotion, score = classify_emotion(text)
    print(f"文本: {text}")
    print(f"情感倾向: {emotion}")
    print(f"情感得分: {score:.2f}")
    print("-" * 50)
  • 遍历 chinese_texts 列表中的每一条文本。
  • 调用 classify_emotion 函数对每条文本进行情感分析,得到情感倾向和得分。
  • 打印出文本内容、情感倾向和保留两位小数的情感得分,并使用分隔线进行分隔,使输出结果更加清晰易读。

from snownlp import SnowNLP

# 构建情感词典
joy_words = ["开心", "快乐", "兴奋", "惊喜", "愉悦", "狂喜", "欣喜"]
anger_words = ["生气", "愤怒", "恼火", "气愤", "恼怒", "发火"]
sorrow_words = ["伤心", "难过", "悲痛", "哀伤", "沮丧", "忧郁"]
# 可以认为乐和喜有一定重合,这里“乐”更偏向于轻松欢快场景
amusement_words = ["有趣", "好玩", "逗乐", "欢乐"]

# 定义情感分类函数
def classify_emotion(text):
    s = SnowNLP(text)
    sentiment_score = s.sentiments
    # 先根据 SnowNLP 的得分判断大致积极消极
    if sentiment_score > 0.5:
        for word in joy_words:
            if word in text:
                return "喜", sentiment_score
        for word in amusement_words:
            if word in text:
                return "乐", sentiment_score
        return "积极", sentiment_score
    elif sentiment_score < 0.5:
        for word in anger_words:
            if word in text:
                return "怒", sentiment_score
        for word in sorrow_words:
            if word in text:
                return "哀", sentiment_score
        return "消极", sentiment_score
    else:
        return "中性", sentiment_score

# 待分析的中文文本列表
chinese_texts   = [
    "这绝对是我近期看到最棒的微博了,内容超有料,必须点赞收藏!",
    "博主太牛了,把这个问题剖析得如此透彻,瞬间让我茅塞顿开。",
    "哇塞,这图片的画质和构图简直完美,每一处细节都无可挑剔。",
    "这个视频太精彩啦,节奏紧凑又有趣,全程都让人目不转睛。",
    "不得不说,博主分享的这个方法太实用了,我试了一下效果超棒。",
    "这篇微博就像一束光,给我带来了新的启发和希望,爱了爱了。",
    "感觉博主就是个宝藏,每次的分享都能给我带来惊喜。",
    "这个活动的创意太棒了,既有趣又有意义,必须支持。",
    "博主的文笔太赞了,文字优美且富有感染力,让人沉浸其中。",
    "这组照片拍得美轮美奂,仿佛把我带入了一个梦幻的世界。",
    "哇,博主的才艺太厉害了,简直是全能选手,太让人佩服了。",
    "这个观点太新颖独特了,为博主的创新思维点赞。",
    "内容好有深度,看得出博主花了很多心思,强烈推荐。",
    "这美食的介绍太诱人了,光看文字我都流口水了,必须去试试。",
    "这微博写得什么呀,内容乱七八糟,完全没有逻辑。",
    "博主分享的这个方法根本没用,浪费了我不少时间。",
    "这图片的质量太差了,模糊不清,完全影响观看体验。",
    "这个视频好无聊啊,节奏拖沓,看得我都快睡着了。",
    "什么破活动,规则复杂又没吸引力,一点都不想参与。",
    "博主的观点太片面了,根本没有考虑到实际情况。",
    "这篇微博就是在凑字数,没有一点实质内容,失望。",
    "照片拍得毫无美感,角度和光线都没把握好。",
    "博主的讲解太糟糕了,说得含糊不清,我完全没听懂。",
    "这个创意太老套了,一点新意都没有,真让人提不起兴趣。",
    "内容太水了,感觉就是在敷衍了事,以后不会再看了。",
    "这美食的描述和实际根本不符,夸大其词,太让人失望了。",
    "博主更新得越来越慢了,一点都不敬业,都快取关了。",
    "这篇微博的内容有一定的参考价值,不过有些地方还可以再完善。",
    "图片拍得中规中矩,没有特别出彩的地方,但也不难看。",
    "这个视频的内容比较普通,没有给我留下太深刻的印象。",
    "博主分享的方法有一定可行性,但可能需要根据实际情况调整。",
    "活动的形式还可以,不过吸引力不是特别大。",
    "博主的观点有一定道理,但也存在一些值得商榷的地方。",
    "这篇微博的文笔还算流畅,但内容缺乏一些亮点。",
    "照片的效果还行,能把场景展示清楚,但没有独特的风格。",
    "博主的讲解比较清晰,但深度可能还不够。",
    "这个创意有一定的想法,但还不够成熟,有待改进。",
    "内容中规中矩,没有特别突出的地方,但也没有明显的缺点。",
    "这美食的介绍让我有一点兴趣,但还不至于特别想去尝试。",
    "博主的更新频率还算稳定,不过内容的质量可以再提高一些。"
]
# 进行情感分析
for text in chinese_texts:
    emotion, score = classify_emotion(text)
    print(f"文本: {text}")
    print(f"情感倾向: {emotion}")
    print(f"情感得分: {score:.2f}")
    print("-" * 50)

总结

这段代码通过 SnowNLP 库和自定义的情感词典,实现了对中文文本的情感分析和细分,能够较为准确地判断文本的情感倾向,并将其归为更细致的情感类别。

更多推荐