【抢单源码开发】【linux源码github网址】【3172陪玩源码】jieba源码分析

时间:2024-12-28 05:52:34 来源:自走铜锣源码 分类:热点

1.jieba分词详解
2.利用Python爬虫爬取淘宝商品做数据挖掘分析实战篇,码分超详细教程
3.jieba源码解析(一)——中文分词
4.如何利用python实现词频图?码分
5.Python 结巴分词(jieba)源码分析
6.深入 Dify 源码,定位知识库检索的码分大模型调用异常

jieba源码分析

jieba分词详解

        “结巴”分词是一个Python 中文分词组件,参见 /fxsjy/jieba

        可以对中文文本进行分词、词性标注、关键词抽取等功能,并且支持自定义词典。

        本文包括以下内容:

        1、jieba分词包的安装

        2、jieba分词的使用教程

        3、jieba分词的工作原理与工作流程

        4、jieba分词所涉及到的HMM、TextRank、TF-IDF等算法介绍

        可以直接使用pip来进行安装:

        sudo pip install jieba

        或者

        sudo pip3 install jieba

        关键词抽取有两种算法,基于TF-IDF和基于TextRank:

        jieba分词有三种不同的分词模式:精确模式、全模式和搜索引擎模式:

        对应的,函数前加l即是对应得到list结果的函数:

        精确模式是最常用的分词方法,全模式会将句子中所有可能的词都列举出来,搜索引擎模式则适用于搜索引擎使用。具体的差别可在下一节工作流程的分析中详述。

        在上述每个函数中,都有名为HMM的参数。这一项表示是否在分词过程中利用HMM进行新词发现。关于HMM,本文附录中将简述相关知识。

        另外分词支持自定义字典,词典格式和 dict.txt 一样,一个词占一行;每一行分三部分:词语、词频(可省略)、词性(可省略),用空格隔开,顺序不可颠倒。

        具体使用方法为:

        关键词抽取的两个函数的完整参数为:

        可以通过

        来打开或关闭并行分词功能。

        个人感觉一般用不到,大文件分词需要手动实现多进程并行,句子分词也不至于用这个。

        jieba分词主要通过词典来进行分词及词性标注,两者使用了一个相同的词典。正因如此,分词的结果优劣将很大程度上取决于词典,虽然使用了HMM来进行新词发现。

        jieba分词包整体的工作流程如下图所示:

        下面将根据源码详细地分析各个模块的工作流程。

        在之后几节中,我们在蓝色的方框中示范了关键步骤的输出样例或词典文件的格式样例。在本节中都采用类似的表示方式。

        jieba分词中,首先通过对照典生成句子的有向无环图,再根据选择的模式不同,根据词典寻找最短路径后对句子进行截取或直接对句子进行截取。对于未登陆词(不在词典中的词)使用HMM进行新词发现。

        词典的格式应为

        word1 freq1 word_type1

        word2 freq2 word_type2

        …

        其中自定义用户词典中词性word_type可以省略。

        词典在其他模块的流程中可能也会用到,为方便叙述,后续的流程图中将会省略词典的初始化部分。

        图b演示了搜索引擎模式的工作流程,它会在精确模式分词的基础上,将长词再次进行切分。

        在这里我们假定读者已经了解HMM相关知识,如果没有可先行阅读下一章内容中的HMM相关部分或者跳过本节。

        在jieba分词中,将字在词中的位置B、M、E、S作为隐藏状态,字是观测状态,使用了词典文件分别存储字之间的表现概率矩阵(finalseg/prob_emit.py)、初始概率向量(finalseg/prob_start.py)和转移概率矩阵(finalseg/prob_trans.py)。这就是一个标准的解码问题,根据概率再利用viterbi算法对最大可能的隐藏状态进行求解。

        词性分析部分与分词模块用了同一个基础的分词器,对于词典词的词性,将直接从词典中提取,但是对于新词,词性分析部分有一个专属的新词及其词性的发现模块。

        用于词性标注的HMM模型与用于分词的HMM模型相似,同样将文字序列视为可见状态,但是隐藏状态不再是单单的词的位置(B/E/M/S),而变成了词的位置与词性的组合,如(B,v)(B,n)(S,n)等等。因此其初始概率向量、转移概率矩阵和表现概率矩阵和上一节中所用的相比都要庞大的多,但是其本质以及运算步骤都没有变化。

        具体的工作流程如下图所示。

        jieba分词中有两种不同的用于关键词抽取的算法,分别为TextRank和TF-IDF。实现流程比较简单,其核心在于算法本身。下面简单地画出实现流程,具体的算法可以参阅下一章内容。

        TextRank方法默认筛选词性,而TF-IDF方法模型不进行词性筛选。

        在本章中,将会简单介绍相关的算法知识,主要包括用于新词发现的隐马尔科夫模型和维特比算法、用于关键词提取的TextRank和TF-IDF算法。

        HMM即隐马尔科夫模型,是一种基于马尔科夫假设的统计模型。之所以为“隐”,是因为相较于马尔科夫过程HMM有着未知的参数。在世界上,能看到的往往都是表象,而事物的真正状态往往都隐含在表象之下,并且与表象有一定的关联关系。

        其中,S、O分别表示状态序列与观测序列。

        如果读者还对这部分内容心存疑问,不妨先往下阅读,下面我们将以一个比较简单的例子对HMM及解码算法进行实际说明与演示,在读完下一小节之后再回来看这些式子,或许能够恍然大悟。

        下面以一个简单的例子来进行阐述:

        假设小明有一个网友小红,小红每天都会在朋友圈说明自己今天做了什么,并且假设其仅受当天天气的影响,而当天的天气也只受前一天天气的影响。

        于小明而言,小红每天做了什么是可见状态,而小红那里的天气如何就是隐藏状态,这就构成了一个HMM模型。一个HMM模型需要有五个要素:隐藏状态集、观测集、转移概率、观测概率和初始状态概率。

        即在第j个隐藏状态时,表现为i表现状态的概率。式中的n和m表示隐藏状态集和观测集中的数量。

        本例中在不同的天气下,小红要做不同事情的概率也不同,观测概率以表格的形式呈现如下:

        其中

        除此之外,还需要一个初始状态概率向量π,它表示了观测开始时,即t=0时,隐藏状态的概率值。本例中我们指定π={ 0,0,1}。

        至此,一个完整的隐马尔科夫模型已经定义完毕了。

        HMM一般由三类问题:

概率计算问题,即给定A,B,π和隐藏状态序列,计算观测序列的概率;

预测问题,也成解码问题,已知A,B,π和观测序列,求最优可能对应的状态序列;

学习问题,已知观测序列,估计模型的A,B,π参数,使得在该模型下观测序列的概率最大,即用极大似然估计的方法估计参数。

        在jieba分词中所用的是解码问题,所以此处对预测问题和学习问题不做深入探讨,在下一小节中我们将继续以本节中的例子为例,对解码问题进行求解。

        在jieba分词中,采用了HMM进行新词发现,它将每一个字表示为B/M/E/S分别代表出现在词头、词中、词尾以及单字成词。将B/M/E/S作为HMM的隐藏状态,而连续的各个单字作为观测状态,其任务即为利用观测状态预测隐藏状态,并且其模型的A,B,π概率已经给出在文件中,所以这是一个标准的解码问题。在jieba分词中采用了Viterbi算法来进行求解。

        Viterbi算法的基本思想是:如果最佳路径经过一个点,那么起始点到这个点的路径一定是最短路径,否则用起始点到这点更短的一条路径代替这段,就会得到更短的路径,这显然是矛盾的;从起始点到结束点的路径,必然要经过第n个时刻,假如第n个时刻有k个状态,那么最终路径一定经过起始点到时刻n中k个状态里最短路径的点。

        将时刻t隐藏状态为i所有可能的状态转移路径i1到i2的状态最大值记为

        下面我们继续以上一节中的例子来对viterbi算法进行阐述:

        小明不知道小红是哪里人,他只能通过小红每天的活动来推断那里的天气。

        假设连续三天,小红的活动依次为:“睡觉-打游戏-逛街”,我们将据此计算最有可能的天气情况。

        表示第一天为雨天能够使得第二天为晴天的概率最大(也就是说如果第二天是晴天在最短路径上的话,第一天是雨天也一定在最短路径上,参见上文中Viterbi算法的基本思想)

        此时已经到了最后的时刻,我们开始回溯。

        其计算过程示意图如下图所示。

        )的路径。

        TF-IDF(词频-逆文本频率)是一种用以评估字词在文档中重要程度的统计方法。它的核心思想是,如果某个词在一篇文章中出现的频率即TF高,并且在其他文档中出现的很少,则认为这个词有很好的类别区分能力。

        其中:

        TextRank是一种用以关键词提取的算法,因为是基于PageRank的,所以先介绍PageRank。

        PageRank通过互联网中的超链接关系确定一个网页的排名,其公式是通过一种投票的思想来设计的:如果我们计算网页A的PageRank值,那么我们需要知道哪些网页链接到A,即首先得到A的入链,然后通过入链给网页A进行投票来计算A的PR值。其公式为:

        其中:

        d为阻尼系数,取值范围为0-1,代表从一定点指向其他任意点的概率,一般取值0.。

        将上式多次迭代即可直到收敛即可得到结果。

        TextRank算法基于PageRank的思想,利用投票机制对文本中重要成分进行排序。如果两个词在一个固定大小的窗口内共同出现过,则认为两个词之间存在连线。

        公式与PageRank的基本相同。多次迭代直至收敛,即可得到结果。

在jieba分词中,TextRank设定的词窗口大小为5,将公式1迭代次的结果作为最终权重的结果,而不一定迭代至收敛。

利用Python爬虫爬取淘宝商品做数据挖掘分析实战篇,超详细教程

       项目内容

       案例选择商品类目:沙发;数量:共页个商品;筛选条件:天猫、码分销量从高到低、码分价格元以上。码分抢单源码开发

       以下是码分分析,源码点击文末链接

       项目目的码分

       1. 对商品标题进行文本分析,词云可视化。码分

       2. 不同关键词word对应的码分sales统计分析。

       3. 商品的码分价格分布情况分析。

       4. 商品的码分销量分布情况分析。

       5. 不同价格区间的码分商品的平均销量分布。

       6. 商品价格对销量的码分影响分析。

       7. 商品价格对销售额的码分影响分析。

       8. 不同省份或城市的商品数量分布。

       9. 不同省份的商品平均销量分布。

       注:本项目仅以以上几项分析为例。

       项目步骤

       1. 数据采集:Python爬取淘宝网商品数据。

       2. 数据清洗和处理。

       3. 文本分析:jieba分词、wordcloud可视化。

       4. 数据柱形图可视化barh。

       5. 数据直方图可视化hist。

       6. 数据散点图可视化scatter。

       7. 数据回归分析可视化regplot。

       工具&模块:

       工具:本案例代码编辑工具Anaconda的Spyder。

       模块:requests、retrying、missingno、jieba、matplotlib、wordcloud、imread、linux源码github网址seaborn等。

       原代码和相关文档后台回复“淘宝”下载。

       一、爬取数据

       因淘宝网是反爬虫的,虽然使用多线程、修改headers参数,但仍然不能保证每次%爬取,所以,我增加了循环爬取,直至所有页爬取成功停止。

       说明:淘宝商品页为JSON格式,这里使用正则表达式进行解析。

       代码如下:

       二、数据清洗、处理:

       (此步骤也可以在Excel中完成,再读入数据)

       代码如下:

       说明:根据需求,本案例中只取了item_loc、raw_title、view_price、view_sales这4列数据,主要对标题、区域、价格、销量进行分析。

       代码如下:

       三、数据挖掘与分析:

       1. 对raw_title列标题进行文本分析:

       使用结巴分词器,安装模块pip install jieba。

       对title_s(list of list格式)中的每个list的元素(str)进行过滤,剔除不需要的词语,即把停用词表stopwords中有的词语都剔除掉:

       为了准确性,这里对过滤后的数据title_clean中的每个list的元素进行去重,即每个标题被分割后的词语唯一。

       观察word_count表中的3172陪玩源码词语,发现jieba默认的词典无法满足需求。

       有的词语(如可拆洗、不可拆洗等)却被cut,这里根据需求对词典加入新词(也可以直接在词典dict.txt里面增删,然后载入修改过的dict.txt)。

       词云可视化:

       安装模块wordcloud。

       方法1:pip install wordcloud。

       方法2:下载Packages安装:pip install 软件包名称。

       软件包下载地址:lfd.uci.edu/~gohlke/pyt...

       注意:要把下载的软件包放在Python安装路径下。

       代码如下:

       分析

       1. 组合、整装商品占比很高;

       2. 从沙发材质看:布艺沙发占比很高,比皮艺沙发多;

       3. 从沙发风格看:简约风格最多,北欧风次之,其他风格排名依次是美式、中式、日式、法式等;

       4. 从户型看:小户型占比最高、大小户型次之,大户型最少。

       2. 不同关键词word对应的sales之和的统计分析:

       (说明:例如词语‘简约’,则统计商品标题中含有‘简约’一词的商品的销量之和,即求出具有‘简约’风格的商品销量之和)

       代码如下:

       对表df_word_sum中的word和w_s_sum两列数据进行可视化。

       (本例中取销量排名前的词语进行绘图)

       由图表可知:

       1. 组合商品销量最高;

       2. 从品类看:布艺沙发销量很高,远超过皮艺沙发;

       3. 从户型看:小户型沙发销量最高,大小户型次之,大户型销量最少;

       4. 从风格看:简约风销量最高,北欧风次之,其他依次是中式、美式、日式等;

       5. 可拆洗、转角类沙发销量可观,也是颇受消费者青睐的。

       3. 商品的垂直折叠导航源码价格分布情况分析:

       分析发现,有一些值太大,为了使可视化效果更加直观,这里我们选择价格小于的商品。

       代码如下:

       由图表可知:

       1. 商品数量随着价格总体呈现下降阶梯形势,价格越高,在售的商品越少;

       2. 低价位商品居多,价格在-之间的商品最多,-之间的次之,价格1万以上的商品较少;

       3. 价格1万元以上的商品,在售商品数量差异不大。

       4. 商品的销量分布情况分析:

       同样,为了使可视化效果更加直观,这里我们选择销量大于的商品。

       代码如下:

       由图表及数据可知:

       1. 销量以上的商品仅占3.4%,其中销量-之间的商品最多,-之间的次之;

       2. 销量-之间,商品的数量随着销量呈现下降趋势,且趋势陡峭,低销量商品居多;

       3. 销量以上的商品很少。

       5. 不同价格区间的商品的平均销量分布:

       代码如下:

       由图表可知:

       1. 价格在-之间的商品平均销量最高,-之间的次之,元以上的最低;

       2. 总体呈现先增后减的趋势,但最高峰处于相对低价位阶段;

       3. 说明广大消费者对购买沙发的需求更多处于低价位阶段,在元以上价位越高平均销量基本是越少。

       6. 商品价格对销量的影响分析:

       同上,为了使可视化效果更加直观,这里我们选择价格小于的商品。

       代码如下:

       由图表可知:

       1. 总体趋势:随着商品价格增多其销量减少,商品价格对其销量影响很大;

       2. 价格-之间的少数商品销量冲的很高,价格-之间的商品多数销量偏低,少数相对较高,但价格以上的商品销量均很低,没有销量突出的神马网站php源码商品。

       7. 商品价格对销售额的影响分析:

       代码如下:

       由图表可知:

       1. 总体趋势:由线性回归拟合线可以看出,商品销售额随着价格增长呈现上升趋势;

       2. 多数商品的价格偏低,销售额也偏低;

       3. 价格在0-的商品只有少数销售额较高,价格2万-6万的商品只有3个销售额较高,价格6-万的商品有1个销售额很高,而且是最大值。

       8. 不同省份的商品数量分布:

       代码如下:

       由图表可知:

       1. 广东的最多,上海次之,江苏第三,尤其是广东的数量远超过江苏、浙江、上海等地,说明在沙发这个子类目,广东的店铺占主导地位;

       2. 江浙沪等地的数量差异不大,基本相当。

       9. 不同省份的商品平均销量分布:

       代码如下:

       热力型地图

       源码:Python爬取淘宝商品数据挖掘分析实战

jieba源码解析(一)——中文分词

       全模式解析:

       全模式下的中文分词通过构建字典树和DAG实现。首先加载字典,字典树中记录词频,例如词"不拘一格"在字典树中表示为{ "不" : 0, "不拘" : 0, "不拘一" : 0, "不拘一格" : freq}。接着构造DAG,表示连续词段的起始位置。例如句子'我来到北京清华大学',分词过程如下:

       1. '我':字典树中key=0,尝试'我来',不在字典,结束位置0寻找可能的分词,DAG为 { 0:[0]}。

       2. '来':字典树中key=1,尝试'来到',在字典,继续尝试'来到北',不在字典,结束位置1寻找可能的分词,DAG为 { 0:[0], 1:[1]}。

       3. '到':字典树中key=2,尝试'来到北',不在字典,结束位置2寻找可能的分词,DAG为 { 0:[0], 1:[1], 2:[2]}。

       4. 以此类推,最终形成所有可能分词结果:我/ 来到/ 北京/ 清华/ 清华大学/ 华大/ 大学。

       全模式的关键代码涉及字典树和DAG的构建与使用。

       精确模式与HMM模式解析:

       精确模式与HMM模式对句子'我来到北京清华大学'的分词结果分别为:

       精确模式:'我'/'来到'/'北京'/'清华大学'

       HMM模式:'我'/'来到'/'了'/'北京'/'清华大学'

       HMM模式解决了发现新词的问题。解析过程分为三个步骤:

       1. 生成所有可能的分词。

       2. 生成每个key认为最好的分词。

       3. 按照步骤2的方式对每个key的结果从前面向后组合,注意判断单字与下个单字是否可以组成新词。

       最后,解析结果为:我/ 来到/ 北京/ 清华/ 清华大学

       HMM模式中的Viterbi算法在jieba中用于发现新词。算法通过统计和概率计算,实现新词的发现与分词。

       具体应用中,HMM模型包含五个元素:隐含状态、可观测状态、初始状态概率矩阵、隐含状态转移概率矩阵、观测状态转移概率矩阵。模型利用这些元素实现状态预测与概率计算,进而实现中文分词与新词发现。

       在Viterbi算法中,重要的是理解隐含状态、可观测状态、转移概率矩阵之间的关系,以及如何利用这些信息进行状态预测和概率计算。具体实现细节在代码中体现,包括字典树构建、DAG构造、概率矩阵应用等。

