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