jieba源代码分析——四种分词模式(五)
2021/12/27 23:38:23
本文主要是介绍jieba源代码分析——四种分词模式(五),对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!
2021SC@SDUSC
2021SC@SDUSC
在分析完tokenizer类中其他需要被分词使用的函数后,我们正式开始分析四种分词模式直接调用的cut函数的代码。
通常情况下,会直接默认精确模式,但是通过指定参数cut_all=True和use_paddle=True可以选择是否选择全模式或paddle模式。
2021SC@SDUSC
2021SC@SDUSC
#jieba分词的主函数,返回结果是一个可迭代的 generator def cut(self, sentence, cut_all=False, HMM=True): ''' The main function that segments an entire sentence that contains Chinese characters into seperated words. Parameter: - sentence: The str(unicode) to be segmented. - cut_all: Model type. True for full pattern, False for accurate pattern. - HMM: Whether to use the Hidden Markov Model. ''' # 解码为unicode sentence = strdecode(sentence) # 不同模式下的正则 if cut_all: re_han = re_han_cut_all #re.compile("([\u4E00-\u9FD5]+)", re.U) re_skip = re_skip_cut_all #re.compile("[^a-zA-Z0-9+#\n]", re.U) else: re_han = re_han_default #re.compile("([\u4E00-\u9FD5a-zA-Z0-9+#&\._]+)", re.U) re_skip = re_skip_default #re.compile("(\r\n|\s)", re.U) #设置不同模式下的cut_block分词方法 if cut_all: cut_block = self.__cut_all #全模式 elif HMM: cut_block = self.__cut_DAG #精确模式,使用隐马模型 else: cut_block = self.__cut_DAG_NO_HMM #精确模式,不使用隐马模型 #先用正则对句子进行切分 blocks = re_han.split(sentence) for blk in blocks: if not blk: continue if re_han.match(blk): # re_han匹配的串 for word in cut_block(blk): #根据不同模式的方法进行分词 yield word else: # 按照re_skip正则表对blk进行重新切分 tmp = re_skip.split(blk) # 返回list for x in tmp: if re_skip.match(x): yield x elif not cut_all: # 精准模式下逐个字符输出 for xx in x: yield xx else: yield x
根据代码逻辑,我们可以将具体的分词流程概括起来如下:
给定待分词的句子, 使用正则(re_han)获取匹配的中文字符(和英文字符)切分成的短语列表;
利用get_DAG(sentence)函数获得待切分句子的DAG,首先检测(check_initialized)进程是否已经加载词库,若未初始化词库则调用initialize函数进行初始化,initialize中判断有无已经缓存的前缀词典cache_file文件,若有相应的cache文件则直接使用 marshal.load 方法加载前缀词典,若无则通过gen_pfdict对指定的词库dict.txt进行计算生成前缀词典,到jieba进程的初始化工作完成后就调用get_DAG获得句子的DAG;
根据cut_block指定具体的方法(__cut_all,__cut_DAG,__cut_DAG_NO_HMM)对每个短语使用DAG进行分词 ,如cut_block=__cut_DAG时则使用DAG(查字典)和动态规划, 得到最大概率路径, 对DAG中那些没有在字典中查到的字, 组合成一个新的片段短语, 使用HMM模型进行分词, 也就是作者说的识别新词, 即识别字典外的新词;
使用python的yield 语法生成一个词语生成器, 逐词语返回。
如果使用搜索模式,则需要使用方法cut_for_search,下篇博客再讲述。
这篇关于jieba源代码分析——四种分词模式(五)的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!
- 2024-06-15matplotlib作图不显示3D图,怎么办?
- 2024-06-1503-Loki 日志监控
- 2024-06-1504-让LLM理解知识 -Prompt
- 2024-06-05做软件测试需要懂代码吗?
- 2024-06-0514-ShardingSphere的分布式主键实现
- 2024-06-03为什么以及如何要进行架构设计权衡?
- 2024-05-31全网首发第二弹!软考2024年5月《软件设计师》真题+解析+答案!(11-20题)
- 2024-05-31全网首发!软考2024年5月《软件设计师》真题+解析+答案!(21-30题)
- 2024-05-30【Java】百万数据excel导出功能如何实现
- 2024-05-30我们小公司,哪像华为一样,用得上IPD(集成产品开发)?