python jieba分詞(結巴分詞)、提取詞,加載詞,修改詞頻,定義詞庫 -轉載

轉載請註明出處 

「結巴」中文分詞:作最好的 Python 中文分詞組件,分詞模塊jieba,它是python比較好用的分詞模塊, 支持中文簡體,繁體分詞,還支持自定義詞庫。 
jieba的分詞,提取關鍵詞,自定義詞語。 
結巴分詞的原理 
原文連接:http://blog.csdn.net/HHTNAN/article/details/78722754html

一、jieba.cut分詞三種模式

  • jieba.cut 方法接受三個輸入參數: 須要分詞的字符串;cut_all 參數用來控制是否採用全模式;HMM 參數用來控制是否使用 
    HMM 模型 
    jieba.cut_for_search 方法接受兩個參數:須要分詞的字符串;是否使用 HMM 模型。該方法適合用於搜索引擎構建倒排索引的分詞,粒度比較細 
    待分詞的字符串能夠是 unicode 或 UTF-8 字符串、GBK 字符串。注意:不建議直接輸入 GBK 字符串,可能沒法預料地錯誤解碼成 UTF-8 
    jieba.cut 以及 jieba.cut_for_search 返回的結構都是一個可迭代的 generator,可使用 for 循環來得到分詞後獲得的每個詞語(unicode),或者用 
    jieba.lcut 以及 jieba.lcut_for_search 直接返回 list 
    jieba.Tokenizer(dictionary=DEFAULT_DICT) 新建自定義分詞器,可用於同時使用不一樣詞典。jieba.dt 爲默認分詞器,全部全局分詞相關函數都是該分詞器的映射。
#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

2關鍵詞提取、關鍵詞提取**

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

Part 2. 人工去停用詞

標點符號、虛詞、連詞不在統計範圍內。

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

Part 3. 合併同義詞

將同義詞列舉出來,按下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

Part 5. 按詞性提取

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

  1. 並行分詞

    原理:將目標文本按行分隔後,把各行文本分配到多個 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。

  2. 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

  1. ChineseAnalyzer for Whoosh 搜索引擎

    引用: from jieba.analyse import ChineseAnalyzer

    用法示例:https://github.com/fxsjy/jieba/blob/master/test/test_whoosh.py

  2. 命令行分詞

使用示例: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

相關文章
相關標籤/搜索