python結巴(jieba)分詞
一、特點
1、支持三種分詞模式:
(1)精確模式:試圖將句子最精確的切開,適合文本分析。
(2)全模式:把句子中所有可以成詞的詞語都掃描出來,速度非常快,但是不能解決歧義。
(3)搜索引擎模式:在精確模式的基礎上,對長詞再次切分,提高召回率,適合用於搜索引擎分詞。
2、支持繁體分詞
3、支持自定義詞典
二、實現
結巴分詞的實現原理主要有一下三點:
(1)基於Trie樹結構實現高效的詞圖掃描,生成句子中漢字所有可能成詞情況所構成的有向無環圖(DAG)。
(2)采用了動態規划查找最大概率路徑, 找出基於詞頻的最大切分組合。
(3)對於未登錄詞,采用了基於漢字成詞能力的HMM模型,使用了Viterbi算法。
三、應用
我們來演示一下結巴分詞的主要功能
1、分詞
1 #-*- coding:utf-8 -*- 2 3 4 import jieba 5 6 7 8 ''' 9 cut方法有兩個參數 10 1)第一個參數是我們想分詞的字符串 11 2)第二個參數cut_all是用來控制是否采用全模式 12 ''' 13 14 #全模式 15 word_list = jieba.cut("今天天氣真好。親愛的,我們去遠足吧!",cut_all=True) 16 print "全模式:","|".join(word_list) 17 #精確模式 , 默認就是精確模式 18 word_list = jieba.cut("今天天氣真好。親愛的,我們去遠足吧!",cut_all=False) 19 print "精確模式:","|".join(word_list) 20 #搜索引擎模式 21 word_list = jieba.cut_for_search("今天天氣真好。親愛的,我們去遠足吧!") 22 print "搜索引擎:","|".join(word_list)
2、添加自定義詞典
雖然jieba有新詞識別能力,但是自己添加新詞可以保證更高的正確率。
開發者可以根據自己的需要添加自定義詞典,以便包含jieba詞庫里沒有的詞。
例:小紅今天我們還去以前經常去的地方遠足嗎?要不咱們換個地方吧!園小園怎么樣?沒問題小豆芽
自定義詞典(cu.txt):
園小園 5
小豆芽 3 nr
一個詞占一行;每一行分三部分,一部分為詞語,另一部分為詞頻,最后為詞性(可省略),中間用空格隔開。
1 #-*- coding:utf-8 -*- 2 import jieba 3 4 jieba.load_userdict("./cu.txt") 5 word_list = jieba.cut("今天去遠足嗎?要不咱們換個地方吧!園小園怎么樣?沒問題小豆芽") 6 print "|".join(word_list)
3、關鍵詞提取
1)第一個參數(setence)為待提取的文本。
2)topK為返回幾個TF/IDF權重最大的關鍵詞,默認值為20,可以自己指定。
1 #-*- coding:utf-8 -*- 2 import jieba.analyse as al 3 4 content = open("./topk.txt","rb").read() 5 word_topk = al.extract_tags(content,topK=4) 6 print "|".join(word_topk)
4、詞性標注
標注句子分詞后每個詞的詞性,采用和ictclas兼容的標記法。
1 #-*- coding:utf-8 -*- 2 import jieba.posseg as pseg 3 4 words = pseg.cut("青島北京是不錯的地方") 5 for word in words: 6 print word.word,word.flag
運行結果:
青島 ns
北京 ns
是 v
不錯 a
的 uj
地方 n
5、並行分詞(只能在linux系統上運行)
將要進行分詞的文本按行分隔,把各行文本分配到多個python進程中去,然后歸並結果,從而使分詞速度提升。
基於python的multiprocessing模塊,目前不支持windows系統。
#-*- coding:utf-8 -*- import jieba #開啟並行分詞模式,參數為參與並行分詞的進程數 jieba.enable_parallel(2) #關閉並行分詞 #jieba.disable_parallel() content = open("./topk.txt","rb") words = jieba.cut(content) print "|".join(words)
6、模塊初始化機制的改變:lazy load (從0.28版本開始)
下載你所需要的詞典,然后覆蓋jieba/dict.txt或者用jieba.set_dictionary("")將其覆蓋。
1 #-*- coding:utf-8 -*- 2 3 import jieba 4 jieba.set_dictionary("./dict.txt") 5 content = open("./content.txt","rb").read() 6 words = jieba.cut(content) 7 print "|".join(words)
7、Tokenize:返回詞語在原文的起始位置
1)第一個參數為文本內容。
2)第二個參數mode可以不用默認模式,指定為“search”搜索引擎模式。
1 #-*- coding:utf-8 -*- 2 import jieba 3 4 result = jieba.tokenize(u'今天天氣真好。親愛的,我們去遠足吧!') 5 for token in result: 6 print "word %s\t\t start: %d \t\t end:%d" % (token[0],token[1],token[2])