一年前老师给了我一个文本数据分析的项目,所以稍微了解了一下中文文本分析的非常浅显的知识,在此做一下记录。因为自然语言处理这一块我只是为了完成项目而做了一些了解,所以肯定有不太对的地方,谅解一下啦~、

---------------------一个假的目录----------------------

自己对于文本分析的理解

文本分析的流程

jieba分词工具涉及到的算法原理简介(自己的浅显理解)

jieba分词工具的用法

1自己对于文本分析的理解

文本分析就是从一段文字性数据中,阅读理解出作者的意思,比如好恶、倾向、情绪等等或是分析文本的客观类别(比如电影的类型)。使用到的领域是非常多的,比如论文打分系统、判断论文有没有抄袭的系统、舆情分析、股民情绪分析等等。

我最近接触到的呢就是文本按照类型聚类、文本相似度分析、从论坛或者新闻中分析出股民的情绪等等课题,需要使用到的文本数据处理工具和算法最多的就是jieba分词工具、一些词典、TF-IDF、余弦相似度算法,真的是自然语言处理中最基础的部分啦。(所以我的记录真的是纯菜鸡的记录♪(^∇^*)   嘻嘻)

2文本分析的流程

所有文本分析课题的流程都逃不开这几步:(自我感觉哈)

数据收集

数据清洗

文本向量化

模型训练

分析结果

这几步中的每一步里面涵盖的很多问题都把我整的晕头转向.....数据收集涉及到爬虫、清洗涉及到分词、去重、删除或者填补空值和错值、提取关键词汇等步骤,向量化又是另一个long long long story了...里面涉及了无监督算法、有监督算法、词典之类的东西,模型训练就更别提那么多种机器学习模型和统计模型了.....等做到分析结果的时候,要是结果不如意还得重新来....终于知道自己头发怎么没有的了,真是苍天告诉我不要认输.......(灬ꈍ ꈍ灬)

哈哈,内容是不是超级多,不过文章篇幅有限(懒),这里我只把学习到的数据清洗中的分词和关键词提取方法做个简单的介绍~

3jieba分词工具涉及到的算法原理简介(自己的浅显理解)

jieba中文分词工具,就是把文章中的句子分成一个个的词汇的工具(废话!),这个工具包可以分词、计算词频、标注词性、计算TF-IDF值、提取关键词,还支持繁体分词,可以加载自定义词典,所以对于中文文本分析来说是一个非常的实用的工具包。

它支持三种分词模式:

  • 精确模式,试图将句子最精确地切开,适合文本分析;
  • 全模式,把句子中所有的可以成词的词语都扫描出来, 速度非常快,但是不能解决歧义;
  • 搜索引擎模式,在精确模式的基础上,对长词再次切分,提高召回率,适合用于搜索引擎分词。

是不是有点不明白这三种模式?没关系,来个例子试试看:

# -*- coding: utf-8 -*-
import jiebas1 = '啊啦啦,今天外面下雨啦,我不去四川博物院了,想吃螺蛳粉和火锅。'result1 = jieba.lcut_for_search(s1,HMM=False)#搜索模式
result2 = jieba.lcut(s1,cut_all=True,HMM=False)#全模式
result3 = jieba.lcut(s1,cut_all=False,HMM=False)#精确模式print('搜索模式:',' '.join(result1))
print('全模式:',' '.join(result2))
print('精确模式:',' '.join(result3))

结果分别是酱紫的(虽然前天才吃了火锅,是我还是想吃,还有臭辣臭辣的螺蛳粉~):

搜索模式: 啊 啦 啦 , 今天 外面 下雨 啦 , 我 不 去 四川 博物 博物院 了 , 想 吃 螺蛳 粉 和 火锅 。
全模式: 啊 啦 啦   今天 天外 外面 下雨 啦   我 不 去 四川 博物 博物院 了   想 吃 螺蛳 粉 和 火锅  
精确模式: 啊 啦 啦 , 今天 外面 下雨 啦 , 我 不 去 四川 博物院 了 , 想 吃 螺蛳 粉 和 火锅 。

