英文分詞可以使用空格,中文就不同了,一些分詞的原理後面再來說,先說下python中常用的jieba這個工具。
首先要注意自己在做練習時不要使用jieba.Py命名檔案,否則會出現
jieba has no attribute named cut …等這些,如果刪除了自己建立的jieba.py還有錯誤是因為沒有刪除jieba.pyc檔案。
(1)基本分詞函式和用法
首先介紹下分詞的三種模式:
精確模式:適合將句子最精確的分開,適合文字分析;
全模式:把句子中所有可以成詞的詞語都掃描出來,速度快,但是不能解決歧義;
搜尋引擎模式:在精確模式的基礎上,對長詞再次進行切分,提高召回率,適用於搜尋引擎分詞;
jieba.cut 以及 jieba.cut_for_search 返回的結構都是一個可迭代的 generator,可以使用 for 迴圈來獲得分詞後得到的每一個詞語
jieba.cut 方法接受三個輸入引數:
- 需要分詞的字串
- cut_all 引數用來控制是否採用全模式
- HMM 引數用來控制是否使用 HMM 模型
jieba.cut_for_search 方法接受兩個引數
- 需要分詞的字串
- 是否使用 HMM 模型。
1 import jieba 2 seg_list = jieba.cut("我愛學習自然語言處理", 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("他畢業於上海交通大學,在百度深度學習研究院進行研究") # 預設是精確模式 9 print(", ".join(seg_list)) 10 11 seg_list = jieba.cut_for_search("小明碩士畢業於中國科學院計算所,後在哈佛大學深造") # 搜尋引擎模式 12 print(", ".join(seg_list))
jieba.lcut以及jieba.lcut_for_search直接返回 list
1 import jieba 2 result_lcut = jieba.lcut("小明碩士畢業於中國科學院計算所,後在哈佛大學深造") 3 result_lcut_for_search = jieba.lcut("小明碩士畢業於中國科學院計算所,後在哈佛大學深造",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))
新增使用者自定義字典:
很多時候我們需要針對自己的場景進行分詞,會有一些領域內的專有詞彙。
- 1.可以用jieba.load_userdict(file_name)載入使用者字典
- 2.少量的詞彙可以自己用下面方法手動新增:
- 用 add_word(word, freq=None, tag=None) 和 del_word(word) 在程式中動態修改詞典
- 用 suggest_freq(segment, tune=True) 可調節單個詞語的詞頻,使其能(或不能)被分出來。
1 import jieba 2 result_cut=jieba.cut('如果放到舊字典中將出錯。', HMM=False) 3 print('/'.join(result_cut)) 4 jieba.suggest_freq(('中', '將'), True) 5 result_cut=jieba.cut('如果放到舊字典中將出錯。', HMM=False) 6 print('/'.join(result_cut))
(2)關鍵詞提取
基於TF-IDF的關鍵詞抽取
import jieba.analyse
- jieba.analyse.extract_tags(sentence, topK=20, withWeight=False, allowPOS=())
- sentence 為待提取的文字
- topK 為返回幾個 TF/IDF 權重最大的關鍵詞,預設值為 20
- withWeight 為是否一併返回關鍵詞權重值,預設值為 False
- allowPOS 僅包括指定詞性的詞,預設值為空,即不篩選
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=())))
另:
關鍵詞提取所使用逆向檔案頻率(IDF)文字語料庫可以切換成自定義語料庫的路徑:jieba.analyse.set_idf_path(file_name) # file_name為自定義語料庫的路徑
關鍵詞提取所使用停止詞(Stop Words)文字語料庫可以切換成自定義語料庫的路徑:jieba.analyse.set_stop_words(file_name) # file_name為自定義語料庫的路徑
基於TextRank的關鍵詞提取
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)詞性標註
jieba.posseg.POSTokenizer(tokenizer=None) 新建自定義分詞器,tokenizer 引數可指定內部使用的 jieba.Tokenizer 分詞器。
jieba.posseg.dt 為預設詞性標註分詞器。
1 import jieba.posseg as pseg 2 words = pseg.cut("我愛自然語言處理") 3 for word, flag in words: 4 print('%s %s' % (word, flag))
(4)並行分詞
原理:將目標文字按行分隔後,把各行文字分配到多個 Python 程式並行分詞,然後歸併結果,從而獲得分詞速度的可觀提升 基於 python 自帶的 multiprocessing 模組,目前暫不支援 Windows
用法:
jieba.enable_parallel(4) # 開啟並行分詞模式,引數為並行程式數
jieba.disable_parallel() # 關閉並行分詞模式
實驗結果:在 4 核 3.4GHz Linux 機器上,對金庸全集進行精確分詞,獲得了 1MB/s 的速度,是單程式版的 3.3 倍。
注意:並行分詞僅支援預設分詞器 jieba.dt 和 jieba.posseg.dt。
--------------------------------我是結束分割線 --------------------------------
注:本文參考寒小陽自然語言處理