日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

中文分词库jieba介绍

發布時間:2023/12/10 编程问答 42 豆豆
生活随笔 收集整理的這篇文章主要介紹了 中文分词库jieba介绍 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

1.jieba庫是較好的中文分詞詞庫

2.jieba庫分詞思想有三步:定義前綴詞典,構建字典樹;生成句子有向圖,路徑規劃輸出最優路徑;基于HMM模型求解decoding問題

3.生成句子有向圖本質是貝葉斯網絡,路徑規劃實質是求解聯合概率分布

4.jieba的HMM模型的隱狀態有四種:BMES,基于大量語料庫初始化參數(初始概率分布,轉移矩陣和發射矩陣)

分詞是對文本預處理重要環節,英文分詞可以針對空格切分達到很好的效果。而中國文字博大精深,需要用一定的方法處理。本文就介紹基于python第三方庫jieba分詞庫,它是比較好的中文分詞詞庫。jieba庫的分詞原理主要有三項:

  • 基于前綴詞典實現高效的詞圖掃描,生成句子中漢字所有可能成詞情況所構成的向無環圖(DAG)

  • 采用了動態規劃查找最大概率路徑, 找出基于詞頻的最大切分組合

  • 對于未登錄詞,采用了基于漢字成詞能力的HMM模型,使用Viterbi算法求解

前綴詞典與DAG

首先是前綴詞典的掃描。jieba庫是利用了Tier樹進行高效掃描,Tier樹中文名叫字典樹、前綴樹。它的用途主要是將字符串整合成樹形。

比如由“清華”、“清華大學”、“清白”、“中華”、“華夏”五個中文詞構成的Tier樹:

這個樹里面每一個方塊代表一個節點,其中根節點Root不代表任何字符;紫色代表分支節點;綠色代表葉子節點。除根節點外每一個節點都只包含一個字符。從根節點到葉子節點,路徑上經過的字符連接起來,構成一個詞。而葉子節點內的數字代表該詞在字典樹中所處的鏈路(字典中有多少個詞就有多少條鏈路),具有共同前綴的鏈路稱為串。

字典樹有以下三個特點:

  • 具有相同前綴的詞必須位于同一個串內

比如“清華”和“清白”兩個詞語,都有“清”這個前綴,那么在字典樹上只需要構建一個“清”節點即可,這在一定程度減少存儲空間。

  • 字典樹中的詞只可共用前綴,不可共用詞的其他部分

比如“華夏”和“中華”,這兩個詞都有共同的后綴“華”,但在字典樹上必須是兩條獨立的鏈路,即字典樹僅依靠公共前綴壓縮字典存儲空間。再看“清華大學”這個詞語,“大學”也是一個詞語,但是“清華大學”的后綴,所以“大學”必須從根節點開始重新構建。

  • 一個完整的詞必須從根節點開始,至葉子節點結束

字典樹實質是一個有限狀態自動機(Definite Automata,DFA),它從一個節點(狀態)轉移到另一個節點(狀態)的行為完全由狀態轉移函數控制,而狀態轉移函數本質上是一種映射,這意味著:逐字搜索字典樹時,從一個字符到下一個字符比對是不需要遍歷該節點的所有子節點的。

構建完字典樹后就可以生成句子的有向無環圖(DAG)

假設對于待切分的字符串(句子)有m個字符,考慮每個字符左右兩邊的位置,則有m+1個點,編號從0~m,把候選詞看成邊,根據前綴詞典生成一個切分圖。比如句子“我畢業于北京大學”:

“我”這條邊起點是0,終點是1;“畢業”這條邊起點是1,終點是3,依次類推,根據詞典,我們可以得到兩條路徑:

路徑1:0-1-3-4-6-8 ?切分方案S1:我/畢業/于/北京/大學

路徑2:0-1-3-4-8 ?? ??切分方案S2:我/畢業/于/北京大學

動態規劃

對于方案S1和S2,我們最終選取哪種切分方案呢。jieba庫的字典樹會標記每個詞的頻率,它存儲在dict.txt文件中:

該文件每一行代表一個詞語,每一行存儲【詞名?詞頻?詞性】三個字段。

注:詞性標注表在網上有大量資料,讀者可以自行查找

在知道每個詞出現的頻率之后,就可以基于動態規劃的方法來尋找概率最大的分詞路徑,這里采取從右往左去尋找最優路徑。具體怎么做,其實就是算每種路徑的聯合概率分布,還記得有向無環圖(DAG)其實是一種貝葉斯網絡嘛,我們在概率圖模型中介紹過其聯合概率分布的公式:

傳送門:概率圖模型(模型表示)

比如對于上一節的兩種路徑S1和S2,它其實對應著兩個貝葉斯網絡:

分別計算他們的聯合概率分布,最大的那個即為最終切分方案

注:jieba分詞是從右往左,所以實際中方向與上圖箭頭相反

HMM的譯碼分詞

如果遇到一些詞典中沒有的詞語,那怎么辦呢。jieba采取了HMM模型進行生成,它主要是進行譯碼(Decoding)問題:


回顧一下HMM模型,要求解上述狀態序列,需要知道HMM的參數λ=(π,A,B),即初始狀態概率分布π,狀態轉移矩陣A和發射矩陣B.

傳送門:

隱馬爾可夫模型(背景介紹)

隱馬爾可夫模型(前向算法與后向算法)

隱馬爾可夫模型(Baum Welch算法與Viterbi算法)

隱馬爾可夫模型(模型推斷五大問題)

隱馬爾可夫模型(算法流程&實例演示)

那么在jieba庫里,這三個參數是什么呢。jieba庫首先定義了四種狀態BEMS,B是開始,begin位置;E是end,是結束位置;M是middle,是中間位置;S是singgle,單獨成詞的位置,沒有前,也沒有后。采用(B、E、M、S)這四種狀態來標記中文詞語,比如北京可以標注為 BE;中華民族可以標注為BMME,就是開始、中間、中間、結束。

然后采用大量的語料進行訓練,得到了HMM的參數λ,分別存儲在finalseg目錄下的三個文件(prob_start.py、prob_trans.py 、prob_emit.py 、?)

我們來大概瀏覽一下這三個文件的內容,

  • 初始狀態分布π

  • 狀態轉移矩陣A:

  • 發射矩陣B:

jieba庫應用

總結一下,jieba庫的分詞原理是:生成字典樹——給定句子生成DAG——路徑規劃輸出概率最大切分組合——不在字典樹的詞語基于HMM模型求解Decoding問題

這一節我們簡單介紹一下jieba庫在代碼層面的具體應用。

  • 分詞

import?jieba jieba.cut(sentence,cut_all=False,HMM=True,use_paddle=False) jieba.cut_for_search(sentence,HMM=True)

cut 方法接受四個輸入參數: 需要分詞的字符串;cut_all 參數用來控制是否采用全模式;HMM 參數用來控制是否使用 HMM 模型;use_paddl參數是否使用訓練序列標注(雙向GRU)網絡模型實現分詞。

cut_for_search 方法接受兩個參數:需要分詞的字符串;是否使用 HMM 模型。該方法適合用于搜索引擎構建倒排索引的分詞,粒度比較細。

上面兩個方法返回的結構是?generator,利用jieba.lcut?以及?jieba.lcut_for_search?直接返回 list

注:paddle需要額外安裝,官網見參考資料

  • 字典

jieba.load_userdict(filename) jieba.add_word(word, freq=None, tag=None) jieba.del_word(word) jieba.suggest_freq(segment, tune=False)

?????????????????????????????load_userdict方法添加自定義詞典,詞典格式和 dict.txt 一樣,詞頻和詞性可省略,順序不可顛倒;add_word和?del_word可在程序中動態修改詞典;suggest_freq可調節單個詞語的詞頻

  • 關鍵詞提取

   

import?jieba.analyse#基于TF-IDF算法的關鍵詞抽取 jieba.analyse.extract_tags(sentence, topK=20, withWeight=False, allowPOS=()) jieba.analyse.TFIDF(idf_path=None) #新建TFIDF 實例,idf_path 為IDF 頻率文件 jieba.analyse.set_idf_path(file_name)# 切換成自定義語料庫,file_name為自定義語料庫的路徑#基于TextRank算法的關鍵詞抽取 jieba.analyse.textrank(sentence, topK=20, withWeight=False, allowPOS=('ns', 'n', 'vn', 'v')) jieba.analyse.TextRank()#關鍵詞提取所使用停止詞 jieba.analyse.set_stop_words(file_name)

sentence為待提取的文本,topK 為返回權重最大的關鍵詞的個數,默認 20,withWeight 為是否一并返回關鍵詞權重值,默認 False,allowPOS 僅包括指定詞性的詞,默認為空。

TFIDF方法表示新建 TFIDF 實例,同理,TextRank方法新建自定義 TextRank 實例

  • 詞性標注

import?jieba import?jieba.posseg as?psegwords = pseg.cut(sentence) #jieba默認模式jieba.enable_paddle() words = pseg.cut(sentence, use_paddle=True) # paddle模式 for?word, flag in?words:print(' %s %s '?% (word, flag))jieba.posseg.POSTokenizer(tokenizer=None)

POSTokenizer 方法是新建自定義分詞器,tokenizer 參數可指定內部使用Tokenizer 分詞器。jieba.posseg.dt 為默認詞性標注分詞器。

  • 其他

import?jieba #返回詞語在原文的起止位置 re = jieba.tokenize(sentence,mode='search',HMM=True) #默認模式 for?i in?re:print("word %s\t\t start: %d \t\t end:%d"?% (i[0], i[1], i[2]))#延遲加載,初始化字典 jieba.initialize() # 手動初始化(可選) jieba.set_dictionary('data/dict.txt.big')

jieba 采用延遲加載,import jieba 和 jieba.Tokenizer()?不會立即觸發詞典的加載,一旦有必要才開始加載詞典構建前綴字典。也可以改變主詞典的路徑。

參考資料:

https://github.com/fxsjy/jieba

https://www.paddlepaddle.org.cn/

總結

以上是生活随笔為你收集整理的中文分词库jieba介绍的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。