Python之自然语言处理库snowNLP

news2024/11/25 2:53:08

一、介绍

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 SnowNLP

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

s = SnowNLP(txt)
print(s.words)

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

# -*- coding:utf-8 -*-
import sys
from snownlp import SnowNLP

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

s = SnowNLP(txt)
for i in s.tags: 
   print(i) 

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

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

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

# -*- coding:utf-8 -*-
import sys
from snownlp import SnowNLP

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

s = SnowNLP(txt)
print(s.sentiments)
   

 4)文本分类(Naiv eBayes)

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

#coding:UTF-8

from snownlp import sentiment

if __name__ == "__main__":
  # 重新训练模型
  sentiment.train('./neg.txt', './pos.txt')
  # 保存好新训练的模型
  sentiment.save('sentiment.marshal')

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

# -*- coding:utf-8 -*-
import sys
from snownlp import SnowNLP

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

s = SnowNLP(txt)
print(s.pinyin)

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

# -*- coding:utf-8 -*-
import sys
from snownlp import SnowNLP

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

s = SnowNLP(txt)
print(s.han)

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

# -*- coding:utf-8 -*-
import sys
from snownlp import SnowNLP

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

s = SnowNLP(txt)
print(s.keywords(5))

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

# -*- coding:utf-8 -*-
import sys
from snownlp import SnowNLP

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

s = SnowNLP(txt)
print(s.summary(5))

10)Tokenization(分割成句子)

# -*- coding:utf-8 -*-
import sys
from snownlp import SnowNLP

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

s = SnowNLP(txt)
print(s.sentences)

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

# -*- coding:utf-8 -*-
import sys
from snownlp import SnowNLP

s = 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 SnowNLP

s = 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 norm
 
def 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 prob
        return 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 prob
        return 1-prob

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

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

其中: 

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

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

相关文章

【Azure 架构师学习笔记】- Azure Databricks (4) - 使用Azure Key Vault 管理ADB Secret

本文属于【Azure 架构师学习笔记】系列。 本文属于【Azure Databricks】系列。 接上文 【Azure 架构师学习笔记】- Azure Databricks (3) - 再次认识DataBricks 前言 Azure Databricks有access token,是具有ADB内部最高权限的token。在云环境中这些高级别权限的sec…

Javaweb小案例-基于SpringBoot+Vue实现的Timo商城

前言 Timo商城是基于Springbootvue的web商城系统,包含了商城的后台管理系统手机端微信小程序端 底层采用web-flash作为底层基础框架搭建 基本功能包含一下模块基础模块 部门管理用户管理角色管理菜单管理权限分配参数管理数据字典管理定时任务管理操作日志登录日志…

写回(write back)与 写分配(write allocate)的差异

写回(write back): 写回是一种缓存策略,它延迟将修改后的数据写入主存。当发生写入操作时,修改的数据首先被写入缓存中。相应的缓存行被标记为“脏”,表示已经被修改。写操作在此时被视为完成,…

饥荒Mod 开发(二五):常用组件 总结

饥荒Mod 开发(二四):制作一把万能工具 在前面的文章介绍了很多和饥荒相关的知识点,做了很多有趣的东西,接下来简单做个总结,总结一下组件的用法 组件用法 一个预制物可以添加多个组件,每个组件会有自己的功能&#x…

模板匹配方法

模板匹配 类似于卷积,模板在原图像上从原点进行滑动,计算模板与原图像被覆盖的地方的差别程度,共用6种计算方法,将每次计算的结果放到一个矩阵里,作为结果输出。 假如原图像大小为AxB,模板为axb&#xff0…

启动springboot时报错 APPLICATION FAILED TO START 包冲突

启动springboot时报错 APPLICATION FAILED TO START 包冲突 problem 具体日志如下 *************************** APPLICATION FAILED TO START ***************************Description:An attempt was made to call a method that does not exist. The attempt was made fr…

【开源】基于Vue+SpringBoot的公司货物订单管理系统

目录 一、摘要1.1 项目介绍1.2 项目录屏 二、功能模块2.1 客户管理模块2.2 商品维护模块2.3 供应商管理模块2.4 订单管理模块 三、系统展示四、核心代码4.1 查询供应商信息4.2 新增商品信息4.3 查询客户信息4.4 新增订单信息4.5 添加跟进子订单 五、免责说明 一、摘要 1.1 项目…

GLTF编辑器实现逼真的石门模型

