Python之自然语言处理库snowNLP

一、介绍

SnowNLP是一个python写的类库,可以方便的处理中文文本内容,是受到了TextBlob的启发而写的,由于现在大部分的自然语言处理库基本都是针对英文的,于是写了一个方便处理中文的类库,并且和TextBlob不同的是,这里没有用NLTK,所有的算法都是自己实现的,并且自带了一些训练好的字典。注意本程序都是处理的unicode编码,所以使用时请自行decode成unicode。

GitHub - isnowfy/snownlp: Python library for processing Chinese text

二、snowNLP操作详解

2.1 安装

pip install snownlp 

2.2 功能详解

1)中文分词(Character-Based Generative Model)

# -*- coding:utf-8 -*-
import sys
from snownlp import SnowNLPtxt = u'''在文学的海洋中,有一部名为《薄雾》的小说,它犹如一颗闪耀的明珠,让人过目难忘。这部作品讲述了一段发生在上世纪初的跨越阶级的爱情故事。在这篇文学短评中,我们将探讨这部小说所展现的情感与人性,以及它在文学史上的地位。'''s = SnowNLP(txt)
print(s.words)

2)词性标注(TnT 3-gram 隐马)

# -*- coding:utf-8 -*-
import sys
from snownlp import SnowNLPtxt = u'''在文学的海洋中,有一部名为《薄雾》的小说,它犹如一颗闪耀的明珠,让人过目难忘。这部作品讲述了一段发生在上世纪初的跨越阶级的爱情故事。在这篇文学短评中,我们将探讨这部小说所展现的情感与人性,以及它在文学史上的地位。'''s = SnowNLP(txt)
for i in s.tags: print(i) 

3)情感分析(朴素贝叶斯算法)

现在训练数据主要是买卖东西时的评价,所以对其他的一些可能效果不是很好。

情感分析的结果是一个0~1之间的数字,数字越大表示这句话越偏向于肯定的态度,数字越小表示越偏向于否定的态度。

# -*- coding:utf-8 -*-
import sys
from snownlp import SnowNLPtxt = u'''在文学的海洋中,有一部名为《薄雾》的小说,它犹如一颗闪耀的明珠,让人过目难忘。这部作品讲述了一段发生在上世纪初的跨越阶级的爱情故事。在这篇文学短评中,我们将探讨这部小说所展现的情感与人性,以及它在文学史上的地位。'''s = SnowNLP(txt)
print(s.sentiments)

 4)文本分类(Naiv eBayes)

模型训练(若是想要利用新训练的模型进行情感分析,可修改 snownlp/seg/__init__.py 里的data_path指向刚训练好的文件)

#coding:UTF-8from snownlp import sentimentif __name__ == "__main__":# 重新训练模型sentiment.train('./neg.txt', './pos.txt')# 保存好新训练的模型sentiment.save('sentiment.marshal')

5)转换成拼音(Trie树实现的最大匹配)

# -*- coding:utf-8 -*-
import sys
from snownlp import SnowNLPtxt = u'''在文学的海洋中,有一部名为《薄雾》的小说,它犹如一颗闪耀的明珠,让人过目难忘。这部作品讲述了一段发生在上世纪初的跨越阶级的爱情故事。在这篇文学短评中,我们将探讨这部小说所展现的情感与人性,以及它在文学史上的地位。'''s = SnowNLP(txt)
print(s.pinyin)

6)繁体转简体(Trie树实现的最大匹配)

# -*- coding:utf-8 -*-
import sys
from snownlp import SnowNLPtxt = u'''在文學的海洋中,有一部名為《薄霧》的小說,它猶如一顆閃耀的明珠,讓人過目難忘。 這部作品講述了一段發生在上世紀初的跨越階級的愛情故事。 在這篇文學短評中,我們將探討這部小說所展現的情感與人性,以及它在文學史上的地位。'''s = SnowNLP(txt)
print(s.han)

7)提取文本关键词(TextRank算法)

# -*- coding:utf-8 -*-
import sys
from snownlp import SnowNLPtxt = u'''在文学的海洋中,有一部名为《薄雾》的小说,它犹如一颗闪耀的明珠,让人过目难忘。这部作品讲述了一段发生在上世纪初的跨越阶级的爱情故事。在这篇文学短评中,我们将探讨这部小说所展现的情感与人性,以及它在文学史上的地位。'''s = SnowNLP(txt)
print(s.keywords(5))

