iis服务器助手广告广告
返回顶部
首页 > 资讯 > 后端开发 > Python >Python中的jieba源码分析
  • 389
分享到

Python中的jieba源码分析

2023-06-02 08:06:45 389人浏览 安东尼

Python 官方文档:入门教程 => 点击学习

摘要

本篇内容主要讲解“python中的jieba源码分析”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Python中的jieba源码分析”吧!前言jieba分词是Python 里面几个比较流行的中文

本篇内容主要讲解“python中的jieba源码分析”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习Python中的jieba源码分析”吧!

前言

jieba分词是Python 里面几个比较流行的中文分词工具之一。为了理解分词工具的工作原理,以及实现细节对jieba进行了详细的阅读。

读代码之前,我有几个问题是这样的:

分词工具的实现都有哪几个步骤?
结巴分词的文档说是使用了HMM模型,但是HMM 模型是如何运用在分词工具中的?,以及模型是如何产生的?
几乎所有的分词工具都支持用户添加词库,但是用户词库到底在分词过程中扮演什么角色?
简介

jieba 分词支持三种分词模式,官方文档给出了如下的Example

import jieba seg_list = jieba.cut("我来到北京清华大学", cut_all=True)print("Full Mode: " + "/ ".join(seg_list))  # 全模式 seg_list = jieba.cut("我来到北京清华大学", cut_all=False)print("Default Mode: " + "/ ".join(seg_list))  # 精确模式 seg_list = jieba.cut("他来到了网易杭研大厦")  # 默认是精确模式print(", ".join(seg_list)) seg_list = jieba.cut_for_search("小明硕士毕业于中国科学院计算所,后在日本京都大学深造")  # 搜索引擎模式print(", ".join(seg_list))

考虑到文章篇幅的限制,我会详细解读默认模式也就是jieba.cut方法的所有实现。 阅读过程中会涉及一些算法原理,本文不做详细解释。

首先使用概率无向图,获得最大概率路径.概率无向图的构建完全依赖于字典,最大概率路径求解也是依赖字典中的词频。 最后使用HMM模型来解决未登录词(Out Of Vocabulary) ,所以在整个过程如果没有模型也是可以的,只要你有一个很好的词典。最大概率路径的求解还有很多方法,记得HaNLP的求解就有实现最短路径。

粗分

首先会使用正则将文本切分,正则什么样?就跟现则的是默认模式还是全模式。正则如下:

re_han_default = re.compile("([\u4E00-\u9FD5a-zA-Z0-9+#&\._]+)", re.U)re_han_cut_all = re.compile("([\u4E00-\u9FD5]+)", re.U)

到底有什么区别: 我写了个测试

test_str = u'我在重庆abc,他也在重庆? 1234你在重庆吗'print (re_han_default.split(test_str))print (re_han_cut_all.split(test_str))

输出:

['', '我在重庆abc', ',', '他也在重庆', '? ', '1234你在重庆吗', '']['', '我在重庆', 'abc,', '他也在重庆', '? 1234', '你在重庆吗', '']

上面输出的list 里面每一个被成为block。

细分

对粗分产生的blok ‘abc’这样的不能被re.han匹配的会直接作为结果反回。对于和中文连在一起的会进入下一个阶段细分。

DAG构建

细分的第一步是构建 DAG 即有向无环图。构建的核心代码如下:

def get_DAG(self, sentence):        self.check_initialized() # 初始化,加载词典        DAG = {}        N = len(sentence)        for k in xrange(N):            tmplist = []            i = k            frag = sentence[k]            while i < N and frag in self.FREQ:                if self.FREQ[frag]:                    tmplist.append(i)                i += 1                frag = sentence[k:i + 1]            if not tmplist:                tmplist.append(k)            DAG[k] = tmplist        return DAG

怎么个意思呢: 举个例子 我来到北京清华大学 产生的DAG 结果如下:

{0: [0], 1: [1, 2], 2: [2], 3: [3, 4], 4: [4], 5: [5, 6, 8], 6: [6, 7], 7: [7, 8], 8: [8]}

使用dict 来存储图数据结构。字典中的key 是没个字对应句子的index,后面的value 是一个list就是可达的路径。比如{1:[1,2]}意思就是“来”和“来到”这两个词在词典中存在。其他的类推。

图的产生依赖于self.FREQ这个变量,这是存储字典的,其结构是词做key ,词出现次数做value 的dict. 所以词典的好坏对分词结果会有很大的影响。如果根本不存在的路径给连上了,应该连上的没有连上。后面的HMM模型也是没办法解决的后者,当然最大概率路径会解决部分第一个问题,但是都是有限的。所以词典是相当关键的。