在搜索模式下,长词比如 博物院被进行了划分,分成了 博物和博物院,而精确模式就没有,全模式把所有可能的词语组合比如 天外,外面都识别出来了,另外他们三个都没有识别出螺蛳粉这个长词(毫无吃货的灵性,螺蛳和螺蛳粉完全不一样好不好,这样就会导致出现后续语义分析错误的问题,比如外卖买错...)这个怎么解决就后面再说啦!

接下来介绍一下实现算法:

  • 基于前缀词典实现高效的词图扫描,生成句子中汉字所有可能成词情况所构成的有向无环图 (DAG)
  • 采用了动态规划查找最大概率路径, 找出基于词频的最大切分组合
  • 对于未登录词,采用了基于汉字成词能力的 HMM 模型,使用了 Viterbi 算法

看不懂对不对!!!

我查了查资料+发挥imagenation,翻译一下人话版本:

jieba工具包自己有个词典,句子来了,先把句子里面出现的字能够组成的词汇查出来(辛苦的小学生),然后根据词语们出现的次数(词频)来判断该词语在句子里面可能是它出现的概率,选择最大概率的词汇输出。如果词典里面没有这个词,就可以使用HMM(隐藏马尔科夫模型),Viterbi 算法生成新的词汇输出。

是不是还是不太理解?

你就想想,小时候我们学习句子,是不是有个新华字典在旁边,遇见了不懂的字和词就查一查,发现这个字原来可以这样组词啊,然后判断在这个句子里面应该是这样组词的概率(我们是凭感觉,计算机靠算法),最后确认就是这个词语。字典查不到这个词,我们也能通过思考,觉得嗯,可以这样组词。

懂了吗?我们通过思考和感觉来给理解句子,学习生词,而计算机靠算法。那么HMM和Viterbi 算法又是什么东东嘞?查了一下别的大神的资料,大概理解是这样滴:

HMM是隐藏马尔科夫模型,一种统计算法,它用来描述一个含有隐含未知参数的马尔可夫过程。马尔科夫过程就是一个随机过程:在已知它所处的状态的条件下,它未来的演变不依赖于它以往的演变。这种已知“现在”的条件下,“将来”与“过去”独立的特性称为马尔可夫性,具有这种性质的随机过程叫做马尔可夫过程。比如摸麻将、掷骰子等。

隐藏马尔科夫模型主要有几个属性:

隐藏状态

可见状态链

转移概率

我自己的理解就是: 隐藏状态,比如骰子投掷结果,123456这种我们是知道的,但是每次投的结果是不知道的叫做隐藏状态,可见状态链就是投掷n次后的观测结果,比如投第一次是6,第二次是5.....转移概率就是从隐藏状态转化为可见状态的概率,对于均匀的六面体骰子来说每个结果出现的概率就是1/6,所以转换概率就是1/6。(不知道这样理解是不是正确的,大佬千万不要骂我,作为一个内心脆弱的渣渣真的会哭出来的。)

所以对于分词来说,词汇是知道的,存在字典中,但是它将如何出现我是不知道的,所以是隐藏状态,可见状态链就是句子被分词的可能结果,句子中词汇出现的词频,它被观测到出现的次数越多,那么在这个待分词的句子里头出现的概率就越大,这个概率就是转移概率。jieba就利用了Viterbi 算法求解HMM上的最短路径(最大概率)的算法(也就是某个句子应该是这样被分割的概率),本质就是求解最可能的隐状态序列,即就是求解最可能的分词结果。

比如:分解 想吃螺蛳粉和火锅 这句话。

隐藏状态以及转移概率:想(0.01)、吃(0.02)、想吃(0.4)、螺蛳粉(0)、螺蛳(0.2)、粉(0.1)、和(0.1)、火锅(0.5)、火(0.01)、锅(0.05)