8)提取文本摘要(TextRank算法)

# -*- coding:utf-8 -*-
import sys
from snownlp import SnowNLPtxt = u'''在文学的海洋中,有一部名为《薄雾》的小说,它犹如一颗闪耀的明珠,让人过目难忘。这部作品讲述了一段发生在上世纪初的跨越阶级的爱情故事。在这篇文学短评中,我们将探讨这部小说所展现的情感与人性,以及它在文学史上的地位。'''s = SnowNLP(txt)
print(s.summary(5))

10)Tokenization(分割成句子)

# -*- coding:utf-8 -*-
import sys
from snownlp import SnowNLPtxt = u'''在文学的海洋中,有一部名为《薄雾》的小说,它犹如一颗闪耀的明珠,让人过目难忘。这部作品讲述了一段发生在上世纪初的跨越阶级的爱情故事。在这篇文学短评中,我们将探讨这部小说所展现的情感与人性,以及它在文学史上的地位。'''s = SnowNLP(txt)
print(s.sentences)

 9)tf(词频),idf(逆文档频率:可以用于tf-idf关键词提取)

# -*- coding:utf-8 -*-
import sys
from snownlp import SnowNLPs = SnowNLP([[u'这篇', u'文章'],[u'那篇', u'论文'],[u'这个']])print("tf:")
print(s.tf)
print("\n")print("idf:")
print(s.idf)

11)文本相似(BM25)

1. 文本的相似度是通过上面的tf和idf来计算的,这里给出的也是词的相似度分析。

# -*- coding:utf-8 -*-
import sys
from snownlp import SnowNLPs = SnowNLP([[u'这篇', u'文章'],[u'那篇', u'论文'],[u'这个']])print(s.sim([u'文章']))

2. 用 sklearn库的句子相似度的计算方法,计算 TF 矩阵中两个向量的相似度,实际上就是求解两个向量夹角的余弦值:点乘积除以二者的模长,公式如下

cosθ=a·b/|a|*|b|

from sklearn.feature_extraction.text import CountVectorizer
import numpy as np
from scipy.linalg import normdef tf_similarity(s1, s2):def add_space(s):return ' '.join(s)# 将字中间加入空格s1, s2 = add_space(s1), add_space(s2)# 转化为TF矩阵cv = CountVectorizer(tokenizer=lambda s: s.split())corpus = [s1, s2]vectors = cv.fit_transform(corpus).toarray()# 计算TF系数return np.dot(vectors[0], vectors[1]) / (norm(vectors[0]) * norm(vectors[1]))s1 = '我出生在中国'
s2 = '我生于中国'
print(tf_similarity(s1, s2))  # 结果:0.7302967433402214

2.3 情感分析源码解析

class Sentiment(object):def __init__(self):self.classifier = Bayes() # 使用的是Bayes的模型def save(self, fname, iszip=True):self.classifier.save(fname, iszip) # 保存最终的模型def load(self, fname=data_path, iszip=True):self.classifier.load(fname, iszip) # 加载贝叶斯模型# 分词以及去停用词的操作    def handle(self, doc):words = seg.seg(doc) # 分词words = normal.filter_stop(words) # 去停用词return words # 返回分词后的结果def train(self, neg_docs, pos_docs):data = []# 读入负样本for sent in neg_docs:data.append([self.handle(sent), 'neg'])# 读入正样本for sent in pos_docs:data.append([self.handle(sent), 'pos'])# 调用的是Bayes模型的训练方法self.classifier.train(data)def classify(self, sent):# 1、调用sentiment类中的handle方法# 2、调用Bayes类中的classify方法ret, prob = self.classifier.classify(self.handle(sent)) # 调用贝叶斯中的classify方法if ret == 'pos':return probreturn 1-probclass Sentiment(object):def __init__(self):self.classifier = Bayes() # 使用的是Bayes的模型def save(self, fname, iszip=True):self.classifier.save(fname, iszip) # 保存最终的模型def load(self, fname=data_path, iszip=True):self.classifier.load(fname, iszip) # 加载贝叶斯模型# 分词以及去停用词的操作    def handle(self, doc):words = seg.seg(doc) # 分词words = normal.filter_stop(words) # 去停用词return words # 返回分词后的结果def train(self, neg_docs, pos_docs):data = []# 读入负样本for sent in neg_docs:data.append([self.handle(sent), 'neg'])# 读入正样本for sent in pos_docs:data.append([self.handle(sent), 'pos'])# 调用的是Bayes模型的训练方法self.classifier.train(data)def classify(self, sent):# 1、调用sentiment类中的handle方法# 2、调用Bayes类中的classify方法ret, prob = self.classifier.classify(self.handle(sent)) # 调用贝叶斯中的classify方法if ret == 'pos':return probreturn 1-prob

