Jieba分词包(一)——解析主函数cut
1. 解析主函数cut
Jieba分词包的主函数在jieba文件夹下的__init__.py中,在这个py文件中有个cut的函数,这个就是控制着整个jieba分词包的主函数。
cut函数的定义如下:
def cut(sentence,cut_all=False,HMM=True):
其给出的官方注释为:
'''The main function that segments an entire sentence that contains
Chinese characters into seperated words.
Parameter:
- sentence: The String to be segmented
- cut_all: Model. True means full pattern, false means accurate pattern.
- HMM: Whether use Hidden Markov Model.
'''
说白了就是,其中sentence是需要分词的句子样本;cut_all是分词的模式,稍微钻研过分词的小伙伴们都知道,jieba分词有全模式和精准模式两种,分别用true和false来选择,默认是false也就是精准模式;HMM就是隐马尔可夫链,这个是在分词的理论模型中用到的,默认是开启的。
下面我就接着cut函数中的注释,来说一下cut函数的整体框架和局部细节。
def cut(sentence,cut_all=False,HMM=True):
#整个分词的主函数,
#输入sentence是需要分词的句子;
#cut_all是分词模式,默认是精准模式;
#HMM是隐马尔可夫链,默认开启。
'''The main function that segments an entire sentence that contains
Chinese characters into seperated words.
Parameter:
- sentence: The String to be segmented
- cut_all: Model. True means full pattern, false means accurate pattern.
- HMM: Whether use Hidden Markov Model.
'''
if not isinstance(sentence, unicode): #如果输入的句子不是统一编码形式的unicode,那么使用Python中的decode,将其解码称为unicode
#注:unicode、gbk等都是中文编码的方式
try:
sentence = sentence.decode('utf-8')
except UnicodeDecodeError: #如果在decode的过程中出现了错误,那么就解码成gbk形式的。
sentence = sentence.decode('gbk','ignore')
'''
\u4E00-\u9FA5a-zA-Z0-9+#&\._ : All non-space characters. Will be handled with re_han
\r\n|\s : whitespace characters. Will not be Handled.
'''
#下面使用到了Python中正则表达式模块re,正则表达式是用于处理字符串的强大工具,
#拥有自己独特的语法以及一个独立的处理引擎,效率上可能不如str自带的方法,但功能十分强大。
#其最擅长的、最被大家使用的就是字符串匹配功能
#正则表达式的大致匹配过程是:依次拿出表达式和文本中的字符比较,如果每一个字符都能匹配,则匹配成功;
#一旦有匹配不成功的字符则匹配失败。如果表达式中有量词或边界,这个过程会稍微有一些不同
#re.compile 可以把正则表达式编译成一个正则表达式对象。
#可以把那些经常使用的正则表达式编译成正则表达式对象,这样可以提高一定的效率
#关于正则表达式指南:http://www.cnblogs.com/huxi/archive/2010/07/04/1771073.html
#关于正则表达式常用的处理函数:http://www.cnblogs.com/sevenyuan/archive/2010/12/06/1898075.html
re_han, re_skip = re.compile(ur"([\u4E00-\u9FA5a-zA-Z0-9+#&\._]+)", re.U), re.compile(ur"(\r\n|\s)", re.U)
#将以下正则表达式编译成re_han对象:
#\u4E00-\u9FA5是所有汉字的编码,a-zA-Z是所有大小写字母的编码,0-9是所有阿拉伯数字的编码,+#&\._其余字符
#将以下正则表达式编译成re_skip对象:
#\r是回车,\n是换行,|或, \s是空白字符(\r\n\t\f\v)
#re.U是使得compile的结果取决于unicode定义的字符属性
if cut_all:
re_han, re_skip = re.compile(ur"([\u4E00-\u9FA5]+)", re.U), re.compile(ur"[^a-zA-Z0-9+#\n]", re.U)
#全模式下,只handle中文字符部分[\u4E00-\u9FA5],其余的字母、数字等等都要跳过。
blocks = re_han.split(sentence)
#这个split的作用和Python自带的split作用差不多,按照能够匹配的子串,即刚才compile进去的哪些字符,将sentence分割
#而且是把sentence分成几个blocks,然后针对每一块进行分词
'''
例子:
p = re.compile(r'\d+')
print p.split('one1two2three3four4')
### output ###
# ['one', 'two', 'three', 'four', ''] #按照compile的表达式,把一个string分成几个blocks
'''
if HMM: #默认情况使用__cut_DAG作为分词函数,为每个block分词
cut_block = __cut_DAG
else:
cut_block = __cut_DAG_NO_HMM
if cut_all:
cut_block = __cut_all
for blk in blocks: #针对每一块进行分词
if len(blk)==0: #当blk为空时,继续下一个blk的分词
continue
if re_han.match(blk): #如果re_han.match(blk)为true,说明当前blk是re_han范围内的文本
for word in cut_block(blk): #__cut_DAG作为分词函数为每个block分词,返回分词后word列表
yield word #yield作用也是返回,但是其不会消除local variables。
#yield statement is what makes a function a generator function.
#具体的yield和return在Python中的区别:http://blog.csdn.net/jiyanfeng1/article/details/8148561
else:
tmp = re_skip.split(blk) #按照re_skip中的正则表达式,把blk划分成几块
for x in tmp:
if re_skip.match(x):
yield x #返回匹配划分的每一部分
elif not cut_all: #如果是精准模式,则返回x中的每一项,即试图将句子最精确地切开
for xx in x:
yield xx
else: #如果是全模式,把句子中所有的可以成词的词语都扫描出来
yield x
---------------------
作者:bigface1234fdfg
来源:CSDN
原文:https://blog.csdn.net/puqutogether/article/details/40740473
版权声明:本文为博主原创文章,转载请附上博文链接!
Jieba分词包(一)——解析主函数cut的更多相关文章
- Jieba分词原理与解析
https://www.jianshu.com/p/dfdfeaa7d01f 1 HMM模型 image.png 马尔科夫过程: image.png image.png 以天气判断为例:引 ...
- R语言︱文本挖掘之中文分词包——Rwordseg包(原理、功能、详解)
每每以为攀得众山小,可.每每又切实来到起点,大牛们,缓缓脚步来俺笔记葩分享一下吧,please~ --------------------------- 笔者寄语:与前面的RsowballC分词不同的 ...
- 自然语言处理课程(二):Jieba分词的原理及实例操作
上节课,我们学习了自然语言处理课程(一):自然语言处理在网文改编市场的应用,了解了相关的基础理论.接下来,我们将要了解一些具体的.可操作的技术方法. 作为小说爱好者的你,是否有设想过通过一些计算机工具 ...
- jieba分词原理解析:用户词典如何优先于系统词典
目标 查看jieba分词组件源码,分析源码各个模块的功能,找到分词模块,实现能自定义分词字典,且优先级大于系统自带的字典等级,以医疗词语邻域词语为例. jieba分词地址:github地址:https ...
- java基础课程笔记 static 主函数 静态工具类 classpath java文档注释 静态代码块 对象初始化过程 设计模式 继承 子父类中的函数 继承中的构造函数 对象转型 多态 封装 抽象类 final 接口 包 jar包
Static那些事儿 Static关键字 被static修饰的变量成为静态变量(类变量) 作用:是一个修饰符,用于修饰成员(成员变量,成员方法) 1.被static修饰后的成员变量只有一份 2.当成员 ...
- IM通信协议逆向分析、Wireshark自定义数据包格式解析插件编程学习
相关学习资料 http://hi.baidu.com/hucyuansheng/item/bf2bfddefd1ee70ad68ed04d http://en.wikipedia.org/wiki/I ...
- jieba分词流程及部分源码解读(一)
首先我们来看一下jieba分词的流程图: 结巴中文分词简介 1)支持三种分词模式: 精确模式:将句子最精确的分开,适合文本分析 全模式:句子中所有可以成词的词语都扫描出来,速度快,不能解决歧义 搜索引 ...
- Lucene.net(4.8.0) 学习问题记录五: JIEba分词和Lucene的结合,以及对分词器的思考
前言:目前自己在做使用Lucene.net和PanGu分词实现全文检索的工作,不过自己是把别人做好的项目进行迁移.因为项目整体要迁移到ASP.NET Core 2.0版本,而Lucene使用的版本是3 ...
- jieba分词初学
昨天,做的那个数据分析报告用到了jieba分词.但是只是借用了别人的部分代码.具体函数代表什么还不太明白.今天去官网研究了下..... jieba官网简介 "结巴"中文分词:做最好 ...
随机推荐
- nginx源码分析线程池详解
nginx源码分析线程池详解 一.前言 nginx是采用多进程模型,master和worker之间主要通过pipe管道的方式进行通信,多进程的优势就在于各个进程互不影响.但是经常会有人问道,n ...
- python-null
很早之前,遇到过一个面试官问的python中有没有null,当时有点紧张,想成了None,就脱口而出是有的.今天遇到了none问题,所以就正好说一下. python中是没有NULL的. Python中 ...
- C++学习笔记----4.4 继承情况下的类作用域嵌套
引言: 在继承情况下,派生类的作用域嵌套在基类作用域中:如果不能在派生类作用域中确定名字,就在外围基类作用域中查找该名字的定义. 正是这种类作用域的层次嵌套使我们能够直接访问基类的成员,就好像这些成员 ...
- nginx配置静态资源压缩
sendfile on; #让nginx在传输文件时直接在磁盘和tcp socket之间传输数据 location ~ .*\.(txt|xml)$ { gzip on; #开启压缩 gzip_htt ...
- SQL注入绕过的技巧总结
sql注入在很早很早以前是很常见的一个漏洞.后来随着安全水平的提高,sql注入已经很少能够看到了.但是就在今天,还有很多网站带着sql注入漏洞在运行.稍微有点安全意识的朋友就应该懂得要做一下sql注入 ...
- 【arduino】anroid的app与arduino的ch05,进行蓝牙通信遇到的问题
Arduino程序上传不成功 显示系统找不到指定文件 错误信息显示是 avrdude: ser_open(): can't open device "\\.\COM1": 系统找不 ...
- node.js对象数据类型
在这里复习下前端JS的数据类型:前端JS中的数据类型: 1.基本/原生/值类型 string.number.boolean.null.undefined 2.引用/对象类型 ES对象类型:Str ...
- python的数据类型和变量
数据类型 计算机顾名思义就是可以做数学计算的机器,因此,计算机程序理所当然地可以处理各种数值.但是,计算机能处理的远不止数值,还可以处理文本.图形.音频.视频.网页等各种各样的数据,不同的数据,需要定 ...
- BigDecimal创建初始化值类型对比
当初始化String类型和double类型,入参值相同,对比输出值 BigDecimal bigDecimalStr = new BigDecimal("0.1"); BigDec ...
- Directx11教程(15) D3D11管线(4)
原文:Directx11教程(15) D3D11管线(4) 本章我们首先了解一下D3D11中的逻辑管线,认识一下管线中每个stage的含义. 参考资料:http://fgiesen.wordpress ...