可见状态链:

想、吃、螺蛳、粉、和、火锅

想吃、螺蛳粉、和、火、锅

想、吃、螺蛳、粉、和、火锅

想吃、螺蛳、粉、和、火、锅.....等等n种

计算出所有可见状态链出现的概率就是把对应词汇的转移概率乘起来就好啦,然后从中选择概率最大的可见状态链作为最后的分词结果。

以上只是个人理解,轻喷!!!HMM啥的真的好复杂,其实做项目只需要会意+会用就好啦,(其实还是要理解深入些才最好,可是我真的能力有限,哭唧唧)

4jieba分词工具的用法

实际操作其实是非常简单滴,跟着https://github.com/fxsjy/jieba官方走,准没错啦!

1 分词

前面介绍了三种分词模式,用到的是jieba中的lcut和lcut_for_search方法,返回的是list,如果使用cut和cut_for_search返回的是含有分词结果的迭代器,可以用for循环把结果输出。其中的参数HMM和cut_all是方面你选择是否使用新词开发功能以及全模式的选择。当然分词使用的都是默认词典,如果要使用其他词典就可以使用jieba.Tokenizer(dictionary=DEFAULT_DICT) 新建自定义分词器,可用于同时使用不同词典。jieba.dt 为默认分词器,所有全局分词相关函数都是该分词器的映射。

2 加载词典

官方文档这样讲滴~

开发者可以指定自己自定义的词典,以便包含 jieba 词库里没有的词。虽然 jieba 有新词识别能力,但是自行添加新词可以保证更高的正确率

  • 用法: jieba.load_userdict(file_name) # file_name 为文件类对象或自定义词典的路径
  • 词典格式和 dict.txt 一样,一个词占一行;每一行分三部分:词语、词频(可省略)、词性(可省略),用空格隔开,顺序不可颠倒。file_name 若为路径或二进制方式打开的文件,则文件必须为 UTF-8 编码。
  • 词频省略时使用自动计算的能保证分出该词的词频。

比如螺蛳粉本来识别不出来,但是加入自定义词库试试看呢?

jieba.load_userdict('dic.txt')
result =jieba.lcut(s1,cut_all=False,HMM=False)
print(' '.join(result))

dic.txt中我添加了螺蛳粉这个词语,结果就ok啦:

啊 啦 啦 , 今天 外面 下雨 啦 , 我 不 去 四川 博物院 了 , 想 吃 螺蛳粉 和 火锅 。

另外呢还可以加入单个的词汇,去强调这个词汇的重要性,也就是官方说的调整词典:

  • 使用 add_word(word, freq=None, tag=None) 和 del_word(word) 可在程序中动态修改词典。

  • 使用 suggest_freq(segment, tune=True) 可调节单个词语的词频,使其能(或不能)被分出来。

  • 注意:自动计算的词频在使用 HMM 新词发现功能时可能无效。

简单吧~

3 关键词提取

jieba的关键词提取是通过计算每个词汇的TF-IDF值来衡量词汇的重要性。

TF-IDF是指的词频-逆文本频率,TF是这个词语在一个文档中出现的频率,逆文本频率是指的该词语在所有文档中出现的概率,词频-逆文本频率就是他们相乘的值。词语在某个文档中出现的频率越高,但是在其他文档中出现的越少,就证明该词汇越能够当做某篇文档的关键词。

TF-IDF值越大该词汇的重要性就越大。

代码呢就是酱紫滴:

  • jieba.analyse.extract_tags(sentence, topK=20, withWeight=False, allowPOS=())

    • sentence 为待提取的文本
    • topK 为返回几个 TF/IDF 权重最大的关键词,默认值为 20
    • withWeight 为是否一并返回关键词权重值,默认值为 False
    • allowPOS 仅包括指定词性的词,默认值为空,即不筛选
  • jieba.analyse.TFIDF(idf_path=None) 新建 TFIDF 实例,idf_path 为 IDF 频率文件

