Python - SnowNLP 情感分析与自定义训练

296a0faa3c3445a28ef011ca274753d1.jpeg

目录

一.引言

二.SnowNLP 情感分析

1.安装 SnowNLP

2.测试 SnowNLP

三.SnowNLP 自定义训练

1.数据集准备

2.训练与保存

3.模型替换

4.模型测试

5.SnowNLP 原理

◆ Bayes 公式

◆ 先验概率

◆ 后验概率

◆ 情感模型

四.总结


 

一.引言

SnowNLP 是一个基于 Python 的简洁的自然语言处理工具包,它提供了文本情感分析、关键词提取、文本分类等功能。该工具包具有简单易用的接口,可帮助用户快速实现文本处理和情感分析任务。SnowNLP 的设计理念是简洁高效,它采用了一些先进的自然语言处理算法,同时也尽量减少了不必要的复杂性,使得用户可以轻松地应用它来处理文本数据。本文主要包括两部分:

◆ SnowNLP 情感分析

◆ SnowNLP 自定义训练

 

二.SnowNLP 情感分析

1.安装 SnowNLP

pip install snownlp -i https://pypi.tuna.tsinghua.edu.cn/simple

439ae58f93ab4ef89887a46bd640052f.png

出现 Successfully 即为安装成功,博主这里 Py == 3.8、snownlp == 0.12.3。

 

2.测试 SnowNLP

from snownlp import SnowNLP

def sentiment_analysis(text):
    # 使用SnowNLP对中文文本进行情感分析
    s = SnowNLP(text)
    # SnowNLP的sentiments方法返回情感倾向分数,越接近1表明情感越积极,越接近0表明情感越消极
    sentiment_score = s.sentiments
    return sentiment_score

直接调用 SnowNLP 方法获取中文文本情感,这里返回 sentiment_score,以 0.5 为界限,越接近于 1 越积极,反之越消极。

    text = "角色塑造太单调,毫无震撼力!"

    score = sentiment_analysis(text)
    print(f"情感分数: {score}")

    if score > 0.5:
        print("该语句是积极的。")
    else:
        print("该语句是消极的。")

 

三.SnowNLP 自定义训练

1.数据集准备

自定义训练数据集主要在原生 SnowNLP 无法满足自己场景的情况下,可以自定义积极、消极的文本,按行放置到 txt 文件中,供 sentiment 进行调整。下面以影视评价为例,pos 和 neg 各添加 100 条影评信息。

◆ pos.txt

482da70eb8374f27a2dbd65709c4320b.png

◆ neg.txt

b75556900160462c89978201df90ac1f.png

 

2.训练与保存

from snownlp import sentiment

def train_self_model():
    pos = "./pos.txt"
    neg = "./neg.txt"
    sentiment.train(neg, pos)
    sentiment.save("sentiment.marshal")

训练结束后会在输出目录得到一个 .marshal.3 的文件:  

b687753ef3444fbeb62aa1f6a9a7570d.png

 

3.模型替换

要使用自己生成的 marshal 模型需要到 python site-package 库里把 SnowNLP sentiment 原始的 mershal.3 模型文件替换掉。

◆ 获取 Site-Packages 路径

在当前 python 环境目录下执行下述脚本获取 Site-Packages 文件路径:

def get_site_pkg_path():
    import site
    # Add snownlp/sentiment
    return site.getsitepackages()[0]

执行后获取对应 Site-Packages 路径地址:

cd /Users/XXX/miniforge3/PythonTest/lib/python3.8/site-packages

 

◆ 修改 mershal 模型

cd snownlp/sentiment

备份 sentiment 库文件夹下的 sentiment.marshal.3 文件,将我们 output 的模型文件 cp 到这里。

f0a0f1f373f141859c741b66757364e2.png

Tips:

最好备份下原始的模型,要不然将来需要还得再 pip install。 

 

4.模型测试

继续调用第二节情感分析一节的 sentiment_analysis 函数测试。

◆ 完整的训练负样本

