結巴(jieba)中文分詞及其應用實踐


中文文本分類不像英文文本分類一樣只需要將單詞一個個分開就可以了,中文文本分類需要將文字組成的詞語分出來構成一個個向量。所以,需要分詞。
這里使用網上流行的開源分詞工具結巴分詞(jieba),它可以有效的將句子里的詞語一個個的提取出來,關於結巴分詞的原理此處不再贅述,關鍵是他的使用方法。
1、安裝
結巴分詞是一個Python的工具函數庫,在python環境下安裝,安裝方式如下:
(1)python2.x下
全自動安裝 :easy_install jieba 或者 pip install jieba
半自動安裝 :先下載http://pypi.python.org/pypi/jieba/ ,解壓后運行python setup.py install
手動安裝 :將jieba目錄放置於當前目錄或者site-packages目錄
通過import jieba 來引用
(2)python3.x下
目前master分支是只支持Python2.x 的
Python3.x 版本的分支也已經基本可用: https://github.com/fxsjy/jieba/tree/jieba3k

git clone https://github.com/fxsjy/jieba.git
git checkout jieba3k
python setup.py install

2、使用
在使用它的時候首先要用import jieba代碼導入jieba庫,而由於中文文本中可能除了文本內容以外還有一些符號比如括號、等號或箭頭等,還需要將這些通過正則表達式的方式匹配出來並刪除,
由於使用到了正則表達式,所以還需要使用import re來導入相關函數庫。
具體代碼如下:

def textParse(sentence):
    import jieba
    import re
    #以下兩行過濾出中文及字符串以外的其他符號
    r= re.compile("[\s+\.\!\/_,$%^*(+\"\']+|[+——!,。?、~@#¥%……&*()]+")
    sentence=r.sub('',sentence)
    seg_list = jieba.cut(sentence)
    #print ("Default Mode:", ' '.join(seg_list))
    return [tok for tok in seg_list]

textParse函數接收一個句子(sentence)做為參數,返回結果是一個由句子詞語構成的數組。
結巴分詞中最關鍵的函數為jieba.cut該函數將接收到的句子分割成一個個詞語並返回一個可供迭代的generator。代碼的最后一行將這個結構轉化為數組。

3、停用詞
停用詞是指一些中文中出現的語氣詞或連接詞,這些詞如果不進行踢出,會影響核心詞與分類的明確關系。比如“的”,“之”,“與”,“和”等,也可以視情況增加適合本分類場景的停用詞。中文停用詞表涵蓋了1598個停用詞。可以從github上獲取。
項目改進如下:
(1)在項目中新建停用詞表stopkey.txt
將所有中文停用詞進該文本文件中。
(2)中文分詞時加入過濾停用詞功能

4、自定義詞典
針對分類場景,自定義一些常用詞,當分詞的時候遇到這些詞就把他們作為單個詞處理。如增加數據庫中“多對多”到詞典中可以避免分詞的時候將上述詞語分為“多”“對”“多”。這些詞典的定義也與分類器應用場景有關。
項目改進如下:
(1)加入自定義詞典文件userdict.txt
(2)中文分詞中加入自定義詞典分詞功能

5、改進后的中文分詞函數
代碼如下(同時又增加了其它常見符號):

#中文分詞
def textParse(sentence):
    import jieba
    import re
    
    #以下兩行過濾出中文及字符串以外的其他符號
    r= re.compile("[\s+\.\!\/_\?【】\-(?:\))(?:\()(?:\[)(?:\])(\:):,$%^*(+\"\']+|[+——!,。?、~@#¥%……&*()]+")
    
    sentence=r.sub('',sentence)
    jieba.load_userdict("userdict.txt");#加載自定義詞典
    stoplist={}.fromkeys([line.strip() for line in open("stopkey.txt",'r',encoding= 'utf-8')])#停用詞文件是utf8編碼  
    seg_list = jieba.cut(sentence)
    seg_list=[word for word in list(seg_list) if word not in stoplist]
    #print ("Default Mode:", ' '.join(seg_list))
    return seg_list
來源:頂求網


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM