1.如何利用python实现词频?码解
2.jiebaåè¯è¯¦è§£
3.Python 结巴分词(jieba)源码分析
4.深入 Dify 源码,定位知识库检索的码解大模型调用异常
5.jieba源码解析(一)——中文分词
6.深入剖析jieba分词机制
如何利用python实现词频?
在处理语言文本时,词频分析是码解一个常见任务,通常涉及将文本中的码解句子分解成单词,并根据词频进行排序。码解Python 提供了一个强大的码解mrna源码工具库,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`类似,但更适合搜索引擎构建倒排索引,粒度更细。简单操盘lt源码同样返回生成器,可通过`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官方文档和示例代码。
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 结巴分词(jieba)源码分析
本文深入分析Python结巴分词(jieba)的源码,旨在揭示其算法实现细节与设计思路,以期对自然语言处理领域感兴趣的朋友提供有价值的参考。经过两周的细致研究,作者整理了分词算法、实现方案及关键文件结构的解析,以供读者深入理解结巴分词的底层逻辑。
首先,分词算法涉及的核心技术包括基于Trie树结构的高效词图扫描、动态规划查找最大概率路径和基于HMM模型的未登录词处理。Trie树用于生成句子中所有可能成词情况的有向无环图(DAG),动态规划则帮助在词频基础上寻找到最优切分组合,而HMM模型则通过Viterbi算法处理未在词库中出现的词语,确保分词的蜜桃暴利源码准确性和全面性。
在结巴分词的文件结构中,作者详细介绍了各个关键文件的功能与内容。dict.txt作为词库,记录着词频与词性信息;__init__.py则是核心功能的入口,提供了分词接口cut,支持全模式、精确模式以及结合最大概率路径与HMM模型的综合模式。全模式下,会生成所有可能的词组合;精确模式通过最大概率路径确定最优分词;综合模式则同时考虑概率与未登录词,以提高分词效果。
实现细节方面,文章通过实例代码解释了全模式、精确模式及综合模式的分词逻辑。全模式直接输出所有词组合;精确模式基于词频和最大概率路径策略,高效识别最优分词;综合模式利用HMM模型处理未登录词,进一步提升分词准确度。通过生成的DAG图,直观展示了分词过程。
结巴分词的代码实现简洁而高效,通过巧妙的算法设计和数据结构应用,展示了自然语言处理技术在实际应用中的强大能力。通过对分词算法的通信达cross源码深入解析,不仅有助于理解结巴分词的功能实现,也为自然语言处理领域的研究与实践提供了宝贵的洞察。
深入 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官方在模板中改进这一设置,以简化用户部署流程。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构造、概率矩阵应用等。
深入剖析jieba分词机制
中文分词:打造最优Python中文词组划分模块。
引言:采用清晰明了的解释方式,结合源码,深入解析Jieba分词的基本原理
算法基本逻辑:构建全局前缀词典、建立有向无环图(DAG)
以sentence="基坑支护施工"为例,首先构建前缀词典,初始化并建立jieba自带词典、前缀词典和用户词典,注意词典中包含"4S店"时,前缀词典会生成"4"、"4S"、"4S店"。接着构建待分词语句的DAG图,通过两层循环判断当前词汇是否在前缀词典中,以实现分词有向无环图的建立。
动态规划选取最大词频路径:计算可能性最大的路径,使用动态规划算法找出基于词频的最大切分组合。
公式描述:其中,每条路径的概率计算基于词在前缀词典里的词频与所有词的词频之和的比值。如果词频为0或不存在,则视为词频为1。取对数概率,通过相加计算替代相乘,以防止下溢。
未登录词优化:对于未登录词,采用基于汉字成词能力的HMM模型,通过Viterbi算法优化分词结果。
总结:Jieba分词通过构建全局前缀词典、构建有向无环图、动态规划选取最大词频路径和优化未登录词,实现了高效、准确的中文文本划分,满足不同领域专业词汇的分词需求。