IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 人工智能 -> jieba源代码分析——四种分词模式(五) -> 正文阅读

[人工智能]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,与之相似,不同之处是其在精确模式的基础上,对长词(字数>2)再次切分,提高召回率,适用于搜索引擎分词。
以下附源代码可做对比学习用:

def cut_for_search(self, sentence, HMM=True):
    """
    Finer segmentation for search engines.
    """
    words = self.cut(sentence, HMM=HMM)
    for w in words:
        if len(w) > 2:#如果词长>2
            for i in xrange(len(w) - 1):  
                gram2 = w[i:i + 2]  #再次切分词
                if self.FREQ.get(gram2):
                    yield gram2  #返回迭代器
        if len(w) > 3:#如果词长>3
            for i in xrange(len(w) - 2):
                gram3 = w[i:i + 3]#再次切分词
                if self.FREQ.get(gram3):
                    yield gram3 #返回迭代器
        yield w

搜索引擎模式的分词方法在一些业务场景是需要的,但是它的进一步切分方法比较粗暴,这里可以修改代码做一些定制化的分词规则,比如切出4字词,切出重要的1字词,某些词不可切等定制化分词规则,以获取自己想要的分词结果。

  人工智能 最新文章
2022吴恩达机器学习课程——第二课(神经网
第十五章 规则学习
FixMatch: Simplifying Semi-Supervised Le
数据挖掘Java——Kmeans算法的实现
大脑皮层的分割方法
【翻译】GPT-3是如何工作的
论文笔记:TEACHTEXT: CrossModal Generaliz
python从零学(六)
详解Python 3.x 导入(import)
【答读者问27】backtrader不支持最新版本的
上一篇文章      下一篇文章      查看所有文章
加:2021-12-28 22:55:34  更:2021-12-28 22:56:07 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/26 23:31:19-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码