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 SnowNLPdef sentiment_analysis(text):# 使用SnowNLP对中文文本进行情感分析s = SnowNLP(text)# SnowNLP的sentiments方法返回情感倾向分数,越接近1表明情感越积极,越接近0表明情感越消极sentiment_score = s.sentimentsreturn 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 sentimentdef 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/sentimentreturn 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.mzph.cn/news/641859.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

网络安全产品之认识防毒墙

在互联网发展的初期,网络结构相对简单,病毒通常利用操作系统和软件程序的漏洞发起攻击,厂商们针对这些漏洞发布补丁程序。然而,并不是所有终端都能及时更新这些补丁,随着网络安全威胁的不断升级和互联网的普及&#xf…

Android双指缩放ScaleGestureDetector检测放大因子大图移动到双指中心点ImageView区域中心,Kotlin

Android双指缩放ScaleGestureDetector检测放大因子大图移动到双指中心点ImageView区域中心,Kotlin 在 Android双击图片放大移动图中双击点到ImageView区域中心,Kotlin-CSDN博客 基础上,这次使用ScaleGestureDetector检测两根手指的缩放动作&a…

Python如何叠加两张图片

我这里有如下两张图片,需要把他们叠加在一起,进行查看。这两张图片的大小都是300 300。不拼接在一起就不方便查看。需要把左边的小图,放到右边大图的中间。 一、拼接两个图片的代码 要解决这个问题,你可以使用fromarray()方法将…

JoyRL Actor-Critic算法

策略梯度算法的缺点 这里策略梯度算法特指蒙特卡洛策略梯度算法,即 REINFORCE 算法。 相比于 DQN 之类的基于价值的算法,策略梯度算法有以下优点。 适配连续动作空间。在将策略函数设计的时候我们已经展开过,这里不再赘述。适配随机策略。由…

MATLAB数据处理: 每种样本类型随机抽样

tn5;% 每种类型随机抽样数 indextrain[];% 训练样本序号集 for i1:typenumber index301 find(typemat i); n2length(index301); index302randperm(n2); index401index301(index302(1:tn)); indextrain[indextrain; index401]; end 该代码可以对大样…

java进阶

文章目录 一、Java进阶1.注解(Annotation)a.内置注解b.元注解c.自定义注解 2.对象克隆3. Java设计模式(Java design patterns)a.软件设计模式概念b.建模语言(UML)c.面向对象设计原则d.设计模式 总结面向对象…

从0开始学习mysql 第十六课:数据库锁及InnoDB锁机制

第十六课:数据库锁及InnoDB锁机制 学习目标 今天我们要深入学习以下内容: 理解数据库锁的作用及其对事务控制的重要性。详细了解InnoDB支持的锁类型:共享锁(S锁)、排他锁(X锁)。掌握意向锁&a…

分享一个C++下使用简单的反射实现的程序模块化的思路

分享一个C下使用简单的反射实现的程序模块化的思路 首先说一个基本问题,项目大了以后,一定要做模块化处理,每个模块处理各自的事情,各个模块之间尽量不要有太多的耦合,就是说模块A尽量不要依赖模块B,模块B…

栈的基本操作(c++题解)

题目描述 栈:插入元素和删除元素只能在线性表的一端进行,所以遵循“先进后出 (LIFO) ”原则,其中插入和删除的一端称为栈顶 (top)。我们可以把栈比喻成一个箱子,只能在箱子的开口处放入和取出物体,而且是后放入的物体…

项目工程下载与XML配置文件下载:EtherCAT超高速实时运动控制卡XPCIE1032H上位机C#开发(十)

XPCIE1032H功能简介 XPCIE1032H是一款基于PCI Express的EtherCAT总线运动控制卡,可选6-64轴运动控制,支持多路高速数字输入输出,可轻松实现多轴同步控制和高速数据传输。 XPCIE1032H集成了强大的运动控制功能,结合MotionRT7运动…