从上述的代码中,classify函数和train函数是两个核心的函数,其中,train函数用于训练一个情感分类器,classify函数用于预测。在这两个函数中,都同时使用到的handle函数,handle函数的主要工作为对输入文本分词去停用词。

情感分类的基本模型是贝叶斯模型 Bayes,对于贝叶斯模型,这里就先介绍一下机器学习算法—朴素贝叶斯的公式,详细说明可查看 python版 朴素贝叶斯-基础 - 简书。对于有两个类别c1和c2的分类问题来说,其特征为w1,⋯,wn,特征之间是相互独立的,属于类别c1的贝叶斯模型的基本过程为:

其中: 

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

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

相关文章

在ubuntu上挂载QNX 镜像

步骤 1,将QNX imge转换成android sparse镜像 这个QNX镜像可以是直接从QNX分区读取得到或者你的刷机包中的镜像: rootubuntu:~/workspace/$ file qnx_img.img qnx_img.img: DOS/MBR boot sector使用python tools/mksparse.py $镜像文件 转换为android …

elasticsearch 笔记三:查询建议介绍、Suggester、自动完成

一、查询建议介绍 1. 查询建议是什么? 查询建议,为用户提供良好的使用体验。主要包括: 拼写检查; 自动建议查询词(自动补全) 拼写检查如图: 自动建议查询词(自动补全)…

Rust之构建命令行程序(二):读取文件

开发环境 Windows 10Rust 1.74.1 VS Code 1.85.1 项目工程 这次创建了新的工程minigrep. 读取文件 现在,我们将添加读取file_path参数中指定的文件的功能。首先,我们需要一个样本文件来测试它:我们将使用一个包含少量文本的文件,多行包含一…

使用Python实现Linux惠尔顿上网认证客户端

在本文中,我们将展示如何使用Python编写一个简单的脚本来实现Linux下的惠尔顿上网认证。以下是我们需要的参数和值: wholeton_host: 惠尔顿服务器地址,例如 192.168.10.10wholeton_user: 用户名,例如 AABBCCwholeton_pass: 密码&…

【图像分类】【深度学习】【轻量级网络】【Pytorch版本】ShuffleNet_V2模型算法详解

【图像分类】【深度学习】【轻量级网络】【Pytorch版本】ShuffleNet_V2模型算法详解 文章目录 【图像分类】【深度学习】【轻量级网络】【Pytorch版本】ShuffleNet_V2模型算法详解前言ShuffleNet_V2讲解四条实用指导思想G1:相等的通道宽度可以降低存储访问成本G2:大量的分组卷积…

uboot学习及内核更换_incomplete

官方文档 在前面 文章目录 uboot常见命令学习环境变量网络控制台uboot标准启动其他 升级uboot或内核bin和uimg以及booti和bootm的区别制作uImage更换内核更换uboot后续计划 uboot常见命令学习 环境变量 Environment Variables环境变量 autostart 如果值为yes,则会…

labelme将JSON标记文件转换为二值PNG图像

看了好几篇博客。在使用他们的代码时,出现了各种各样的问题;在底下留言时,博主大多是充耳不闻。感觉CSDN的质量越来越次了,有时候真还不如直接问chatGPT呢。 要将labelme生成的JSON标记文件转换为PNG二值图像,只需运行…

【Shell编程练习】监控内存和磁盘容量,小于给定值时报警

系列文章目录 输出Hello World 通过位置变量创建 Linux 系统账户及密码 系列文章目录分析代码实现运行结果 分析 对于磁盘容量,可以使用df命令查看指定指定分区的磁盘使用情况。比如 然后我们需要从这段输出中提取我们想要的信息。在这里就是Available字段的值。…