最大概率路径求解

有了上面的DAG 下面求是求解最大概率路径。这个问题有很多中方法,jieba 使用的是动态规划。先不解释动态规划是什么,直接看代码,

def calc(self, sentence, DAG, route):        N = len(sentence)        route[N] = (0, 0)        logtotal = log(self.total)        for idx in xrange(N - 1, -1, -1):            route[idx] = max((log(self.FREQ.get(sentence[idx:x + 1]) or 1) -                              logtotal + route[x + 1][0], x) for x in DAG[idx])

真个过程就上面几行。关键就在max 那一句。这个问题不在这里展开。但是有个小的技巧说下:在对很小的数据进行操作的时候,Python 也是可能向下溢出的,什么意思看下面的例子:

b = 0.0000001print b**100

结果会打印0.0 所有有个方法就是取log 。这个方法在很多地方都是有用的。 上面还用到了连个tuple比较这一技巧。

求解的结果如果分词时候参数设置的不适用HMM模型,到这里就结束了。求解结果部分如下:key 同样是对应的index.第二个就代表的是来到这个词。

{0: (-32.587853155857076, 0), 1: (-27.379629658355885, 2),}
未登录词

上面的最大概率在一定程度上解决了歧义问题,但是在分词里面还有另外一个问题未登录词问题也叫OOV(Out Of Vocabulary). jieba 使用HMM来识别未登录词。 比如: “我来到誉存科技” 这句话,产生的最大概率路径是

{0: (-42.29693140266269, 0), 1: (-37.0887079051615, 2), 2: (-33.93639839927486, 2), 3: (-28.257272562332492, 3), 4: (-17.872975353951055, 4), 5: (-8.250710549196151, 6), 6: (-10.881580216048834, 6), 7: (0, 0)}

看到3,和4 都是独立的词,如果不使用HMM 这个词就会被分成两个字。其逻辑就是把多个连续的单字组合成新的blok 使用HMM来切分。HMM到底怎么切分呢?

HMM

HMM 隐马模型的定义自己可以去查,就算查完你也不一定能说清楚到底在分词的时候怎么使用的,但是不查绝对不知道。 在分词之前语料会被标注,标注的方式有很多中。其中比较多的是BMES对应的是B(begin)词的开头,M(Middle)词的中间,E(End)词的结束,S(Single)单个的词 HMM有几个概念,和分词这个具体问题的对应关系如下:

状态序列(state sequence):BMES 这些状态
观测序列(observation sequence):就是看到的需要分词的句子,所有的字组成一个序列。
现在的问题就是一直观测序列求状态序列。但是第一部我们需要建立HMM模型。 HMM 有三个基本组成: 初始概率状态概率分布A 状态转移矩阵pi 观测概率分布B

如果有了上面三个元素一个HMM模型就是定好了。当然还有HMM模型有很多假设,此处省略。 jieba 是如何得到这三个变量的了。这就是HMM的学习问题 了。在标注好的语料之上。可以使用极大似然估计来估计这三个参数。这里也看到,语料是关键因素,语料的质量决定这三个参数。其实估计的过程不管其中的原理就是一些统计计算。jieba 把这三个元素分别存贮在三个py文件中:

prob_start.py: 初始状态概率 prob_trans.py: 状态转移 prob_emit.py: 观测概率分布

看看 prob_start:

P={'B': -0.26268660809250016, 'E': -3.14e+100, 'M': -3.14e+100, 'S': -1.4652633398537678}

-3.14e+100表示的是无穷小。意思就是第一个字不可能是E,或者M.只可能是B,S具体是多少,使用语料中的频率做估计。

到此,相信大家对“Python中的jieba源码分析”有了更深的了解,不妨来实际操作一番吧!这里是编程网网站,更多相关内容可以进入相关频道进行查询,关注我们,继续学习!

--结束END--

本文标题: Python中的jieba源码分析

