「結巴」中文分詞:作最好的 Python 中文分詞組件,分詞模塊jieba,它是python比較好用的分詞模塊, 支持中文簡體,繁體分詞,還支持自定義詞庫。
jieba的分詞,提取關鍵詞,自定義詞語。
結巴分詞的原理
原文連接:http://blog.csdn.net/HHTNAN/article/details/78722754html
#coding=utf-8 import jieba,math import jieba.analyse ''' jieba.cut主要有三種模式 #隨便對一個動物園的評論進行分析 str_text="真是很久很久沒來哈皮娜拉野生動物園了,記憶裏仍是小時候三四年級學校組織春遊去的銀河系" #全模式cut_all=True str_quan1=jieba.cut(str_text,cut_all=True) print('全模式分詞:{ %d}' % len(list(str_quan1))) str_quan2=jieba.cut(str_text,cut_all=True) print("/".join(str_quan2)) # print(str(str_1)) #爲一個generator 用for循環能夠獲得分詞的結果 # str_1_len=len(list(str_1)) #爲何?這裏執行後後面.join 就不執行,求告知 #精準模式cut_all=False,默認便是 str_jing1=jieba.cut(str_text,cut_all=False) print('精準模式分詞:{ %d}' % len(list(str_jing1))) str_jing2=jieba.cut(str_text,cut_all=False) print("/".join(str_jing2)) #搜索引擎模式 cut_for_search str_soso1=jieba.cut_for_search(str_text) print('搜索引擎分詞:{ %d}' % len(list(str_soso1))) str_soso2=jieba.cut_for_search(str_text) print("/".join(str_soso))
結果
全模式分詞:{ 32}
Prefix dict has been built succesfully.
真是/TMD/很久/很久很久/很久/很久沒/沒來/哈/皮/娜拉/野生/野生動物/生動/動物/動物園/了///記憶/記憶裏/仍是/小時/小時候/時候/學校/組織/春遊/游去/的/銀河/銀河系/河系
精準模式分詞:{ 19}
真是/TMD/很久很久/沒來/哈皮/娜拉/野生/動物園/了/,/記憶裏/仍是/小時候/學校/組織/春遊/去/的/銀河系
搜索引擎分詞:{ 27}
真是/TMD/很久/很久/很久很久/沒來/哈皮/娜拉/野生/動物/動物園/了/,/記憶/記憶裏/仍是/小時/時候/小時候/學校/組織/春遊/去/的/銀河/河系/銀河系、python
import jieba.analyse ’analyse.extract.tags‘ ''' keywords1=jieba.analyse.extract_tags(str_text) print('關鍵詞提取'+"/".join(keywords1)) keywords_top=jieba.analyse.extract_tags(str_text,topK=3) print('關鍵詞topk'+"/".join(keywords_to#有時不肯定提取多少關鍵詞,可利用總詞的百分比 print('總詞數{}'.format(len(list(jieba.cut(str_text))))) total=len(list(jieba.cut(str_text))) get_cnt=math.ceil(total*0.1) #向上取整 print('從%d 中取出%d 個詞'% (total,get_cnt)) keywords_top1=jieba.analyse.extract_tags(str_text,topK=get_cnt) print('關鍵詞topk'+"/".join(keywords_top1))''
結果:
**關鍵詞提取**TMD/哈皮/春遊/很久很久/記憶裏/娜拉/銀河系/沒來/動物園/小時候/野生/學校/真是/組織/仍是
**關鍵詞topk**TMD/哈皮/春遊
總詞數19
從19 中取出2 個詞topkTMD/哈皮、git
================# 處理時,jieba.add_word
# add_word(word,freq=None,tag=None) 和del_word可在程序中動態修改詞典 # suggest_freq(segment,tune=Ture)可調節單詞詞頻,時期能或不能顯示 # 注:自動計算的詞頻在使用HMM新詞發現功能時可能無效 # ''' # str_jing2=jieba.cut(str_text,cut_all=False) # print('add_word前:'+"/".join(str_jing2)) # #添加自定義詞 # jieba.add_word('哈皮娜拉') # str_jing3=jieba.cut(str_text,cut_all=False) # print('add_word後:'+"/".join(str_jing3)) # #修正詞頻 # jieba.suggest_freq('野生動物園',tune=True) # str_jing4=jieba.cut(str_text,cut_all=False) # print('suggest_freq後:'+"/".join(str_jing4))
結果:
add_word前:真是/TMD/很久很久/沒來/哈皮/娜拉/野生/動物園/了/,/記憶裏/仍是/小時候/學校/組織/春遊/去/的/銀河系
add_word後:真是/TMD/很久很久/沒/來/哈皮娜拉/野生/動物園/了/,/記憶裏/仍是/小時候/學校/組織/春遊/去/的/銀河系
suggest_freq後:真是/TMD/很久很久/沒/來/哈皮娜拉/野生動物園/了/,/記憶裏/仍是/小時候/學校/組織/春遊/去/的/銀河系github
jieba.load_userdict(filename)#filename爲文件路徑 詞典格式和dict.txt同樣,一詞一行,每行分三個部分(用空格隔開),詞語 詞頻(可省) 詞性(可省) 順序不可顛倒,若filename爲路徑或二進制方式打開,則需爲UTF-8 ''' #定義:三四年級 在文件內 jieba.load_userdict('C:\\Users\\lenovo\\Desktop\\自定義詞庫.txt') str_load=jieba.cut(str_text,cut_all=False) print('load_userdict後:'+"/".join(str_load)) ''' 注jieba.load_userdict加載自定義詞庫和jieba初始化詞庫一同使用, 可是,默認的初始詞庫放在安裝目錄ixia,若是肯定長期加載詞庫,就替換他 使用詞庫的切換功能set_dictionary() 可將jieba默認詞庫copy到本身的目錄下,在添加,或者找到更全的詞庫 ''' #通常在python都爲site-packages\jieba\dict.txt #模擬演示 jieba.set_dictionary('filename') #以後進行分詞,若是咱們切換了詞庫,此時程序就會初始化 咱們制定的詞庫,而不加載默認路徑詞庫
使用:算法
-安裝或者將jieba目錄放在當前目錄或者site-packages目錄
算法:markdown
-基於前綴詞典實現高效的詞圖掃描,生成句子中漢字全部可能成詞狀況所構成的有向無環圖(DAG)
-採用動態規劃查找最大機率路徑,找出基於詞頻的最大切分組合
-對於未登陸詞,採用了基於漢字成詞能力的HMM模型,使用了Viterbi算法
添加自定義詞典:網絡
-開發者能夠指定本身自定義的詞典,以便包含jieba詞庫裏沒有的詞。雖然jieba有新詞識別能力,可是自行添加新詞能夠保證更高的正確率
-用法:jieba.load_userdict(file_name)#file_name爲文件類對象 或自定義詞典的路徑
-詞典格式:一個詞一行:詞語,詞頻(可省略),詞性(可省略),用空格隔開,順序不可顛倒。UTF-8編碼。
關鍵詞提取:app
-基於TF-IDF算法的關鍵詞抽取
import jieba.analysepython2.7
jieba.analyse.extract_tags(sentence, topK=20, withWeight=False, allowPOS=()) –sentence 爲待提取的文本 –topK 爲返回幾個 TF/IDF 權重最大的關鍵詞,默認值爲 20 –withWeight 爲是否一併返回關鍵詞權重值,默認值爲 False –allowPOS 僅包括指定詞性的詞,默認值爲空,即不篩選 jieba.analyse.TFIDF(idf_path=None) 新建 TFIDF 實例,idf_path 爲 IDF 頻率文件
關鍵詞提取所使用逆向文件頻率(IDF)文本語料庫能夠切換成自定義語料庫的路徑函數
用法:jieba.analyse.set_idf_path(file_name) # file_name爲自定義語料庫的路徑
關鍵詞提取所使用中止詞(Stop Words)文本語料庫能夠切換成自定義語料庫的路徑
用法: jieba.analyse.set_stop_words(file_name) # file_name爲自定義語料庫的路徑
-基於TextRank算法的關鍵詞提取
jieba.analyse.textrank(sentence, topK=20, withWeight=False, allowPOS=(‘ns’, ‘n’, ‘vn’, ‘v’)) 直接使用,接口相同,注意默認過濾詞性。 jieba.analyse.TextRank() 新建自定義 TextRank 實例 –基本思想: 1,將待抽取關鍵詞的文本進行分詞 2,以固定窗口大小(默認爲5,經過span屬性調整),詞之間的共現關係,構建圖 3,計算圖中節點的PageRank,注意是無向帶權圖
對於itemgetter()用法參照鏈接
2、 第二部分(程序是在python2.7下跑得)
##Part 1. 詞頻統計、降序排序
article = open("C:\\Users\\Luo Chen\\Desktop\\demo_long.txt", "r").read() words = jieba.cut(article, cut_all = False) word_freq = {} for word in words: if word in word_freq: word_freq[word] += 1 else: word_freq[word] = 1 freq_word = [] for word, freq in word_freq.items(): freq_word.append((word, freq)) freq_word.sort(key = lambda x: x[1], reverse = True) max_number = int(raw_input(u"須要前多少位高頻詞? ")) for word, freq in freq_word[: max_number]: print word, freq
標點符號、虛詞、連詞不在統計範圍內。
stopwords = []
for word in open("C:\\Users\\Luo Chen\\Desktop\\stop_words.txt", "r"): stopwords.append(word.strip()) article = open("C:\\Users\\Luo Chen\\Desktop\\demo_long.txt", "r").read() words = jieba.cut(article, cut_all = False) stayed_line = "" for word in words: if word.encode("utf-8") not in stopwords: stayed_line += word + " " print stayed_line
將同義詞列舉出來,按下Tab鍵分隔,把第一個詞做爲須要顯示的詞語,後面的詞語做爲要替代的同義詞,一系列同義詞放在一行。
這裏,「北京」、「首都」、「京城」、「北平城」、「故都」爲同義詞。
combine_dict = {}
for line in open("C:\\Users\\Luo Chen\\Desktop\\tongyici.txt", "r"): seperate_word = line.strip().split("\t") num = len(seperate_word) for i in range(1, num): combine_dict[seperate_word[i]] = seperate_word[0] jieba.suggest_freq("北平城", tune = True) seg_list = jieba.cut("北京是中國的首都,京城的景色很是優美,就像當年的北平城,我愛這故都的一草一木。", cut_all = False) f = ",".join(seg_list) result = open("C:\\Users\\Luo Chen\\Desktop\\output.txt", "w") result.write(f.encode("utf-8")) result.close() for line in open("C:\\Users\\Luo Chen\\Desktop\\output.txt", "r"): line_1 = line.split(",") final_sentence = "" for word in line_1: if word in combine_dict: word = combine_dict[word] final_sentence += word else: final_sentence += word print final_sentence
##Part 4. 詞語說起率
主要步驟:分詞——過濾停用詞(略)——替代同義詞——計算詞語在文本中出現的機率。
origin = open("C:\\Users\\Luo Chen\\Desktop\\tijilv.txt", "r").read() jieba.suggest_freq("晨媽媽", tune = True) jieba.suggest_freq("大黑牛", tune = True) jieba.suggest_freq("能力者", tune = True) seg_list = jieba.cut(origin, cut_all = False) f = ",".join(seg_list) output_1 = open("C:\\Users\\Luo Chen\\Desktop\\output_1.txt", "w") output_1.write(f.encode("utf-8")) output_1.close() combine_dict = {} for w in open("C:\\Users\\Luo Chen\\Desktop\\tongyici.txt", "r"): w_1 = w.strip().split("\t") num = len(w_1) for i in range(0, num): combine_dict[w_1[i]] = w_1[0] seg_list_2 = "" for i in open("C:\\Users\\Luo Chen\\Desktop\\output_1.txt", "r"): i_1 = i.split(",") for word in i_1: if word in combine_dict: word = combine_dict[word] seg_list_2 += word else: seg_list_2 += word print seg_list_2
freq_word = {}
seg_list_3 = jieba.cut(seg_list_2, cut_all = False)
for word in seg_list_3: if word in freq_word: freq_word[word] += 1 else: freq_word[word] = 1 freq_word_1 = [] for word, freq in freq_word.items(): freq_word_1.append((word, freq)) freq_word_1.sort(key = lambda x: x[1], reverse = True) for word, freq in freq_word_1: print word, freq total_freq = 0 for i in freq_word_1: total_freq += i[1] for word, freq in freq_word.items(): freq = float(freq) / float(total_freq) print word, freq
import jieba.posseg as pseg word = pseg.cut("李晨好帥,又能力超強,是「大黑牛」,也是一個能力者,仍是隊裏貼心的晨媽媽。") for w in word: if w.flag in ["n", "v", "x"]: print w.word, w.flag
如下內容來源於網絡收集
3. 關鍵詞提取
基於 TF-IDF 算法的關鍵詞抽取
import jieba.analyse
jieba.analyse.extract_tags(sentence, topK=20, withWeight=False, allowPOS=()) sentence 爲待提取的文本 topK 爲返回幾個 TF/IDF 權重最大的關鍵詞,默認值爲 20 withWeight 爲是否一併返回關鍵詞權重值,默認值爲 False allowPOS 僅包括指定詞性的詞,默認值爲空,即不篩選 分詞詞性可參見博客:[詞性參考](http://blog.csdn.net/HHTNAN/article/details/77650128) jieba.analyse.TFIDF(idf_path=None) 新建 TFIDF 實例,idf_path 爲 IDF 頻率文件
代碼示例 (關鍵詞提取)
https://github.com/fxsjy/jieba/blob/master/test/extract_tags.py
關鍵詞提取所使用逆向文件頻率(IDF)文本語料庫能夠切換成自定義語料庫的路徑
用法: jieba.analyse.set_idf_path(file_name) # file_name爲自定義語料庫的路徑 自定義語料庫示例:https://github.com/fxsjy/jieba/blob/master/extra_dict/idf.txt.big 用法示例:https://github.com/fxsjy/jieba/blob/master/test/extract_tags_idfpath.py
關鍵詞提取所使用中止詞(Stop Words)文本語料庫能夠切換成自定義語料庫的路徑
用法: jieba.analyse.set_stop_words(file_name) # file_name爲自定義語料庫的路徑 自定義語料庫示例:https://github.com/fxsjy/jieba/blob/master/extra_dict/stop_words.txt 用法示例:https://github.com/fxsjy/jieba/blob/master/test/extract_tags_stop_words.py
關鍵詞一併返回關鍵詞權重值示例
用法示例:https://github.com/fxsjy/jieba/blob/master/test/extract_tags_with_weight.py
基於 TextRank 算法的關鍵詞抽取
jieba.analyse.textrank(sentence, topK=20, withWeight=False, allowPOS=('ns', 'n', 'vn', 'v')) 直接使用,接口相同,注意默認過濾詞性。 jieba.analyse.TextRank() 新建自定義 TextRank 實例
算法論文: TextRank: Bringing Order into Texts
基本思想:
將待抽取關鍵詞的文本進行分詞 以固定窗口大小(默認爲5,經過span屬性調整),詞之間的共現關係,構建圖 計算圖中節點的PageRank,注意是無向帶權圖
使用示例:
見 test/demo.py
4. 詞性標註
jieba.posseg.POSTokenizer(tokenizer=None) 新建自定義分詞器,tokenizer 參數可指定內部使用的 jieba.Tokenizer 分詞器。jieba.posseg.dt 爲默認詞性標註分詞器。 標註句子分詞後每一個詞的詞性,採用和 ictclas 兼容的標記法。 用法示例
import jieba.posseg as pseg
words = pseg.cut(「我愛北京天安門」)
for word, flag in words:
… print(‘%s %s’ % (word, flag))
…
我 r
愛 v
北京 ns
天安門 ns
並行分詞
原理:將目標文本按行分隔後,把各行文本分配到多個 Python 進程並行分詞,而後歸併結果,從而得到分詞速度的可觀提高
基於 python 自帶的 multiprocessing 模塊,目前暫不支持 Windows
用法:
jieba.enable_parallel(4) # 開啓並行分詞模式,參數爲並行進程數
jieba.disable_parallel() # 關閉並行分詞模式
例子:https://github.com/fxsjy/jieba/blob/master/test/parallel/test_file.py
實驗結果:在 4 核 3.4GHz Linux 機器上,對金庸全集進行精確分詞,得到了 1MB/s 的速度,是單進程版的 3.3 倍。
注意:並行分詞僅支持默認分詞器 jieba.dt 和 jieba.posseg.dt。
Tokenize:返回詞語在原文的起止位置
注意,輸入參數只接受 unicode
默認模式
result = jieba.tokenize(u’永和服裝飾品有限公司’)
for tk in result:
print(「word %s\t\t start: %d \t\t end:%d」 % (tk[0],tk[1],tk[2]))
word 永和 start: 0 end:2
word 服裝 start: 2 end:4
word 飾品 start: 4 end:6
word 有限公司 start: 6 end:10
搜索模式
result = jieba.tokenize(u’永和服裝飾品有限公司’, mode=’search’)
for tk in result:
print(「word %s\t\t start: %d \t\t end:%d」 % (tk[0],tk[1],tk[2]))
word 永和 start: 0 end:2
word 服裝 start: 2 end:4
word 飾品 start: 4 end:6
word 有限 start: 6 end:8
word 公司 start: 8 end:10
word 有限公司 start: 6 end:10
ChineseAnalyzer for Whoosh 搜索引擎
引用: from jieba.analyse import ChineseAnalyzer
用法示例:https://github.com/fxsjy/jieba/blob/master/test/test_whoosh.py
命令行分詞
使用示例:python -m jieba news.txt > cut_result.txt
命令行選項(翻譯):
使用: python -m jieba [options] filename
結巴命令行界面。
固定參數:
filename 輸入文件
可選參數:
-h, –help 顯示此幫助信息並退出
-d [DELIM], –delimiter [DELIM]
使用 DELIM 分隔詞語,而不是用默認的’ / ‘。
若不指定 DELIM,則使用一個空格分隔。
-p [DELIM], –pos [DELIM]
啓用詞性標註;若是指定 DELIM,詞語和詞性之間
用它分隔,不然用 _ 分隔
-D DICT, –dict DICT 使用 DICT 代替默認詞典
-u USER_DICT, –user-dict USER_DICT
使用 USER_DICT 做爲附加詞典,與默認詞典或自定義詞典配合使用
-a, –cut-all 全模式分詞(不支持詞性標註)
-n, –no-hmm 不使用隱含馬爾可夫模型
-q, –quiet 不輸出載入信息到 STDERR
-V, –version 顯示版本信息並退出
若是沒有指定文件名,則使用標準輸入。
–help 選項輸出:
$> python -m jieba –help
Jieba command line interface.
positional arguments:
filename input file
optional arguments:
-h, –help show this help message and exit
-d [DELIM], –delimiter [DELIM]
use DELIM instead of ’ / ’ for word delimiter; or a
space if it is used without DELIM
-p [DELIM], –pos [DELIM]
enable POS tagging; if DELIM is specified, use DELIM
instead of ‘_’ for POS delimiter
-D DICT, –dict DICT use DICT as dictionary
-u USER_DICT, –user-dict USER_DICT
use USER_DICT together with the default dictionary or
DICT (if specified)
-a, –cut-all full pattern cutting (ignored with POS tagging)
-n, –no-hmm don’t use the Hidden Markov Model
-q, –quiet don’t print loading messages to stderr
-V, –version show program’s version number and exit
If no filename specified, use STDIN instead.
延遲加載機制
jieba 採用延遲加載,import jieba 和 jieba.Tokenizer() 不會當即觸發詞典的加載,一旦有必要纔開始加載詞典構建前綴字典。若是你想手工初始 jieba,也能夠手動初始化。
import jieba
jieba.initialize() # 手動初始化(可選)
在 0.28 以前的版本是不能指定主詞典的路徑的,有了延遲加載機制後,你能夠改變主詞典的路徑:
jieba.set_dictionary(‘data/dict.txt.big’)
例子: https://github.com/fxsjy/jieba/blob/master/test/test_change_dictpath.py
參考文獻:http://blog.csdn.net/xiaoxiangzi222/article/details/53483931