使用训练过的负样本会得到非常逼近区间 [0,1] 的分数,正样本大家也可以测试下。

    text = "角色塑造太单调,毫无震撼力!"
    score = sentiment_analysis(text)

    -----------------------------
    情感分数: 3.992483776915634e-07
    该语句是消极的。

 

◆ 删减的训练负样本

使用删减过的负样本同样可以得到可靠的情感分析分数。

    text = "毫无震撼力!"
    score = sentiment_analysis(text)

    -------------------------------
    情感分数: 0.004951768064722417   
    该语句是消极的。

 

◆ Bad Case 分析

自定义训练模型后原始判定为消极的句子可能判定为积极,我们去掉消极词后可以看到是由于其他词的 Positive  Ratio 太高,从而把 Negative 的词的 Ratio 带高了,从而造成误判。所以如果大家使用自定义模型,需要注意其可能在你的专业领域得到靠谱的情感分析,但是之前的泛化能力受到影响。

    text = "这个产品真的很垃圾!"
    情感分数: 0.9208253155767703    
    该语句是积极的。

    -------------------------

    text = "这个产品真的很!"
    情感分数: 0.9480748399538199
    该语句是积极的。

 

5.SnowNLP 原理

b27fb597efaf44a59d43f713db4031f0.png

上面是 sentiment 的 __init__ 初始化代码,可以看到其使用的模型类型为 Bayes 概率统计模型,这个模型我们之前在机器学习部分讲过,其通过计算条件概率进行情感分析,核心思想是通过训练样本的分词结果构建先验概率分布,再基于先验概率分布计算出现某个情况后的后验概率。

◆ Bayes 公式

b9df4db8eb4744989ac70a347a9d08a2.png

 

◆ 先验概率

2afae2b2e9f94690a65e8cc3b5dfd5df.png

假设男生女生各 50 人,其通过 B/G 代表,则 P(B) = P(G) = 50 / (50  + 50) = 0.5。

其次规定事件 T 为是否穿长裤,其中男生 75% 的概率穿长裤,即 P(T|B) = 0.75,女生 50% 的概率穿长裤,即 P(T|G) = 0.5,这里 P(T|B/G) 即为先验概率,是我们通过概率统计计算而得。

 

◆ 后验概率

由条件概率公式可得,可以理解为穿长裤的男生的数量与男生穿长裤的数量一致:

P(BT) = P(B) * P(T|B) = P(T) * P(B|T)

由全概率公式可得,可以理解为穿长裤的概率等于男生、女生穿长裤的概率之和:

P(T) = P(B) * P(T|B) + P(G) * P(T|G)

所以可以推导出:

P(B|T) = P(B)·P(T|B) / P(T)

这里 P(B) 男生的概率、P(T) 穿长裤的概率、P(T|B) 男生穿长裤的概率都有,计算可得穿长裤的是男生的概率 P(B|T)。

 

◆ 情感模型

而对于上面情感分析的场景,我们 P(Sentiment) 即为积极 P、消极 N 两种选择,我们获取 text 进行分词得到 w1、w2 且可以得到 P(S|Wi) 即当前词的情感,从而最后推导出情感分析的概率计算:

eq?P%28S_i%7CW%29%20%3D%20%5Cfrac%7BP%28W_1%7CS_i%29P%28W_2%7CS_i%29...P%28W_n%7CS_i%29%5Ccdot%20P%28S_i%29%7D%7BP%28W_1%29P%28W_2%29%5Ccdots%20P%28W_n%29%7D

其中 Wi 为 Text W 中文本分词的结果,Si 对应 P、N 两种情感,我们计算 P(Si|W) 即文本对应的情感 S,P(Wi) 为对应词语出现的频次,P(Wi|Si) 为积极或消极场景中该词出现的概率,以此类推即可计算 Score。 

 

四.总结

SnowNLP 采用 Bayes 模型,支持自定义训练,开箱即用也很轻便,有需要情感分析的同学可以使用,当然语言模型 Bert 甚至大模型 LLM 现在也具备该场景功能,有兴趣的同学也可以微调模型获得更专业的情感分析模型。

完整的 Bayes 实战代码可以参考: 朴素贝叶斯-分类及Sklearn库实现 机器学习实战。

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/346559.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Chrome 插件调试

