jieba分词实例
jieba社區(qū)活躍,它其實(shí)不只有分詞這一個(gè)功能,其還是一個(gè)開源框架,提供了很多分詞之上的算法,如關(guān)鍵詞提取、詞性標(biāo)注等。
jieba分詞是基于規(guī)則和統(tǒng)計(jì)的混合分詞方法。對(duì)于未登陸詞,jieba使用了基于漢字成詞的HMM模型,采用viterbi算法進(jìn)行推到。
一、jieba用到的算法:
jieba自帶了一個(gè)叫做dict.txt的詞典, 里面有2萬(wàn)多條詞, 包含了詞條出現(xiàn)的次數(shù)(這個(gè)次數(shù)是于作者自己基于人民日?qǐng)?bào)語(yǔ)料等資源訓(xùn)練得出來的)和詞性. 這個(gè)第一條的trie樹結(jié)構(gòu)的詞圖掃描, 說的就是把這2萬(wàn)多條詞語(yǔ), 放到一個(gè)trie樹中, 而trie樹是有名的前綴樹, 也就是說一個(gè)詞語(yǔ)的前面幾個(gè)字一樣, 就表示他們具有相同的前綴, 就可以使用trie樹來存儲(chǔ), 具有查找速度快的優(yōu)勢(shì)。
1、基于Trie樹結(jié)構(gòu)實(shí)現(xiàn)高效的詞圖掃描,生成句子中漢字所有可能成詞情況所構(gòu)成的有向無環(huán)圖(DAG)
1.1 根據(jù)dict.txt生成trie樹。字典在生成trie樹的同時(shí), 也把每個(gè)詞的出現(xiàn)次數(shù)轉(zhuǎn)換為了頻率;
1.2 對(duì)待分詞句子, 根據(jù)dict.txt生成的trie樹, 生成DAG, 實(shí)際上通俗的說, 就是對(duì)待分詞句子, 根據(jù)給定的詞典進(jìn)行查詞典操作, 生成幾種可能的句子切分。
2、采用了動(dòng)態(tài)規(guī)劃查找最大概率路徑, 找出基于詞頻的最大切分組合
3、對(duì)于未登錄詞,采用了基于漢字成詞能力的HMM模型,使用了Viterbi算法
3.1 未登錄詞:詞典 dict.txt 中沒有記錄的詞(注: 就算把dict.txt中所有的詞匯全部刪掉, jieba依然能夠分詞, 不過分出來的詞, 大部分的長(zhǎng)度為2.這個(gè)就是基于HMM來預(yù)測(cè)分詞了)
二、分詞總體思想:
輸入是:整篇文檔或者是多篇原始文檔。
算法:通過jieba接口,可以使用精確模式(默認(rèn))、全模式、搜索引擎模式進(jìn)行分詞,其jieba分詞的原理是基于規(guī)則和統(tǒng)計(jì)的混合分詞,因?yàn)槭墙涌?#xff0c;所以暫時(shí)先不用太究其原理。
輸出:相應(yīng)文檔分詞好的形式。此時(shí)也可以進(jìn)行高頻詞的提取,可以自定義提取方法。也可以使用自定義的停用詞詞典,然后基于jieba的接口進(jìn)行高頻詞的提取。
三、jieba的三種分詞方法:
- 精確模式:試圖將句子最精確的切開,適合文本分析
- 全模式:把句子中所有可以成詞的詞語(yǔ)掃描出來,速度非常快,但是不能解決歧義。
- 搜索引擎模式:在精確模式的基礎(chǔ)上,對(duì)長(zhǎng)詞再次切分,提高召回率,適合用于搜索引擎分詞。
運(yùn)行結(jié)果:
精確模式: 中文/分詞/是/文本處理/不可或缺/的/一步/! 默認(rèn)模式: 中文/分詞/是/文本處理/不可或缺/的/一步/! 搜索引擎模式: 中文/分詞/是/文本/本處/處理/文本處理/不可/或缺/不可或缺/的/一步/! 全模式: 中文/分詞/是/文本/文本處理/本處/處理/不可/不可或缺/或缺/的/一步//一般使用精確模式即可,但是在某些模糊匹配場(chǎng)景下,使用全模式或搜索引擎模式會(huì)更好。
四、jieba高頻詞提取
簡(jiǎn)單說高頻詞提取就是自然語(yǔ)言處理中的TF策略,但是會(huì)有標(biāo)點(diǎn)符號(hào)和停用詞的干擾。
這里的數(shù)據(jù)是搜狗實(shí)驗(yàn)室的新聞數(shù)據(jù),進(jìn)行高頻詞的提取。
#jieba分詞示例 def get_content(path):with open(path, 'r', encoding='gbk', errors='ignore') as f:content = ''for l in f:l = l.strip() # strip():只能刪除開頭或是結(jié)尾的字符,不能刪除中間部分的字符content += lreturn contentdef get_TF(words, topK=10):tf_dic = {}for w in words:tf_dic[w] = tf_dic.get(w, 0) + 1return sorted(tf_dic.items(), key = lambda x: x[1], reverse=True)[:topK]def stop_words(path):with open(path,encoding='utf-8', errors='ignore') as f:return [l.strip() for l in f]#分詞 def main():import globimport randomimport jieba# glob得到所有的該目錄下的所有文件的存儲(chǔ)路徑files = glob.glob(r'C:/Users/LiLong/Desktop/learning-nlp-master/chapter-3/data/news/C000013/*.txt')print('files:',files[:2])# 針對(duì)每一個(gè)文本提取其內(nèi)容組成一個(gè)列表corpus = [get_content(x) for x in files[:5]]print(len(corpus))sample_inx = random.randint(0, len(corpus))split_words = [x for x in jieba.cut(corpus[sample_inx])]split_words2 = [x for x in jieba.cut(corpus[sample_inx]) \if x not in stop_words('./stop_words.utf8')]print('樣本分詞效果:'+'/ '.join(split_words))print('樣本的topK(10)詞:'+str(get_TF(split_words)))print('過濾掉停用詞后的top(10)詞:'+str(get_TF(split_words2))) main()運(yùn)行結(jié)果:
樣本分詞效果:先天性/ 心臟病/ “/ 幾歲/ 可/ 根治/ ,/ 十幾歲/ 變/ 難治/ ,/ 幾十歲/ 成不治/ ”/ ,/ 中國(guó)/ 著名/ 心血管/ 學(xué)術(shù)/ 領(lǐng)袖/ 胡大一/ 今天/ 在/ 此間/ 表示/ 救治/ 心臟病/ 應(yīng)從/ 兒童/ 抓起/ ,/ 他/ 呼吁/ 社會(huì)各界/ 關(guān)心/ 貧困地區(qū)/ 的/ 先天性/ 心臟病/ 兒童/ 。/ 據(jù)/ 了解/ ,/ 今年/ 五月/ 一日/ 到/ 五月/ 三日/ ,/ 胡大一/ 及其/ “/ 愛心/ 工程/ ”/ 專家組/ 將/ 聯(lián)合/ 北京軍區(qū)總醫(yī)院/ 在/ 安徽/ 太和縣/ 舉辦/ 第三屆/ 先心病/ 義診/ 活動(dòng)/ 。/ 安徽/ 太和縣/ 是/ 國(guó)家/ 重點(diǎn)/ 貧困縣/ ,/ 同時(shí)/ 又/ 是/ 先天性/ 心臟病/ 的/ 高發(fā)區(qū)/ 。/ 由于/ 受/ 貧苦/ 地區(qū)/ 醫(yī)療/ 技術(shù)/ 條件/ 限制/ ,/ 當(dāng)?shù)? 很多/ 孩子/ 由于/ 就醫(yī)/ 太晚/ 而/ 失去/ 了/ 治療/ 時(shí)機(jī)/ ,/ 當(dāng)?shù)? 群眾/ 也/ 因此/ 陷入/ “/ 生病/ —/ 貧困/ —/ 無力/ 醫(yī)治/ —/ 病情/ 加重/ —/ 更加/ 貧困/ ”/ 的/ 惡性循環(huán)/ 中/ 。/ 胡大一/ 表示/ ,/ 由于/ 中國(guó)/ 經(jīng)濟(jì)/ 發(fā)展/ 的/ 不/ 平衡/ 與/ 醫(yī)療/ 水平/ 的/ 嚴(yán)重/ 差異化/ ,/ 目前/ 中國(guó)/ 有/ 這種/ 情況/ 的/ 絕/ 不止/ 一個(gè)/ 太和縣/ 。/ 但/ 按照/ 現(xiàn)行/ 醫(yī)療/ 體制/ ,/ 目前/ 醫(yī)院/ 、/ 醫(yī)生/ 為/ 社會(huì)/ 提供/ 的/ 服務(wù)/ 模式/ 和/ 力度/ 都/ 遠(yuǎn)遠(yuǎn)/ 不能/ 適應(yīng)/ 社會(huì)/ 需求/ 。/ 他/ 希望/ ,/ 發(fā)達(dá)/ 地區(qū)/ 的/ 醫(yī)院/ 、/ 醫(yī)生/ 能/ 積極/ 走/ 出來/ ,/ 到/ 患者/ 需要/ 的/ 地方/ 去/ 。/ 據(jù)悉/ ,/ 胡大一/ 于/ 二/ 00/ 二/ 發(fā)起/ 了/ 面向全國(guó)/ 先天性/ 心臟病/ 兒童/ 的/ “/ 胡大一/ 愛心/ 工程/ ”/ ,/ 旨在/ 呼吁/ 社會(huì)/ 對(duì)于/ 先心病/ 兒童/ 的/ 關(guān)注/ ,/ 同時(shí)/ 通過/ 組織/ 大城市/ 專家/ 走進(jìn)/ 貧困地區(qū)/ 開展/ 義診/ 活動(dòng)/ ,/ 對(duì)/ 貧困地區(qū)/ 貧困家庭/ 優(yōu)先/ 實(shí)施/ 免費(fèi)/ 手術(shù)/ ,/ 并/ 對(duì)/ 其他/ 先心病/ 兒童/ 給予/ 適當(dāng)/ 資助/ 。/ / (/ 鐘嘯靈/ )/ 專家/ 簡(jiǎn)介/ :/ 胡大一/ 、/ 男/ 、/ 1946/ 年/ 7/ 月/ 生于/ 河南/ 開封/ ,/ 主任醫(yī)師/ 、/ 教授/ 、/ 博士生/ 導(dǎo)師/ ,/ 國(guó)家/ 突出貢獻(xiàn)/ 專家/ 、/ 享受/ 政府/ 專家/ 津貼/ 。/ 現(xiàn)任/ 同濟(jì)大學(xué)/ 醫(yī)學(xué)院/ 院長(zhǎng)/ 、/ 首都醫(yī)科大學(xué)/ 心臟病學(xué)/ 系主任/ 、/ 北京大學(xué)人民醫(yī)院/ 心研/ 所/ 所長(zhǎng)/ 、/ 心內(nèi)科/ 主任/ ,/ 首都醫(yī)科大學(xué)/ 心血管/ 疾病/ 研究所/ 所長(zhǎng)/ ,/ 首都醫(yī)科大學(xué)/ 北京同仁醫(yī)院/ 心血管/ 疾病/ 診療/ 中心/ 主任/ 。/ 任/ 中華醫(yī)學(xué)會(huì)/ 心血管病/ 分會(huì)/ 副/ 主任委員/ 、/ 中華醫(yī)學(xué)會(huì)/ 北京/ 心血管病/ 分會(huì)/ 主任委員/ 、/ 中國(guó)/ 生物醫(yī)學(xué)/ 工程/ 學(xué)會(huì)/ 心臟/ 起搏/ 與/ 電/ 生理/ 分會(huì)/ 主任委員/ 、/ 中國(guó)/ 醫(yī)師/ 學(xué)會(huì)/ 循證/ 醫(yī)學(xué)專業(yè)/ 委員會(huì)/ 主任委員/ 、/ 北京市/ 健康/ 協(xié)會(huì)/ 理事長(zhǎng)/ 、/ 北京/ 醫(yī)師/ 協(xié)會(huì)/ 副會(huì)長(zhǎng)/ 及/ 美國(guó)/ 心臟病/ 學(xué)院/ 會(huì)員/ 。/ (/ 來源/ :/ 北大人民醫(yī)院/ 網(wǎng)站/ ) 樣本的topK(10)詞:[(',', 23), ('、', 15), ('的', 11), ('。', 11), ('心臟病', 6), ('胡大一', 6), ('中國(guó)', 5), ('兒童', 5), ('先天性', 4), ('“', 4)] 過濾掉停用詞后的top(10)詞:[('心臟病', 6), ('胡大一', 6), ('中國(guó)', 5), ('兒童', 5), ('先天性', 4), ('專家', 4), ('主任委員', 4), ('心血管', 3), ('貧困地區(qū)', 3), ('工程', 3)]可以看到在加入了停用詞典后得到的高頻詞更有意義。
實(shí)際上中文分詞器在分詞效果上的差距并不是很大,但是在特定場(chǎng)景下表現(xiàn)差異很大,所以定義自己的領(lǐng)域詞典就顯得很重要,不斷地更新維護(hù)停用詞典。
其中jieba分詞支持自定義詞典:
通過:jieba.load_userdict('./data/user_dict.utf8')
形式如下:
大波浪 10 n
分詞 5 v
金融詞典 7 n
每一行三個(gè)部分分別為:詞語(yǔ)、詞頻、詞性。該詞典文件需要為utf-8編碼。
在提取高頻詞時(shí),通過合適的自定義詞典加載,能夠獲得很好的分詞效果。
其中的詞頻和詞性可以省略,但是如果省略了詞性,在jieba進(jìn)行詞性標(biāo)注時(shí),最終的切分詞的詞性將變成“x”,所以最好自定義詞典時(shí)詞頻和詞性都要有。
參考:《pytho自然語(yǔ)言處理實(shí)戰(zhàn) 核心技術(shù)與算法》
https://www.cnblogs.com/echo-cheng/p/7967221.html
總結(jié)
- 上一篇: 顺丰速运从沈阳市到重庆市要多少时间?
- 下一篇: 墙布无纺底的好还是涂层底好?