jieba结巴分词--关键词抽取_结巴中文分词原理分析2

作者:白宁超,工学硕士,现工作于四川省计算机研究院,著有《自然语言处理理论与实战》一书,作者公众号:机器学习和自然语言处理(公众号ID:datathinks)


结巴分词详解1中文分词介绍

中文分词特点

  1. 词是最小的能够独立活动的有意义的语言成分

  2. 汉语是以字位单位,不像西方语言,词与词之间没有空格之类的标志指示词的边界

  3. 分词问题为中文文本处理的基础性工作,分词的好坏对后面的中文信息处理其关键作用

中文分词的难点 

  1. 分词规范,词的定义还不明确 (《统计自然语言处理》宗成庆)

  2. 歧义切分问题,交集型切分问题,多义组合型切分歧义等 
    结婚的和尚未结婚的 => 
    结婚/的/和/尚未/结婚/的 
    结婚/的/和尚/未/结婚/的

  3. 未登录词问题有两种解释:一是已有的词表中没有收录的词,二是已有的训练语料中未曾出现过的词,第二种含义中未登录词又称OOV(Out of Vocabulary)。对于大规模真实文本来说,未登录词对于分词的精度的影响远超歧义切分。一些网络新词,自造词一般都属于这些词。

汉语分词方法

  1. 基于字典、词库匹配的分词方法(基于规则) 
    基于字符串匹配分词,机械分词算法。将待分的字符串与一个充分大的机器词典中的词条进行匹配。分为正向匹配和逆向匹配;最大长度匹配和最小长度匹配;单纯分词和分词与标注过程相结合的一体化方法。所以常用的有:正向最大匹配,逆向最大匹配,最少切分法。实际应用中,将机械分词作为初分手段,利用语言信息提高切分准确率。优先识别具有明显特征的词,以这些词为断点,将原字符串分为较小字符串再机械匹配,以减少匹配错误率,或将分词与词类标注结合。

  2. 基于词频度统计的分词方法(基于统计) 
    相邻的字同时出现的次数越多,越有可能构成一个词语,对语料中的字组频度进行统计,基于词的频度统计的分词方法是一种全切分方法。jieba是基于统计的分词方法,jieba分词采用了动态规划查找最大概率路径, 找出基于词频的最大切分组合,对于未登录词,采用了基于汉字成词能力的HMM模型,使用了Viterbi算法。

  3. 基于知识理解的分词方法。 
    该方法主要基于句法、语法分析,并结合语义分析,通过对上下文内容所提供信息的分析对词进行定界,它通常包括三个部分:分词子系统、句法语义子系统、总控部分。在总控部分的协调下,分词子系统可以获得有关词、句子等的句法和语义信息来对分词歧义进行判断。这类方法试图让机器具有人类的理解能力,需要使用大量的语言知识和信息。由于汉语语言知识的笼统、复杂性,难以将各种语言信息组织成机器可直接读取的形式。因此目前基于知识的分词系统还处在试验阶段。