【wargames】bandit0~9关wp

第1关直接ssh连接,获得密码NH2SXQwcBdpmTEzi3bvBHMM9H66vVXjL,用这个密码连接第2关 第2关,连接之后查看 存在特殊字符的文件 因为使用 - 作为参数是指 STDIN/STDOUT 即 dev/stdin 或 dev/stdout 。所以如果你想打开这种类型的文件&#xff0…

数据结构--二叉搜索树的实现

目录 1.二叉搜索树的概念 2.二叉搜索树的操作 二叉搜索树的插入 中序遍历(常用于排序) 二叉搜索树的查找 二叉搜索树的删除 完整二叉树代码: 二叉搜索树的应用 key/value搜索模型整体代码 1.二叉搜索树的概念 二叉搜索树又称二叉排序树,它或者是一…

基于JAVA的考研专业课程管理系统 开源项目

目录 一、摘要1.1 项目介绍1.2 项目录屏 二、功能模块2.1 数据中心模块2.2 考研高校模块2.3 高校教师管理模块2.4 考研专业模块2.5 考研政策模块 三、系统设计3.1 用例设计3.2 数据库设计3.2.1 考研高校表3.2.2 高校教师表3.2.3 考研专业表3.2.4 考研政策表 四、系统展示五、核…

SAP CO系统配置-获利能力分析-(机器人制造项目实例)

创建经营组织 配置路径 IMG菜单路径:企业结构>定义>控制>创建经营组织 事务代码 KEP8 屏幕截图: 维护特性 配置路径

nodejs+vue+ElementUi农产品团购销售系统zto2c

目标是为了完成小区团购平台的设计和实现,在疫情当下的环境,方便小区业主购入生活所需,减小居民的生活压力 采用B/S模式架构系统,开发简单,只需要连接网络即可登录本系统,不需要安装任何客户端。开发工具采…

Python/R/GUI/BI类型常用数据可视化工具

什么是数据可视化工具? 数据可视化工具是指旨在可视化数据的所有形式的软件。它们处理数据输入,将其转换为用户可以根据自己的需求进行定制的视觉效果。 不同的工具可以包含不同的功能,但最基本的是,数据可视化工具提供输入数据集…

CDN:内容分发的高速公路(下)

🤍 前端开发工程师(主业)、技术博主(副业)、已过CET6 🍨 阿珊和她的猫_CSDN个人主页 🕠 牛客高级专题作者、在牛客打造高质量专栏《前端面试必备》 🍚 蓝桥云课签约作者、已在蓝桥云…

百度编辑器常用设置

1、创建编辑器 UE.getEditor(editor, { initialFrameWidth:"100%" //初始化选项 }) 精简版 UE.getEditor(editor) 2、删除编辑器 UE.getEditor(editor).destroy(); 3、使编辑器获得焦点 UE.getEditor(editor).focus(); 4、获取编辑器内容 UE.getEditor(editor).getCo…

蓝牙曝底层安全漏洞,数十亿设备受影响

内容概括: Eurecom的研究人员近期分享了六种新型攻击方式,统称为"BLUFFS",这些攻击方式能够破坏蓝牙会话的保密性,使设备容易受到冒充和中间人攻击(MitM)。攻击发现者Daniele Antonioli解释道,"BLUFFS…

flask之文件管理系统-项目 JRP上线啦!!! ---修订版,兼容Windows和Linux系统

上一章的版本https://blog.csdn.net/weixin_44517278/article/details/135275066,在Windows下debug完成无异常后,上传到我的树莓下开始正式服役 由于开发环境是Windows,使用环境是Linux,导致最后没能成功运行起来 这个版本是今天去…

数据预处理中,异常值的检测方法

在数据预处理中,异常值(outlier)是指与其他数据明显不同的数据点,它们可能是由于测量误差、数据录入错误、样本选取错误或者随机事件等原因导致的。异常值可能会对数据分析和建模产生负面影响,因此需要对其进行检测和处…

HTML滚动字幕怎么实现?一招教你解决

滚动字幕标签&#xff1a;marquee 使用<marquee>标签可以将文字设置为动态滚动的效果。 语法&#xff1a; <marquee>标签语法 滚动方向属性 <marquee direction"滚动方向">滚动文字</marquee> 滚动方式属性 <marquee behavior"滚…