本文链接: https://www.lsjlt.com/news/229538.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • Python中的jieba源码分析
    本篇内容主要讲解“Python中的jieba源码分析”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Python中的jieba源码分析”吧!前言jieba分词是Python 里面几个比较流行的中文...
    99+
    2023-06-02
  • python 中的jieba分词库
    目录1、jieba库安装2、jieba库功能介绍3、案例3.1、精确模式3.2、全模式3.3、搜索引擎模式3.4、修改词典3.5、词性标注3.6、统计三国演义中人物出场的次数jieb...
    99+
    2024-04-02
  • Python中文分词--jieba的基本
    中文分词的原理1、中文分词(Chinese Word Segmentation) 指的是将一个汉字序列切分成一个一个单独的词。分词就是将连续的字序列按照一定的规范重新组合成词序列的过程2、现有的分词算法可分为三大类:基于字符串匹配的分词方法...
    99+
    2023-01-31
    分词 中文 Python
  • django源码分析 python ma
    django是一个快速开发web应用的框架, 笔者也在django框架上开发不少web应用,闲来无事,就想探究一下django底层到底是如何实现的,本文记录了笔者对django源码的分析过程 I believe to become a ...
    99+
    2023-01-31
    源码 django ma
  • java 中Buffer源码的分析
    java 中Buffer源码的分析BufferBuffer的类图如下:除了Boolean,其他基本数据类型都有对应的Buffer,但是只有ByteBuffer才能和Channel交互。只有ByteBuffer才能产生Direct的buffe...
    99+
    2023-05-31
    java buffer源码 buf
  • JDK1.8中的ConcurrentHashMap源码分析
     一、容器初始化 1、源码分析 在jdk8的ConcurrentHashMap中一共有5个构造方法,这四个构造方法中都没有对内部的数组做初始化, 只是对一些变量的初始值做...
    99+
    2024-04-02
  • Java中的CyclicBarrier源码分析
    这篇文章主要介绍了Java中的CyclicBarrier源码分析的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇Java中的CyclicBarrier源码分析文章都会有所收获,下面我们一起来看看吧。CyclicB...
    99+
    2023-06-30
  • python架构PyNeuraLogic源码分析
    这篇“python架构PyNeuraLogic源码分析”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“python架构PyNe...
    99+
    2023-07-05
  • python源码剖析之PyObject的示例分析
    这篇文章主要介绍python源码剖析之PyObject的示例分析,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!一、Python中的对象Python中一切皆是对象。————Guido van Rossum(1989)这...
    99+
    2023-06-15
  • Golang中sync.Mutex源码分析
    本篇内容介绍了“Golang中sync.Mutex源码分析”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!Mutex结构type M...
    99+
    2023-07-05
  • spring Kafka中的@KafkaListener源码分析
    本篇内容主要讲解“spring Kafka中的@KafkaListener源码分析”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“spring Kafka中的@KafkaListener源码分析”...
    99+
    2023-07-05
  • Python中jieba分词模块的用法
    这篇文章主要讲解了“Python中jieba分词模块的用法”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“Python中jieba分词模块的用法”吧!0、前言jieba库是进行中文分词的利器,...
    99+
    2023-06-04
  • python数学建模源码分析
    这篇文章主要介绍了python数学建模源码分析的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇python数学建模源码分析文章都会有所收获,下面我们一起来看看吧。SciPy 学习'''Sc...
    99+
    2023-07-06
  • Python基于jieba分词实现snownlp情感分析
    情感分析(sentiment analysis)是2018年公布的计算机科学技术名词。 它可以根据文本内容判断出所代表的含义是积极的还是负面的,也可以用来分析文本中的意思是褒义还是贬...
    99+
    2023-01-30
    Python snownlp情感分析 Python 情感分析 Python snownlp
  • python源文件中字符编码的示例分析
    这篇文章将为大家详细讲解有关python源文件中字符编码的示例分析,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。Python的优点有哪些1、简单易用,与C/C++、Java、C# 等传统语言相比,Pyth...
    99+
    2023-06-14
  • CesiumJS源码分析
    这篇文章主要介绍“CesiumJS源码分析”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“CesiumJS源码分析”文章能帮助大家解决问题。1. 有什么光CesiumJS 支持的光的类型比较少,默认场...
    99+
    2023-07-06
  • SocketServer 源码分析
    Creating network servers. contents SocketServer.py contents file head BaseServer BaseServer.serve_forever BaseServ...
    99+
    2023-01-31
    源码 SocketServer
  • RateLimiter 源码分析
    俗话说得好,缓存,限流和降级是系统的三把利剑。刚好项目中每天早上导出数据时因调订单接口频率过高,订单系统担心会对用户侧的使用造成影响,让我们对调用限速一下,所以就正好用上了。 常用的限流算法有2种:漏桶算法和令牌桶算法。漏桶算法漏...
    99+
    2023-05-31
    ratelimiter 源码 mi
  • Vue中AST源码解析的示例分析
    这篇文章主要介绍Vue中AST源码解析的示例分析,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!从这个函数开始的:// Line-3924  Vue.prototy...
    99+
    2024-04-02
  • MySQL中MHA源码的示例分析
    小编给大家分享一下MySQL中MHA源码的示例分析,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧! MySQL的高可用方案很多,...
    99+
    2024-04-02
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作