在线工具推荐: 3D数字孪生场景编辑器 - GLTF/GLB材质纹理编辑器 - 3D模型在线转换 - Three.js AI自动纹理开发包 - YOLO 虚幻合成数据生成器 - 三维模型预览图生成器 - 3D模型语义搜索引擎 在凹凸贴图中,每个像素点都包含了一个法线向量&#xff0…

2020年认证杯SPSSPRO杯数学建模B题(第一阶段)分布式无线广播全过程文档及程序

2020年认证杯SPSSPRO杯数学建模 B题 分布式无线广播 原题再现: 以广播的方式来进行无线网通信,必须解决发送互相冲突的问题。无线网的许多基础通信协议都使用了令牌的方法来解决这个问题,在同一个时间段内,只有唯一一个拿到令牌…

《HelloGitHub》第 93 期

兴趣是最好的老师,HelloGitHub 让你对编程感兴趣! 简介 HelloGitHub 分享 GitHub 上有趣、入门级的开源项目。 这里有实战项目、入门教程、黑科技、开源书籍、大厂开源项目等,涵盖多种编程语言 Python、Java、Go、C/C、Swift...让你在短时间内…

2023年高级软考系统架构师考题参考

对于一些有实践经验的同学来说,感觉不难,但是落笔到纸面上,就差强人意了,平时这方面要多练习,所想所思要落到纸面上,或者表达清晰让别人听懂,不仅是工作中的一个基本素质,也是个非常…

OpenHarmony 应用通用签名

一.背景 由于hap包需要经过签名才能安装到设备上,在DevEco Studio可以进行自动签名,但是自动签名只能安装在当前的设备上,在其他设备上不能安装,所以我们需要进行通用的手动签名,手动签名HarmonyOS和OpenHarmony流程是…

写实风格3D模型材质贴图

在线工具推荐: 3D数字孪生场景编辑器 - GLTF/GLB材质纹理编辑器 - 3D模型在线转换 - Three.js AI自动纹理开发包 - YOLO 虚幻合成数据生成器 - 三维模型预览图生成器 - 3D模型语义搜索引擎 写实3D模型的制作过程包括建模、材质贴图、灯光设置和渲染等步骤。首…

智慧工地解决方案,智慧工地项目管理系统源码,支持大屏端、PC端、手机端、平板端

智慧工地解决方案依托计算机技术、物联网、云计算、大数据、人工智能、VR&AR等技术相结合,为工程项目管理提供先进技术手段,构建工地现场智能监控和控制体系,弥补传统方法在监管中的缺陷,最线实现项目对人、机、料、法、环的全…

Baumer工业相机堡盟相机如何使用NEOAPI SDK实现相机的连接(C++)

Baumer工业相机堡盟相机如何使用NEOAPI SDK实现相机的连接(C) Baumer工业相机Baumer工业相机SDK技术背景代码分析第一步:先使用NEOAPI函数查找相机第二步:连接相机后对相机进行采图第三步:将采集的图像显示在UI界面上 …

数据缓存(Redis, Spring Cache)——后端

场景:给用户端展示的数据都是通过查询数据库所得,因此数据库访问压力会随着用户访问量增大而增加,从而导致系统响应慢、用户体验差。 方法:通过Redis缓存数据,减少查询数据库操作。(Redis的数据是存储在内存…

vscode 支持c,c++编译调试方法

概述:tasks.jason launch.json settings.json一定要有,没有就别想跑。还有就是c 和c配置有区别,切记,下文有说 1.安装扩展插件。 2.安装编译器,gcc.我用的是x86_64-8.1.0-release-win32-seh-rt_v6-rev0.7z &#xf…

GLTF编辑器-位移贴图实现破碎的路面

在线工具推荐: 3D数字孪生场景编辑器 - GLTF/GLB材质纹理编辑器 - 3D模型在线转换 - Three.js AI自动纹理开发包 - YOLO 虚幻合成数据生成器 - 三维模型预览图生成器 - 3D模型语义搜索引擎 位移贴图是一种可以用于增加模型细节和形状的贴图。它能够在渲染时针…

水准网、平面导线平差

东北大学测绘工程水准网、平面闭合导线间接平差法平差C#项目。 闭合导线程序界面: 水准网程序界面: 项目gitee地址: horizon: 东北大学测绘工程水准网,闭合导线间接平差法C#项目 (gitee.com) 注:此项目为本博主代人转…

DCDC--电感的选择和影响

1、感值L的影响 1.1、纹波Ripple的影响:感值越大,纹波越小 1.2、负载瞬态响应Load Transient的影响:感值越大,负载瞬态响应越差 2、直流电阻DCR的影响 2.1、效率Efficiency的影响 相同型号,感值越大,DC…