MongoDB之整合SpringBoot

MongoTemplate 方式 依赖 <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-mongodb</artifactId></dependency>创建账户 # 切换到数据库 use study # 创建账户 db.createUser({user:&quo…

深度解析Oladance、韶音、南卡开放式耳机:选购指南与天花板级推荐

​随着开放式耳机在日常生活中越来越受欢迎&#xff0c;许多品牌纷纷降低材料品质以迎合大众需求&#xff0c;导致耳机的性能和音质严重下滑。这让消费者在选择优质开放式耳机时感到困惑。作为一名专业的耳机评测人员&#xff0c;我近期对多款热门开放式耳机进行了深入的测评&a…

Leetcode—92.反转链表II【中等】

2023每日刷题&#xff08;八十一&#xff09; Leetcode—92.反转链表II 算法思想 实现代码 /*** Definition for singly-linked list.* struct ListNode {* int val;* ListNode *next;* ListNode() : val(0), next(nullptr) {}* ListNode(int x) : val(x), n…

kubernetes Pod 异常排查步骤

kubernetes Pod 异常排查步骤 详细排查图查看容器状态查看容器列表容器未启动成功排查容器启动成功排查pod状态对应原因 详细排查图 查看容器状态 查看容器列表 查看容器列表,最好在后面跟上命名空间,不跟上查询出来是默认的 kubectl get pods -n kubesphere-system单独查看某…

【Spring 篇】深入探讨MyBatis映射文件中的动态SQL

MyBatis&#xff0c;这个名字在Java开发者的世界中犹如一道光芒&#xff0c;照亮着持久层操作的道路。而在MyBatis的映射文件中&#xff0c;动态SQL则是一个让人爱-hate的存在。有时候&#xff0c;你感叹它的灵活性&#xff0c;有时候&#xff0c;你可能会为它的繁琐而头痛。但…

【Linux 内核源码分析】内存屏障

内存屏障 内存屏障的作用是强制对内存的访问顺序进行排序&#xff0c;保证多线程或多核处理器下的内存访问的一致性和可见性。通过插入内存屏障&#xff0c;可以防止编译器对代码进行过度优化&#xff0c;也可以解决CPU乱序执行引起的问题&#xff0c;确保程序的执行顺序符合预…

windows 11安装VMware 17 ,VMware安装Ubuntu 20.4

一、下载安装激活VMware 17 下载与激活&#xff1a;Vmware 17 下载地址、最新激活码 2024 _ 注意&#xff1a;安装路径自己选择&#xff0c;路径中尽可能避免中文或空格 二、下载Ubuntu 镜像 下载镜像地址&#xff1a;清华大学开源软件镜像站 点开下载镜像地址&#xff0c;找…

中科星图——Sentinel-2_MSI_L2A数据集

数据名称&#xff1a; Sentinel-2_MSI_L2A 数据来源&#xff1a; Copernicus 时空范围&#xff1a; 2022年10月-2023年1月 空间范围&#xff1a; 全国 数据简介&#xff1a; 哨兵2号&#xff08;Sentinel-2&#xff09;卫星是高分辨率多光谱成像卫星&#xff0c;携带一…

144 两两交换链表中的节点

问题描述&#xff1a;给定一个链表&#xff0c;两两交换其中相邻的节点&#xff0c;并返回交换后的链表。例如[1,2,3,4]变为[2,1,4,3] public ListNode changeNode(ListNode root) { ListNode prenull; ListNode firstChangeroot; ListNode secondChangeroot.next; ListNode r…

腾讯云香港云主机cn2网路线路说明

腾讯云香港轻量线路国际中国电信cn2高速网络。腾讯云轻量服务器电信移动联通三网测速&#xff08;腾讯云中国大陆地域是多线BGP高速线路&#xff0c;所以访问速度不用担心&#xff09;&#xff0c;如果是香港地域的轻量服务器&#xff0c;国内访问会不会绕路呢&#xff1f;阿腾…