1.jiebaåè¯è¯¦è§£
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è¿ä»£æ¬¡çç»æä½ä¸ºæç»æéçç»æï¼èä¸ä¸å®è¿ä»£è³æ¶æã
jieba源码解析(一)——中文分词
全模式解析:
全模式下的中文分词通过构建字典树和DAG实现。首先加载字典,发现发现字典树中记录词频,源码例如词"不拘一格"在字典树中表示为{ "不" : 0,算法 "不拘" : 0, "不拘一" : 0, "不拘一格" : freq}。接着构造DAG,新词新词表示连续词段的发现发现新荣耀程序源码起始位置。例如句子'我来到北京清华大学',源码分词过程如下:
1. '我':字典树中key=0,算法尝试'我来',新词新词不在字典,发现发现结束位置0寻找可能的源码分词,DAG为 { 0:[0]}。算法
2. '来':字典树中key=1,新词新词snap源码尝试'来到',发现发现在字典,源码继续尝试'来到北',不在字典,结束位置1寻找可能的分词,DAG为 { 0:[0],etracing源码 1:[1]}。
3. '到':字典树中key=2,尝试'来到北',不在字典,结束位置2寻找可能的分词,DAG为 { 0:[0], 1:[1], 2:[2]}。
4. 以此类推,tool源码最终形成所有可能分词结果:我/ 来到/ 北京/ 清华/ 清华大学/ 华大/ 大学。
全模式的关键代码涉及字典树和DAG的构建与使用。
精确模式与HMM模式解析:
精确模式与HMM模式对句子'我来到北京清华大学'的分词结果分别为:
精确模式:'我'/'来到'/'北京'/'清华大学'
HMM模式:'我'/'来到'/'了'/'北京'/'清华大学'
HMM模式解决了发现新词的问题。解析过程分为三个步骤:
1. 生成所有可能的分词。
2. 生成每个key认为最好的分词。
3. 按照步骤2的paperwork 源码方式对每个key的结果从前面向后组合,注意判断单字与下个单字是否可以组成新词。
最后,解析结果为:我/ 来到/ 北京/ 清华/ 清华大学
HMM模式中的Viterbi算法在jieba中用于发现新词。算法通过统计和概率计算,实现新词的发现与分词。
具体应用中,HMM模型包含五个元素:隐含状态、可观测状态、初始状态概率矩阵、隐含状态转移概率矩阵、观测状态转移概率矩阵。模型利用这些元素实现状态预测与概率计算,进而实现中文分词与新词发现。
在Viterbi算法中,重要的是理解隐含状态、可观测状态、转移概率矩阵之间的关系,以及如何利用这些信息进行状态预测和概率计算。具体实现细节在代码中体现,包括字典树构建、DAG构造、概率矩阵应用等。