http://blog.haoji.me/chrome-plugin-develop.html#te-bie-zhu-yi-background-de-bao-cuo 手把手:Chrome浏览器开发系列(四):调试我们开发的插件 - 掘金

5_机械臂运动学基础_矩阵

上次说的向量空间是为矩阵服务的。 1、学科回顾 从科技实践中来的数学问题无非分为两类:一类是线性问题,一类是非线性问题。线性问题是研究最久、理论最完善的;而非线性问题则可以在一定基础上转化为线性问题求解。 线性变换: 数域…

第12章_集合框架(Collection接口,Iterator接口,List,Set,Map,Collections工具类)

文章目录 第12章_集合框架本章专题与脉络1. 集合框架概述1.1 生活中的容器1.2 数组的特点与弊端1.3 Java集合框架体系1.4 集合的使用场景 2. Collection接口及方法2.1 添加2.2 判断2.3 删除2.4 其它 3. Iterator(迭代器)接口3.1 Iterator接口3.2 迭代器的执行原理3.3 foreach循…

基于 pytorch-openpose 实现 “多目标” 人体姿态估计

前言 还记得上次通过 MediaPipe 估计人体姿态关键点驱动 3D 角色模型,虽然节省了动作 K 帧时间,但是网上还有一种似乎更方便的方法。MagicAnimate 就是其一,说是只要提供一张人物图片和一段动作视频 (舞蹈武术等),就可以完成图片…

【模拟】力扣1576(Java)

