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.hqwc.cn/news/307943.html

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

相关文章

昇腾910平台安装驱动、固件、CANN toolkit、pytorch

本文使用的昇腾910平台操作系统是openEuler,之前没了解过,不过暂时感觉用起来和centOS差不多。系统架构是ARM,安装包基本都是带aarch64字样,注意和x86_64区别开,别下错了。 安装依赖 cmake 通过yum安装的cmake版本较…

ES的使用(Elasticsearch)

ES的使用(Elasticsearch) es是什么? es是非关系型数据库,是分布式文档数据库,本质上是一个JSON 文本 为什么要用es? 搜索速度快,近乎是实时的存储、检索数据 怎么使用es? 1.下载es的包(环境要…

Word 将页面方向更改为横向或纵向

文章目录 更改整个文档的方向更改部分页面的方向方法1:方法2: 参考链接 更改整个文档的方向 选择“布局”>“方向”,选择“纵向”或“横向”。 更改部分页面的方向 需要达到下图结果: 方法1: 选:中你要在横向页面…

新品出击 | 软网关BLIoTLink免费发布

新品出击|软网关BLIoTLink免费发布 BLIoTLink是一款免费的物联网协议转换软件,可以部署在任何基于Linux OS的系统(Linux、Debian、Ubuntu、FreeRTOS、RT-Thread)中,使用灵活,可以实现数据的采集以及接入网络平台。 BL…

Mybatis行为配置之Ⅳ—日志

专栏精选 引入Mybatis Mybatis的快速入门 Mybatis的增删改查扩展功能说明 mapper映射的参数和结果 Mybatis复杂类型的结果映射 Mybatis基于注解的结果映射 Mybatis枚举类型处理和类型处理器 再谈动态SQL Mybatis配置入门 Mybatis行为配置之Ⅰ—缓存 Mybatis行为配置…

Mac Pycharm在Debug模式报编码(SyntaxError)错误

1. 错误信息: Traceback (most recent call last):File "/Library/Developer/CommandLineTools/Library/Frameworks/Python3.framework/Versions/3.9/lib/python3.9/tokenize.py", line 330, in find_cookieline_string line.decode(utf-8) UnicodeDeco…

鸿蒙HarmonyOS-图表应用

简介 随着移动应用的不断发展,数据可视化成为提高用户体验和数据交流的重要手段之一。在HarmonyOS应用开发中,一个强大而灵活的图表库是实现这一目标的关键。而MPChart就是这样一款图表库,它为开发者提供了丰富的功能和灵活性,使得…

Adobe 设计精髓:创新的用户体验 | 开源日报 No.130

adobe/react-spectrum Stars: 10.1k License: Apache-2.0 React Spectrum Libraries 是一系列的库和工具,旨在帮助开发者构建适应性强、可访问性好且稳健的用户体验。 核心优势: 提供全面的可访问性和行为支持,符合 WAI-ARIA 编写实践&…

小型内衣洗衣机什么牌子好?口碑好的小型洗衣机

想必大家都知道,我们的内衣裤、袜子这些衣物对卫生方面的要求是比较的高,毕竟是贴身的衣物,因此是要分开清洗的,而不能够跟我们其他的大件衣服一起放入到大型洗衣机里进行混洗,很多就选择了分开单独的手洗,…

K8s陈述式资源管理

命令行:kubectl命令行工具 优点:90%以上的场景都可以满足 对资源的增删改查比较方便,对改不是很友好。 缺点:命令比较冗长,复杂,难记 声明式: 看到声明式都是k8s当中的yml文件来实现资源管理…

python+django网上银行业务综合管理系统vue_bvj8b

本课题主要研究如何用信息化技术改善传统网上银行综合管理行业的经营和管理模式,简化网上银行综合管理的难度,根据管理实际业务需求,调研、分析和编写系统需求文档,设计编写符合银行需要的系统说明书,绘制数据库结构模…

计算机中的数据表示方法

原码表示法: 整数表示,范围: 小数表示: 补码表示可以将减法运算通过加法实现