1. 程式人生 > >jieba分詞與詞性標註自定義詞典支援特殊字元

jieba分詞與詞性標註自定義詞典支援特殊字元

jieba分詞可以自定義詞表和詞庫。但是目前版本尚不支援特殊字元(如空格等)。

參考github上的網友們的解答,總結修改方法如下:

1、修改目錄(我的為windows系統,使用miniconda,路徑供參考,具體則需要根據自己實際情況進行修改):

檔案路徑 D:\ProgramData\Miniconda3\envs\python36\Lib\site-packages\jieba

2、修改內容

  • 修改jieba根目錄 包括init和詞表
  • 修改posseg目錄 包括init
  • 參考網站 https://github.com/fxsjy/jieba/issues/423
  • 示例與程式碼可參照我的github:https://github.com/q759729997/jieba_special_character
開啟預設詞典(根目錄)或自定義詞典,把所有用來間隔詞頻和詞性的空格間隔符改成@@
(選用@@是因為一般關鍵詞裡遇到這個分隔符的機率比較小吧)

繼續,開啟jieba根目錄下init.py

搜尋
re_han_default = re.compile("([\u4E00-\u9FD5a-zA-Z0-9+#&\._]+)", re.U)
改成
re_han_default = re.compile("(.+)", re.U)
搜尋
re_userdict = re.compile('^(.+?)( [0-9]+)?( [a-z]+)?$', re.U)
改成
re_userdict = re.compile('^(.+?)(\u0040\u0040[0-9]+)?(\u0040\u0040[a-z]+)?$', re.U)
搜尋
word, freq = line.split(' ')[:2]
改成
word, freq = line.split('\u0040\u0040')[:2]
補充:若用的全模式繼續改。
搜尋
re_han_cut_all = re.compile("([\u4E00-\u9FD5]+)", re.U)
改成
re_han_cut_all = re.compile("(.+)", re.U)

3、測試程式碼

import jieba
import jieba.posseg as pseg

jieba.add_word('奧迪Q7',tag='car_type')
jieba.add_word('A3 e-tron',tag='car_type')
jieba.add_word('奧迪R8',tag='car_type')

line = '奧迪Q7 e-tron是奧迪系列的車。A3 e-tron也是車。奧迪R8是另一個車。'
line_txt_list = []
words = pseg.cut(line)
for word, flag in words:
    line_txt_list.append('%s %s' % (word, flag))
print('|||'.join(line_txt_list))

4、測試結果

奧迪Q7 car_type|||  x|||e eng|||- x|||tron eng|||是 v|||奧迪 nz|||系列 q|||的 uj|||車 n|||。 x|||A3 e-tron car_type|||也 d|||是 v|||車 n|||。 x|||奧迪R8 car_type|||是 v|||另 r|||一個 m|||車 n|||。 x