题目 class Solution {public String modifyString(String ss){char[] s ss.toCharArray();int n s.length;for(int i0;i<n;i){if(s[i] ?){for(char cha;ch<z;ch){if((i 0 || ch!s[i-1])&&(i n-1 || ch! s[i1])){s[i] ch;break;}}}}return String.valu…

forEach()方法跳出循环

forEach方法如何跳出循环_foreach跳出循环-CSDN博客 forEach方法遍历数组&#xff0c;每次遍历都根据条件判断&#xff0c;当条件符合时&#xff0c;就跳出整个遍历&#xff0c;不再继续遍历后面的元素 forEach()方法跳出整个循环遍历 forEach方法一般用抛出异常的方式跳出整…

原生图数据库实现原理解析

目录 前言1 实现原理&#xff1a;免索引邻接1.1 免索引邻接构建1.2 查询性能保障 2. 物理存储实现2.1 节点存储文件2.2 关系边存储文件2.3 属性数据的存储处理 3. RDF图模型和属性图模型的比较3.1 RDF图模型3.2 属性图模型 4. 查询语言比较4.1. SPARQL4.2 Cypher4.3 Gremlin4.4…

摄像机视角的切换_unity基础开发教程

摄像机视角的切换 前言一、场景搭建二、脚本编辑三、脚本挂载四、运行效果结语 前言 我们在游戏中经常可以看到游戏视角的切换&#xff0c;今天我们就做一个视角切换的小demo&#xff0c;学会之后可以将其融入到自己的游戏制作当中。 话不多说&#xff0c;我们现在开始&#xf…

Unity中实现合理塔防寻路机制

前言 在一款TD游戏中,最重要的单位就两大类:防御塔(Tower)和敌人单位(Enemy)。在处理敌人单位的AI行为时,最基本也是最重要的就是自动寻路。在各式TD游戏中,防御塔的攻击方式以及敌人单位的Buff机制往往是能做出差异化的地方;而在寻路问题上,几乎是没有差异的,面对…

如何使用docker实现越权漏洞-webug靶场搭建(超详解)

越权漏洞-webug靶场搭建 1.打开docker systemctl start docker 2.查找webug docker search webug 3.拉取docker.io/area39/webug 镜像 docker pull docker.io/area39/webug 4.查看镜像 docker images 5.创建容器 docker run -d -p 8080:80 --name webug docker.io/area39/we…

Python 第四十三章 MYSQL 补充

多表查询 1.笛卡尔积:将两表所有的数据一一对应,生成一张大表 select * from dep,emp; #两个表拼一起 select * from dep,emp where dep.id emp.dep_id; #找到两表之间对应的关系记录 select * from dep,emp where dep.id emp.dep_id and dep.name技术; #筛选部门名称为技…

Sulfo Cy2 Biotin,水溶性 Cy2 生物素,能够与各种氨基基团特异性结合

您好&#xff0c;欢迎来到新研之家 文章关键词&#xff1a;Sulfo Cyanine2 Biotin&#xff0c;Sulfo Cy2 Biotin&#xff0c;水溶性 Cy2 生物素&#xff0c;Sulfo-Cy2-Biotin&#xff0c;水溶性-Cy2-生物素 一、基本信息 产品简介&#xff1a;Sulfo Cyanine2 Biotin, also k…

npm安装卡住问题(最新版)

npm安装卡住问题(最新版) 背景&#xff1a; ​ 最近这两天用npm安装一些包的时候&#xff0c;发现一直卡住&#xff1a; 报错&#xff1a; idealTree:npm: sill idealTree buildDeps之前能用的现在不能用了&#xff0c;我一想&#xff0c;是不是源头的问题&#xff0c;还真是…

安全防御第二次作业

将内网中各个接口能够ping通自己的网关 1.划分vlan [sw6]vlan batch 2 3 [sw6]int g0/0/2 [sw6-GigabitEthernet0/0/2]port link-type access [sw6-GigabitEthernet0/0/2]port default vlan 2 [sw6-GigabitEthernet0/0/2]int g0/0/3 [sw6-GigabitEthernet0/0/3]port link-t…

JVM/GC复习1---更新中

JVM/GC JVMGC垃圾回收算法1.引用计数法2.标记清除发3.标记压缩算法4.复制算法5.分代算法 收集器1.串行垃圾收集器2.并行垃圾收集器2.CMS垃圾收集器 3.G1垃圾收集器(重点)jdk1.7开始1.9默认的回收器Young GC模式Mixed GCFull GC JVM 待更新中ing GC 垃圾回收:程序运行的时候必…

leetcode刷题(剑指offer) 105.从前序与中序遍历序列构造二叉树

105.从前序与中序遍历序列构造二叉树 给定两个整数数组 preorder 和 inorder &#xff0c;其中 preorder 是二叉树的先序遍历&#xff0c; inorder 是同一棵树的中序遍历&#xff0c;请构造二叉树并返回其根节点。 示例 1: 输入: preorder [3,9,20,15,7], inorder [9,3,15,…

JVM实战(34)——内存溢出之消息队列处理不当

一、简介 本章&#xff0c;我们将介绍一个因为处理消息队列中的数据不当而引起的内存溢出问题&#xff0c;先来看下系统的背景。 1.1 系统背景 这是一个线上的数据同步系统&#xff0c;专门从Kafka消费其它系统送进去的数据&#xff0c;处理后存储到自己的数据库中&#xff1…

TensorFlow 深度学习 开发环境搭建 全教程

PyTorch 深度学习 开发环境搭建 全教程 1、指定清华源命令 -i https://pypi.tuna.tsinghua.edu.cn/simple​ 2、conda安装 这是AI开发环境的全家桶&#xff0c;官网下载链接Anaconda | Start Coding Immediately 尽量不要选择太新版本的python&#xff0c;3.8/3.9就已经足…

一次性密码 One Time Password,简称OTP

一次性密码&#xff08;One Time Password&#xff0c;简称OTP&#xff09;&#xff0c;又称“一次性口令”&#xff0c;是指只能使用一次的密码。一次性密码是根据专门算法、每隔60秒生成一个不可预测的随机数字组合&#xff0c;iKEY一次性密码已在金融、电信、网游等领域被广…

如何系统学习机器学习?

要系统学习机器学习&#xff0c;首先需要掌握一些基础编程技能&#xff0c;如Python。其次&#xff0c;学习基础的数学概念&#xff0c;如线性代数、概率论和统计学。然后&#xff0c;选择一些优质的在线课程和教材进行深入学习。最后&#xff0c;通过实践项目来巩固所学知识。…