如何利用python实现词频图?

       在处理语言文本时,词频分析是一个常见任务,通常涉及将文本中的句子分解成单词,并根据词频进行排序。Python 提供了一个强大的工具库,jieba,来实现这一功能。

       首先,确保你已经正确安装了jieba库。有三种方式可以安装:

       1. **全自动安装**:使用命令`easy_install jieba`或`pip install jieba`或`pip3 install jieba`。

       2. **半自动安装**:下载源代码,解压缩后运行`python setup.py install`。

       3. **手动安装**:将jieba文件放置在当前目录或site-packages目录下。

       jieba库提供了几个主要的分词方法:

       - **jieba.cut**:接受四个参数:待分词的字符串、是否采用全模式、是否使用HMM模型、是否使用paddle模式。默认返回生成器,可通过`list`转换为列表或使用`jieba.lcut`方法。

       - **jieba.cut_for_search**:与`cut`类似,但更适合搜索引擎构建倒排索引,粒度更细。同样返回生成器,可通过`list`或`jieba.lcut_for_search`方法获取列表。

       - **jieba.Tokenizer**:用于创建自定义分词器,允许同时使用不同词典,使用默认词典`jieba.dt`。

       分词示例如下:

       输出:

       建立前缀字典从默认字典... 加载模型从缓存 C:\Users\FURONG~1\AppData\Local\Temp\jieba.cache 加载模型耗时 0. 秒。成功建立前缀字典。Paddle 模式:我/来到/北京/清华大学 Paddle 模式:乒乓球/拍卖/完/了 Paddle 模式:中国/科学技术/大学 全模式:我/来到/北京/清华大学 他, 来到, 了, 网易, 杭研, 大厦 小明, 硕士, 毕业, 于, 中国, 科学, 学院, 科学院, 中国科学院, 计算, 计算所, ,, 后, 在, 日本, 京都, 大学, 日本京都大学, 深造

       可以加载自定义词典,格式与`dict.txt`(jieba库安装时自带的词典)相同,一个词占一行,每行分三部分。更改分词器的`tmp_dir`和`cache_file`属性,可以指定缓存文件所在的文件夹和文件名,用于受限的文件系统。加载自定义词典示例和动态修改词典的`add_word`、`del_word`方法。

       词性标注示例如下:

       我 r 爱 v 北京 ns 天安门 ns

       词性和专名类别标签如下表,其中词性标签个(小写字母),专名类别标签4个(大写字母):

       接下来,以小说判官.txt为例进行实例分析,以识别人物、名词、地名,对小说有初步了解。以下是分词代码、按词频排序、制作柱图和词云图的步骤。

       人物部分:

       序号 词性 词频 柱图 1 闻时 ------------------------------ 2 谢问 ----------------------- ...

       名词部分:

       序号 词性 词频 柱图 1 时候 ------------------------------ 2 有点 ----------------- ...

       地名部分:

       序号 词性 词频 柱图 1 夏樵 ------------------------------ 2 东西 -------------------- ...

       完整代码如下,详细说明请参考jieba官方文档和示例代码。