分词工具下载

  • hanllp jar包(http://download.csdn.net/download/lb521200200/9686915)

  • ik 分词 5.0.0版本jar包(http://download.csdn.net/download/youyao816/9676084)

  • ik分词 1.10.1版本jar包(http://download.csdn.net/download/youyao816/9676082)

  • IKAnalyzer所需的jar包(http://download.csdn.net/download/jingjingchen1014/9659225)

  • jieba分词包(http://download.csdn.net/download/u014018025/9652341)

2结巴中文分词详解

结巴分词的算法策略 

  1. 基于前缀词典实现高效的词图扫描,生成句子中汉字所有可能成词情况所构成的有向无环图 (DAG)

  2. 采用了动态规划查找最大概率路径, 找出基于词频的最大切分组合

  3. 对于未登录词,采用了基于汉字成词能力的 HMM 模型,使用了 Viterbi 算法

结巴源码组织形式

jieba 

|-- Changelog 

|-- extra_dict 

| |-- dict.txt.big 

| |-- dict.txt.small 

| |-- idf.txt.big 

| `-- stop_words.txt 

|-- jieba 

| |-- analyse 

| | |-- analyzer.py 

| | |-- idf.txt 

| | |-- __init__.py 

| | |-- textrank.py 

| | `-- tfidf.py 

| |-- _compat.py 

| |-- dict.txt 

| |-- finalseg 

| | |-- __init__.py 

| | |-- prob_emit.p 

| | |-- prob_emit.py 

| | |-- prob_start.p 

| | |-- prob_start.py 

| | |-- prob_trans.p 

| | `-- prob_trans.py 

| |-- __init__.py 

| |-- __main__.py 

| `-- posseg 

| |-- char_state_tab.p 

| |-- char_state_tab.py 

| |-- __init__.py 

| |-- prob_emit.p 

| |-- prob_emit.py 

| |-- prob_start.p 

| |-- prob_start.py 

| |-- prob_trans.p 

| |-- prob_trans.py 

| `-- viterbi.py 

|-- LICENSE 

|-- setup.py `-- test 

|-- *.py 

|-- parallel 

| |-- extract_tags.py 

| `-- test*.py `-- userdict.txt

代码行数统计(没有统计test文件夹下的代码)

256 ./posseg/prob_start.py 

5307 ./posseg/prob_trans.py 

304 ./posseg/__init__.py 

89372 ./posseg/prob_emit.py 

61087 ./posseg/char_state_tab.py 

53 ./posseg/viterbi.py

578 ./__init__.py 

4 ./finalseg/prob_start.py 

4 ./finalseg/prob_trans.py 

107 ./finalseg/__init__.py 

35226 ./finalseg/prob_emit.py 

31 ./_compat.py 

50 ./__main__.py 

111 ./analyse/tfidf.py 

37 ./analyse/analyzer.py 

104 ./analyse/textrank.py 

18 ./analyse/__init__.py 

192649 总用量

其中prob*.py的文件是作者事先训练好的模型参数(λ=(A,B,π)),如状态转移概率、发射概率等。真正的代码数也就:304+53+578+107+31+50+111+37+104+18=1393行(不包括test文件中的代码),当然作者的代码写的比较简洁。

jieba分词模型的参数数据(λ=(A,B,π))是如何生成的? 

即文件finalseg/prob_*.py,中初始化概率,状态转移概率,发射概率怎么算出来的? 
来源主要有两个: 一个是网上能下载到的1998人民日报的切分语料还有一个msr的切分语料; 另一个是作者自己收集的一些txt小说,用ictclas把他们切分(可能有一定误差)。 然后用python脚本统计词频 具体详情。 

要统计的主要有三个概率表

  1. 位置转换概率(状态转移概率),即B(开头),M(中间),E(结尾),S(独立成词)四种状态的转移概率; 

  2. 位置到单字的发射概率,比如P(“和”|M)表示一个词的中间出现”和”这个字的概率; 

  3. 词语以某种状态开头的概率,其实只有两种,要么是B,要么是S。

3结巴分词的思想

算法实现分词 

(1) 基于前缀词典实现高效的词图扫描,生成句子中汉字所有可能成词情况所构成的有向无环图 (DAG);

作者这个版本中使用前缀字典实现了词库的存储(即dict.txt文件中的内容),而弃用之前版本的trie树存储词库,想想也是,python中实现的trie树是基于dict类型的数据结构而且dict中又嵌套dict 类型,这样嵌套很深,导致内存耗费严重,详情见作者把trie树改成前缀词典的 缘由, 具体实现见 gen_pfdict(self, f_name)。接着说DAG有向无环图, 生成句子中汉字所有可能成词情况所构成的有向无环图。DAG根据我们生成的前缀字典来构造一个这样的DAG,对一个sentence DAG是以{key:list[i,j…], …}的字典结构存储,其中key是词的在sentence中的位置,list存放的是在sentence中以key开始且词sentence[key:i+1]在我们的前缀词典中 的以key开始i结尾的词的末位置i的列表,即list存放的是sentence中以位置key开始的可能的词语的结束位置,这样通过查字典得到词, 开始位置+结束位置列表。

例如:句子“抗日战争”生成的DAG中{0:[0,1,3]} 这样一个简单的DAG, 就是表示0位置开始, 在0,1,3位置都是词, 就是说0~0,0~1,0~3 即 “抗”,“抗日”,“抗日战争”这三个词 在dict.txt中是词。 


(2)采用了动态规划查找最大概率路径, 找出基于词频的最大切分组合; 
基于上面的DAG利用动态规划查找最大概率路径,这个理解DP算法的很容易就能明白了。根据动态规划查找最大概率路径的基本思路就是对句子从右往左反向计算最大概率,..依次类推, 最后得到最大概率路径, 得到最大概率的切分组合(这里满足最优子结构性质,可以利用反证法进行证明),这里代码实现中有个小trick,概率对数(可以让概率相乘的计算变成对数相加,防止相乘造成下溢,因为在语料、词库中每个词的出现概率平均下来还是很小的浮点数). 
(3)对于未登录词,采用了基于汉字成词能力的 HMM 模型,使用了 Viterbi 算法;
未登录词(即jieba中文分词源码分析(一))中说的OOV, 其实就是词典 dict.txt 中没有记录的词。这里采用了HMM模型,HMM是个简单强大的模型,可以参考这个网络资源进行学习,HMM在实际应用中主要用来解决3类问题:

  1. a. 评估问题(概率计算问题) :即给定观测序列 O=O1,O2,O3…Ot和模型参数λ=(A,B,π),怎样有效计算这一观测序列出现的概率. (Forward-backward算法)

  2. b. 解码问题(预测问题) :即给定观测序列 O=O1,O2,O3…Ot和模型参数λ=(A,B,π),怎样寻找满足这种观察序列意义上最优的隐含状态序列S。 (viterbi算法,近似算法)

  3. c. 学习问题 :即HMM的模型参数λ=(A,B,π)未知,如何求出这3个参数以使观测序列O=O1,O2,O3…Ot的概率尽可能的大. (即用极大似然估计的方法估计参数,Baum-Welch,EM算法)

模型的关键相应参数λ=(A,B,π),经过作者对大量语料的训练, 得到了finalseg目录下的三个文件(初始化状态概率(π)即词语以某种状态开头的概率,其实只有两种,要么是B,要么是S。这个就是起始向量, 就是HMM系统的最初模型状态,对应文件prob_start.py;隐含状态概率转移矩A 即字的几种位置状态(BEMS四个状态来标记, B是开始begin位置, E是end, 是结束位置, M是middle, 是中间位置, S是single, 单独成词的位置)的转换概率,对应文件prob_trans.py;观测状态发射概率矩阵B 即位置状态到单字的发射概率,比如P(“狗”|M)表示一个词的中间出现”狗”这个字的概率,对应文件prob_emit.py)。

4参考文献
  1. 中文分词之HMM模型详解

  2. HMM相关文章

  3. 结巴分词GitHub源码

作者:白宁超,工学硕士,现工作于四川省计算机研究院,研究方向是自然语言处理和机器学习。曾参与国家自然基金项目和四川省科技支撑计划等多个省级项目。著有《自然语言处理理论与实战》一书。

作者博客官网:

https://bainingchao.github.io/

作者公众号,欢迎关注:

019f8ba5e2c19908ebcf6e5a1b27a1b4.png

机器学习和自然语言处理公众号ID:datathinks

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

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

相关文章

cad动态块制作翻转_定制橱柜家具中CAD门型动态块制作方式图文讲解加视频

在定制橱柜家具中,我们用CAD我们经常会用一些门型放置到绘图当中,来展示CAD图纸的美观性,如下图:那么这些门型要是一点点画却是麻烦,所以我们可以把门型做成动态快的形式,对门型进行任意拉伸,方…

python json库安装_python怎么安装requests库

requests是python实现的简单易用的HTTP库,使用起来比urllib简洁很多 因为是第三方库,所以使用前需要cmd安装pip install requests 安装完成后import一下,正常则说明可以开始使用了。 基本用法: requests.get()用于请求目标网站&am…

32获取外部中断状态_Linux中断一网打尽(1) — 中断及其初始化

1中断是什么既然叫中断, 那我们首先就会想到这个中断是中断谁?想一想计算机最核心的部分是什么?没错, CPU, 计算机上绝大部分的计算都在CPU中完成,因此这个中断也就是中断CPU当前的运行,让CPU转而先处理这个…

python如何输入多行数据合并_python 实现将txt文件多行合并为一行并将中间的空格去掉方法...

有一个txt文本如下: 151 151 1234561 156421 214156 1523132 031320 现希望将两行合并为一行,并将中间所有的空格都去掉: (python编程第十章) 代码如下: path rC:\Users\xxx\Desktop\test.txt#文本存放的路径 with open(path) as…

文件夹_【教程】创建透明文件夹(非隐藏文件夹哦)

Hello 今天 不夜君 来教大家如何创建 一个 透明的 文件夹 效果类似这样哦~~是不是什么都看不到呢 大家不要慌 下面来看一下选中后的样子呀~~怎么样 是不是十分的酷炫呢其实这个方法的原理 我也不是很懂 所以就不献丑了 直接附上教程吧!!当然 有多种实现方…

python函数如何实现可变参数_【已解决】Python中实现可变参数的函数

【问题】 Python中,希望实现一个可变参数的函数。 【解决过程】 相关代码如下:(extractOK, extractedBlogUser, generatedBlogEntryUrl) callCommonBlogFunc(extractBlogUser, inputUrlinputUrl); #-------------------------------------------------------------…

山东栋梁机器人比赛_谁是最强“移动机器人”?来深技师这场全国大赛一决高下!...

9月24日第一届全国技能大赛世赛移动机器人项目全国机械行业选拔赛在深圳技师学院闭幕!为期三天的赛程中来自全国职业院校、机械行业相关企业的40支参赛队伍、130多名选手和专家教练相聚在深技师美丽的鹤鸣湖畔展开了激烈的比拼~点击边框调出视频工具条 ▲ 点击视频&…

python办公自动化excel_python办公自动化:Excel操作入门

1.安装 pip install xlsxwriter or easy_install xlsxwriter or tar -zxvf xlsxwriter-*.*.*.tar.gz python setup.py install 2.操作一个简单的Excel文档 操作注释及代码: # 引入依赖模块 import xlsxwriter # 数据准备 datas ( [Rent, 1000], [Gas, 100 ], [Food…

c++回到起点旅行商问题_不要犯同样的错,提C型房车回渝上牌长途旅行的心路历程...

视频版看这里➡️ 第一次驾驶三吨重房车到成功在村道脱险,这段旅程值得回顾我们俩房车旅行近两年,为了更好的迎接新一年的到来,我们来简单回顾一下这一年多的房车旅程。我们俩的旅行口号是:奔跑的影视工作室,行走的房车…

python去空格的函数_Python中用于去除空格的三个函数的使用小结

函数:strip() lstrip() rstrip() 作用:去除字符串中的空格或指定字符 一、默认用法:去除空格str.strip() : 去除字符串两边的空格 str.lstrip() : 去除字符串左边的空格 str.rstrip() : 去除字符串右边的空…

中怎样载入选区_PS----关于选区的选取

对于刚刚接触到PS的小伙伴来说,怎样下手呢???嘿嘿,我来了,废话不多,直接上干货1.关于“矩形"或者“圆形”选取,快捷键M,取消选区ctrld,2."正圆“以及”正方形“ 怎么办呢&…

python处理word_python操作word设置字体

**设置字体**from docx.shared import Pt filedocx.Document() #创建内存中的word文档对象 #设置字体样式(字体大小与字体样式) mystyle file.styles["Header"] font mystyle.font font.size Pt(12.5) font.name 宋体 head.paragraphs[0].…

期刊投稿状态_追踪期刊在线系统投稿状态(十七)

大部分的期刊都有在线投稿系统,让作者能够快速简单完成投稿,一旦论文递交出去后,作者可以通过系统查看投稿状态,了解期刊处理论文的进度。作者在投稿出去后都会感到很焦虑,一直刷新系统状态,有时候出现了不…

添加公共引用目录_原来Word还可以自动生成图片和图表目录!

小李接到了一个任务,将技术文档中的示意图目录做出来,让客户能根据需求快速找到操作示意图,可是这份文档有三百多张图片,不过,这可难不倒小李。说到Word目录,大多数人都知道,可以为文档的标题设…

python类实例化_python基础8之类的实例化过程剖析

一、概述 之前我们说关于python中的类,都一脸懵逼,都想说,类这么牛逼到底是什么,什么才是类?下面我们就来讲讲,什么是类?它具有哪些特性。 二、类的语法 2.1 语法 class dog(object): #用class定…

db2 sql 判断select是否为空_学会复杂一点的SQL语句:Oracle DDL和DML

create:创建表创建用户创建视图创建表create table student(id int,score int) ;student后面与括号之间可以有空格可以没有创建用户create user liuyifei identified by 4852396;drop:删除整个表、删除指定的用户、删除指定的存储空间drop table table_n…

python分析股票数据_Python数据可视化——股票数据分析

1.背景 GAFATA,它表示的是GOOGLE,AMAZON,FACEBOOK,APPLE,TENCENT,ALIBABA这六家互联网巨头的首字母缩写。本文主要分析GAFATA这六家公司股票近一年的的涨跌情况。 2.过程 先使用conda安装: 1)在python环境下安装数据分析pandas包,…

python语言程序设计考试内容_MOOC_Python语言程序设计(嵩天)考试_第一周

以下内容仅用作个人学习记录 单项选择题 点击选项选择正确答案,每题有且仅有一个正确答案 1 Guido van Rossum正式对外发布Python版本的年份是: A 1991 B 2002 C 1998 D 2008 正确答案 A Python成功了,所以早年的开发历史也受到关注&…

mac连接手机 vm_使用mac ssh连接谷歌云vm实例

谷歌云上提供了在线操作云节点的shell,但是毕竟不如本地多年操作的shell用起来爽,因此,本文以mac iTerm为例,记录一下本地连接谷歌云的操作过程和遇到的问题。1.谷歌云提供的在线shell一. 在本地创建秘钥ssh-keygen -t rsa -f [yo…

dataframe 一列的不同值_python数据分析包|Pandas-02之缺失值(NA)处理

本篇详解pandas中缺失值(Missing data handling)处理常用操作。缺失值处理常用于数据分析数据清洗阶段;Pandas中将如下类型定义为缺失值:NaN: ‘’, ‘#N/A’, ‘#N/A N/A’, ‘#NA’, ‘-1.#IND’, ‘-1.#QNAN’,‘-NaN’, ‘-na…