自然語言處理之jieba分詞
英文分詞可以使用空格,中文就不同了,一些分詞的原理后面再來說,先說下python中常用的jieba這個(gè)工具。
首先要注意自己在做練習(xí)時(shí)不要使用jieba.Py命名文件,否則會(huì)出現(xiàn)
jieba has no attribute named cut …等這些,如果刪除了自己創(chuàng)建的jieba.py還有錯(cuò)誤是因?yàn)闆]有刪除jieba.pyc文件。
(1)基本分詞函數(shù)和用法
首先介紹下分詞的三種模式:
精確模式:適合將句子最精確的分開,適合文本分析;
全模式:把句子中所有可以成詞的詞語都掃描出來,速度快,但是不能解決歧義;
搜索引擎模式:在精確模式的基礎(chǔ)上,對(duì)長詞再次進(jìn)行切分,提高召回率,適用于搜索引擎分詞;
jieba.cut 以及 jieba.cut_for_search 返回的結(jié)構(gòu)都是一個(gè)可迭代的 generator,可以使用 for 循環(huán)來獲得分詞后得到的每一個(gè)詞語
jieba.cut 方法接受三個(gè)輸入?yún)?shù):
- 需要分詞的字符串
- cut_all 參數(shù)用來控制是否采用全模式
- HMM 參數(shù)用來控制是否使用 HMM 模型
jieba.cut_for_search 方法接受兩個(gè)參數(shù)
- 需要分詞的字符串
- 是否使用 HMM 模型。
1 import jieba 2 seg_list = jieba.cut("我愛學(xué)習(xí)自然語言處理", cut_all=True) 3 print("Full Mode: " + "/ ".join(seg_list)) # 全模式 4 5 seg_list = jieba.cut("我愛自然語言處理", cut_all=False) 6 print("Default Mode: " + "/ ".join(seg_list)) # 精確模式 7 8 seg_list = jieba.cut("他畢業(yè)于上海交通大學(xué),在百度深度學(xué)習(xí)研究院進(jìn)行研究") # 默認(rèn)是精確模式 9 print(", ".join(seg_list)) 10 11 seg_list = jieba.cut_for_search("小明碩士畢業(yè)于中國科學(xué)院計(jì)算所,后在哈佛大學(xué)深造") # 搜索引擎模式 12 print(", ".join(seg_list))

jieba.lcut以及jieba.lcut_for_search直接返回 list
1 import jieba 2 result_lcut = jieba.lcut("小明碩士畢業(yè)于中國科學(xué)院計(jì)算所,后在哈佛大學(xué)深造") 3 result_lcut_for_search = jieba.lcut("小明碩士畢業(yè)于中國科學(xué)院計(jì)算所,后在哈佛大學(xué)深造",cut_all=True) 4 print ('result_lcut:',result_lcut) 5 print ('result_lcut_for_search:',result_lcut_for_search) 6 7 print (" ".join(result_lcut)) 8 print (" ".join(result_lcut_for_search))

添加用戶自定義字典:
很多時(shí)候我們需要針對(duì)自己的場(chǎng)景進(jìn)行分詞,會(huì)有一些領(lǐng)域內(nèi)的專有詞匯。
- 1.可以用jieba.load_userdict(file_name)加載用戶字典
- 2.少量的詞匯可以自己用下面方法手動(dòng)添加:
- 用 add_word(word, freq=None, tag=None) 和 del_word(word) 在程序中動(dòng)態(tài)修改詞典
- 用 suggest_freq(segment, tune=True) 可調(diào)節(jié)單個(gè)詞語的詞頻,使其能(或不能)被分出來。
1 import jieba 2 result_cut=jieba.cut('如果放到舊字典中將出錯(cuò)。', HMM=False) 3 print('/'.join(result_cut)) 4 jieba.suggest_freq(('中', '將'), True) 5 result_cut=jieba.cut('如果放到舊字典中將出錯(cuò)。', HMM=False) 6 print('/'.join(result_cut))

(2)關(guān)鍵詞提取
基于TF-IDF的關(guān)鍵詞抽取
import jieba.analyse
- jieba.analyse.extract_tags(sentence, topK=20, withWeight=False, allowPOS=())
- sentence 為待提取的文本
- topK 為返回幾個(gè) TF/IDF 權(quán)重最大的關(guān)鍵詞,默認(rèn)值為 20
- withWeight 為是否一并返回關(guān)鍵詞權(quán)重值,默認(rèn)值為 False
- allowPOS 僅包括指定詞性的詞,默認(rèn)值為空,即不篩選
1 import jieba.analyse as analyse 2 import codecs 3 4 lines_NBA = codecs.open('NBA.txt',encoding='utf-8').read() 5 print (" ".join(analyse.extract_tags(lines_NBA, topK=20, withWeight=False, allowPOS=())))

另:
關(guān)鍵詞提取所使用逆向文件頻率(IDF)文本語料庫可以切換成自定義語料庫的路徑:jieba.analyse.set_idf_path(file_name) # file_name為自定義語料庫的路徑
關(guān)鍵詞提取所使用停止詞(Stop Words)文本語料庫可以切換成自定義語料庫的路徑:jieba.analyse.set_stop_words(file_name) # file_name為自定義語料庫的路徑
基于TextRank的關(guān)鍵詞提取
1 import jieba.analyse as analyse 2 import codecs 3 4 lines_NBA = codecs.open('NBA.txt',encoding='utf-8').read() 5 print(" ".join(analyse.textrank(lines_NBA, topK=20, withWeight=False, allowPOS=('ns', 'n', 'vn','v'))))

(3)詞性標(biāo)注
jieba.posseg.POSTokenizer(tokenizer=None) 新建自定義分詞器,tokenizer 參數(shù)可指定內(nèi)部使用的 jieba.Tokenizer 分詞器。
jieba.posseg.dt 為默認(rèn)詞性標(biāo)注分詞器。
1 import jieba.posseg as pseg 2 words = pseg.cut("我愛自然語言處理") 3 for word, flag in words: 4 print('%s %s' % (word, flag))

(4)并行分詞
原理:將目標(biāo)文本按行分隔后,把各行文本分配到多個(gè) Python 進(jìn)程并行分詞,然后歸并結(jié)果,從而獲得分詞速度的可觀提升 基于 python 自帶的 multiprocessing 模塊,目前暫不支持 Windows
用法:
jieba.enable_parallel(4) # 開啟并行分詞模式,參數(shù)為并行進(jìn)程數(shù)
jieba.disable_parallel() # 關(guān)閉并行分詞模式
實(shí)驗(yàn)結(jié)果:在 4 核 3.4GHz Linux 機(jī)器上,對(duì)金庸全集進(jìn)行精確分詞,獲得了 1MB/s 的速度,是單進(jìn)程版的 3.3 倍。
注意:并行分詞僅支持默認(rèn)分詞器 jieba.dt 和 jieba.posseg.dt。
--------------------------------我是結(jié)束分割線 --------------------------------
注:本文參考寒小陽自然語言處理

浙公網(wǎng)安備 33010602011771號(hào)