Python 结巴分词(jieba)源码分析

       本文深入分析Python结巴分词(jieba)的源码,旨在揭示其算法实现细节与设计思路,以期对自然语言处理领域感兴趣的朋友提供有价值的参考。经过两周的细致研究,作者整理了分词算法、实现方案及关键文件结构的解析,以供读者深入理解结巴分词的底层逻辑。

       首先,分词算法涉及的核心技术包括基于Trie树结构的高效词图扫描、动态规划查找最大概率路径和基于HMM模型的未登录词处理。Trie树用于生成句子中所有可能成词情况的有向无环图(DAG),动态规划则帮助在词频基础上寻找到最优切分组合,而HMM模型则通过Viterbi算法处理未在词库中出现的词语,确保分词的准确性和全面性。

       在结巴分词的文件结构中,作者详细介绍了各个关键文件的功能与内容。dict.txt作为词库,记录着词频与词性信息;__init__.py则是核心功能的入口,提供了分词接口cut,支持全模式、精确模式以及结合最大概率路径与HMM模型的综合模式。全模式下,会生成所有可能的词组合;精确模式通过最大概率路径确定最优分词;综合模式则同时考虑概率与未登录词,以提高分词效果。

       实现细节方面,文章通过实例代码解释了全模式、精确模式及综合模式的分词逻辑。全模式直接输出所有词组合;精确模式基于词频和最大概率路径策略,高效识别最优分词;综合模式利用HMM模型处理未登录词,进一步提升分词准确度。通过生成的DAG图,直观展示了分词过程。

       结巴分词的代码实现简洁而高效,通过巧妙的算法设计和数据结构应用,展示了自然语言处理技术在实际应用中的强大能力。通过对分词算法的深入解析,不仅有助于理解结巴分词的功能实现,也为自然语言处理领域的研究与实践提供了宝贵的洞察。

深入 Dify 源码,定位知识库检索的大模型调用异常

       深入分析Dify源码:大模型调用异常定位

       在使用Dify服务与Xinference的THUDM/glm-4-9b-chat模型部署时,遇到了知识库检索节点执行时报错大模型GPT3.5不存在的问题。异常出乎意料,因为没有额外信息可供进一步定位。

       通过源码和服务API调用链路的分析,我们发现问题的关键在于知识库检索的实现。该功能在api/core/rag/datasource/retrieval_service.py中,其中混合检索由向量检索和全文检索组成。我们关注了关键词检索、向量检索和全文检索这三个基础检索方式:

       关键词检索:仅使用jieba进行关键词提取,无大模型介入。

       向量检索:通过向量库直接搜索,如Milvus,无大模型调用。

       全文检索:使用BM,大部分向量库不支持,实际操作中返回空列表。

       问题出现在知识库检索节点的多知识库召回判断中,N选1召回模式会调用大模型以决定知识库。在配置环节,前端HTTP请求显示配置错误,使用了不存在的GPT3.5模型。

       经测试,手工创建的知识库检索节点使用了正确的glm-4-9b-chat模型,问题出在默认模板的配置上,即N选1召回模式默认选择了GPT3.5。本地部署时,如果没有配置相应模型,会导致错误出现。

       总结来说,解决方法是修改默认模板,将知识库检索的默认模式改为多路召回,这样可以避免新手在本地部署时遇到困扰。建议Dify官方在模板中改进这一设置,以简化用户部署流程。