例子:(还是螺蛳粉那个句子)

import jieba.analyse
s1 = '啊啦啦,今天外面下雨啦,我不去四川博物院了,想吃螺蛳粉和火锅。'
jieba.load_userdict('dic.txt')
result = jieba.analyse.extract_tags(s1,topK=1)
print(result)

结果深得我心!

是 ['螺蛳粉'] 啊!

要返回TF-IDF的话,改改参数:

result = jieba.analyse.extract_tags(s1,topK=2,withWeight=True)

结果是:[('螺蛳粉', 1.7078239289857142), ('博物院', 1.4241217170357143)]

并且关键词提取所使用逆向文件频率(IDF)文本语料库可以切换成自定义语料库的路径

  • 用法: jieba.analyse.set_idf_path(file_name) # file_name为自定义语料库的路径

关键词提取所使用停止词(Stop Words)文本语料库可以切换成自定义语料库的路径

  • 用法: jieba.analyse.set_stop_words(file_name) # file_name为自定义语料库的路径

还有一种用法:

基于 TextRank 算法的关键词抽取

  • jieba.analyse.textrank(sentence, topK=20, withWeight=False, allowPOS=('ns', 'n', 'vn', 'v')) 直接使用,接口相同,注意默认过滤词性。
  • jieba.analyse.TextRank() 新建自定义 TextRank 实例
s1 = '啊啦啦,今天外面下雨啦,我不去四川博物院了,想吃螺蛳粉和火锅。'
jieba.load_userdict('dic.txt')
result = jieba.analyse.textrank(s1, topK=2, withWeight=False, allowPOS=('ns', 'n', 'vn', 'v'))
print(result)

结果就不一样了,不知道为什么诶....我是很少用这种方法的。

['四川', '博物院']

4 词性标注

  • jieba.posseg.POSTokenizer(tokenizer=None) 新建自定义分词器,tokenizer 参数可指定内部使用的 jieba.Tokenizer分词器。jieba.posseg.dt 为默认词性标注分词器。
  • 标注句子分词后每个词的词性,采用和 ictclas 兼容的标记法。
  • 用法示例
import jieba.possegs1 = '想吃螺蛳粉和火锅'
jieba.load_userdict('dic.txt')
result = jieba.posseg.cut(s1)
for word,tags in result:print(word,tags)

想 v
吃 v
螺蛳粉 x
和 c
火锅 n

以上就是我所理解的jieba分词工具的用法啦~

另外分词时侯如果有停用词,我会把停用词加载在一个list中,然后判断分词结果有没有在停用词表中,如果有就pass掉,这样的方法来把停用词汇比如‘地’,‘的’这类的去掉。

还有其他用法,暂时用不到,而且有点看不懂,比如Chinese_analyse搜索引擎不知道是个啥。希望能有大神看见解答一下下呀 感激不尽!

python文本分析之jieba分词工具相关推荐

  1. 机器学习之---文本分析(jieba分词和词云绘制)

    一.定义: 文本挖掘:从大量文本数据中抽取出有价值的知识,并且利用这些知识重新组织信息的过程. 二.语料库(Corpus) 语料库是我们要分析的所有文档的集合. import os import os ...

  2. Python文本分析---笔记

    Python文本分析 格式化数据:表格.json 非格式化数据:字符串.文本 内容: 1.中文分词 2.自定义词典.去停用词 3.词频统计.关键词抽取 4.案例:招聘需求关键词抽取 一. 中文分词 分 ...

  3. 手把手陪你学文本分析——Chapter 1 分词的基础操作

    Chapter 1.1 分词的基础操作 知识点1.1.1 分词方法的类型 1.基于规则的分词 定义:将每个字符串与词典中的每个词进行匹配,若匹配上则进行切分,反之则不进行切分 优势:简单高效 劣势:不 ...

  4. Python文本分析技巧

    上一章提到,Python是一门易用且强大的编程语言,所以本书将其作为示例语言使用,同时也提供了一套基础的Python文本分析的教程. 为什么要介绍这些Python技巧?原因是希望读者具有Python和 ...

  5. 2.5.jieba分词工具、Jieba安装、全模式/精确模式、添加自定义词典、关键词抽取、词性标注、词云展示

    2.5.jieba分词工具 2.5.1.Jieba安装 2.5.2.全模式/精确模式 2.5.3.添加自定义词典 2.5.4.关键词抽取 2.5.5.词性标注 2.5.6.词云展示 2.5.jieba ...

  6. python文本分析与挖掘(一)-构建语料库

    实现功能: python文本分析与挖掘(一)-构建语料库 实现代码: import os from warnings import simplefilter simplefilter(action=' ...

  7. python 文本分析_使用Python进行文本分析–书评

    python 文本分析 This is a book review of Text Analytics with Python: A Practical Real-World Approach to ...

  8. python同义词替换(jieba分词)

    python同义词替换(jieba分词) TihuanWords.txt文档格式 注意:同一行的词用单个空格隔开,每行第一个词为同行词的替换词. 年休假 年假 年休 究竟 到底 回家场景 我回来了 代 ...

  9. python文本分析的开源工具_共有11款Python 中文分词库开源软件

    "哑哈"中文分词,更快或更准确,由你来定义.通过简单定制,让分词模块更适用于你的需求. "Yaha" You can custom your Chinese W ...

  10. python文本分析库_8种Python文本处理工具集

    文本处理一般包括词性标注,句法分析,关键词提取,文本分类,情感分析等等,这是针对中文的,如果是对于英文来说,只需要基本的tokenize.本文为大家提供了以下这些工具包. 1.Jieba [结巴中文分 ...

最新文章

  1. GraLSP | 考虑局部结构模式的GNN
  2. linux centos 启动失败 开机卡在进度条的解决方法
  3. Jenkins持续集成环境之插件管理和角色管理
  4. c语言 链表 删除节点,C语言实现单链表节点的删除(不带头结点)
  5. Qt官方开发环境生成的exe发布方式--使用windeployqt
  6. 【快捷键】—— 键盘篇
  7. java api apk_java-如何在APK文件中保护此API
  8. 漫画算法python篇pdf_漫画算法:小灰的算法之旅(Python篇)(全彩)
  9. HttpPrinter共享打印机 网络打印
  10. 网络安全扫盲贴 史上最全网络安全问题解答
  11. servlet运行html乱码,使用tomcat运行servlet时中文乱码的解决
  12. 阿里云数据库RDS如何用Navicat连接?
  13. 教师运用计算机上课的随笔,初中信息技术教师的教学随笔5
  14. 如何用excel筛选相似内容_excel怎么筛选出相同内容
  15. Excel如何跳过空值自动编号呢
  16. 抖音sdk接口API调用-关注与取消关注抖音号
  17. 各大搜索引擎蜘蛛名称
  18. 三线和BGP服务器的区别
  19. php经纬度之间的距离计算公式,golang与php实现计算两个经纬度之间距离的方法
  20. 十一、Actix-web 拦截器中间件

热门文章

  1. 局域网传输文件_堪比AirDrop,苹果 iPhone与Windows电脑互传文件的三种方式
  2. (八)理解商业模式画布(87)
  3. java 工作流 实例_Activiti工作流的应用示例
  4. 中国移动通信研究院笔试题2
  5. 使用MySQL8.0以上版本和MySQL驱动包8.0以上出现的问题
  6. 蓝桥杯单片机必学——C语言例题(一)
  7. 单片机p2.0引脚c语言,单片机C语言教程二
  8. 基于Spring Boot的简易版新闻管理系统
  9. 深度优先搜索解决迷宫最短路径问题
  10. 科研人员还需学python吗_为什么我建议每个开发人员都需要学 Python ?