第3課:簡單好用的中文分詞利器 jieba 和 HanLP

前言

從本文開始,我們就要真正進入實戰(zhàn)部分。首先,我們按照中文自然語言處理流程的第一步獲取語料,然后重點進行中文分詞的學習。中文分詞有很多種,常見的比如有中科院計算所 NLPIR、哈工大 LTP、清華大學 THULAC 、斯坦福分詞器、Hanlp 分詞器、jieba 分詞、IKAnalyzer 等。這里針對 jieba 和 HanLP 分別介紹不同場景下的中文分詞應(yīng)用。

jieba 分詞

jieba 安裝

(1)Python 2.x 下 jieba 的三種安裝方式,如下:

  • 全自動安裝:執(zhí)行命令 easy_install jieba 或者 pip install jieba / pip3 install jieba,可實現(xiàn)全自動安裝。

  • 半自動安裝:先下載 jieba,解壓后運行 python setup.py install

  • 手動安裝:將 jieba 目錄放置于當前目錄或者 site-packages 目錄。

安裝完通過 import jieba 驗證安裝成功與否。

(2)Python 3.x 下的安裝方式。

Github 上 jieba 的 Python3.x 版本的路徑是:https://github.com/fxsjy/jieba/tree/jieba3k

通過 git clone https://github.com/fxsjy/jieba.git 命令下載到本地,然后解壓,再通過命令行進入解壓目錄,執(zhí)行 python setup.py install 命令,即可安裝成功。

jieba 的分詞算法

主要有以下三種:

  1. 基于統(tǒng)計詞典,構(gòu)造前綴詞典,基于前綴詞典對句子進行切分,得到所有切分可能,根據(jù)切分位置,構(gòu)造一個有向無環(huán)圖(DAG);
  2. 基于DAG圖,采用動態(tài)規(guī)劃計算最大概率路徑(最有可能的分詞結(jié)果),根據(jù)最大概率路徑分詞;
  3. 對于新詞(詞庫中沒有的詞),采用有漢字成詞能力的 HMM 模型進行切分。

jieba 分詞

下面我們進行 jieba 分詞練習,第一步首先引入 jieba 和語料:

    import jieba
    content = "現(xiàn)如今,機器學習和深度學習帶動人工智能飛速的發(fā)展,并在圖片處理、語音識別領(lǐng)域取得巨大成功。"

(1)精確分詞

精確分詞:精確模式試圖將句子最精確地切開,精確分詞也是默認分詞。

segs_1 = jieba.cut(content, cut_all=False)
print("/".join(segs_1))

其結(jié)果為:

現(xiàn)如今/,/機器/學習/和/深度/學習/帶動/人工智能/飛速/的/發(fā)展/,/并/在/圖片/處理/、/語音/識別/領(lǐng)域/取得/巨大成功/。

(2)全模式

全模式分詞:把句子中所有的可能是詞語的都掃描出來,速度非常快,但不能解決歧義。

    segs_3 = jieba.cut(content, cut_all=True)
    print("/".join(segs_3))

結(jié)果為:

現(xiàn)如今/如今///機器/學習/和/深度/學習/帶動/動人/人工/人工智能/智能/飛速/的/發(fā)展///并/在/圖片/處理///語音/識別/領(lǐng)域/取得/巨大/巨大成功/大成/成功//

(3)搜索引擎模式

搜索引擎模式:在精確模式的基礎(chǔ)上,對長詞再次切分,提高召回率,適合用于搜索引擎分詞。

    segs_4 = jieba.cut_for_search(content)
    print("/".join(segs_4))

結(jié)果為:

如今/現(xiàn)如今/,/機器/學習/和/深度/學習/帶動/人工/智能/人工智能/飛速/的/發(fā)展/,/并/在/圖片/處理/、/語音/識別/領(lǐng)域/取得/巨大/大成/成功/巨大成功/。

(4)用 lcut 生成 list

jieba.cut 以及 jieba.cut_for_search 返回的結(jié)構(gòu)都是一個可迭代的 Generator,可以使用 for 循環(huán)來獲得分詞后得到的每一個詞語(Unicode)。jieba.lcut 對 cut 的結(jié)果做了封裝,l 代表 list,即返回的結(jié)果是一個 list 集合。同樣的,用 jieba.lcut_for_search 也直接返回 list 集合。

    segs_5 = jieba.lcut(content)
    print(segs_5)

結(jié)果為:

['現(xiàn)如今', ',', '機器', '學習', '和', '深度', '學習', '帶動', '人工智能', '飛速', '的', '發(fā)展', ',', '并', '在', '圖片', '處理', '、', '語音', '識別', '領(lǐng)域', '取得', '巨大成功', '。']

(5)獲取詞性

jieba 可以很方便地獲取中文詞性,通過 jieba.posseg 模塊實現(xiàn)詞性標注。

    import jieba.posseg as psg
    print([(x.word,x.flag) for x in psg.lcut(content)])

結(jié)果為:

[('現(xiàn)如今', 't'), (',', 'x'), ('機器', 'n'), ('學習', 'v'), ('和', 'c'), ('深度', 'ns'), ('學習', 'v'), ('帶動', 'v'), ('人工智能', 'n'), ('飛速', 'n'), ('的', 'uj'), ('發(fā)展', 'vn'), (',', 'x'), ('并', 'c'), ('在', 'p'), ('圖片', 'n'), ('處理', 'v'), ('、', 'x'), ('語音', 'n'), ('識別', 'v'), ('領(lǐng)域', 'n'), ('取得', 'v'), ('巨大成功', 'nr'), ('。', 'x')]

(6)并行分詞

并行分詞原理為文本按行分隔后,分配到多個 Python 進程并行分詞,最后歸并結(jié)果。

用法:

jieba.enable_parallel(4) # 開啟并行分詞模式,參數(shù)為并行進程數(shù) 。
jieba.disable_parallel() # 關(guān)閉并行分詞模式 。

注意: 并行分詞僅支持默認分詞器 jieba.dt 和 jieba.posseg.dt。目前暫不支持 Windows。

(7)獲取分詞結(jié)果中詞列表的 top n

    from collections import Counter
    top5= Counter(segs_5).most_common(5)
    print(top5)

結(jié)果為:

[(',', 2), ('學習', 2), ('現(xiàn)如今', 1), ('機器', 1), ('和', 1)]

(8)自定義添加詞和字典

默認情況下,使用默認分詞,是識別不出這句話中的“鐵甲網(wǎng)”這個新詞,這里使用用戶字典提高分詞準確性。

    txt = "鐵甲網(wǎng)是中國最大的工程機械交易平臺。"
    print(jieba.lcut(txt))

結(jié)果為:

['鐵甲', '網(wǎng)是', '中國', '最大', '的', '工程機械', '交易平臺', '。']

如果添加一個詞到字典,看結(jié)果就不一樣了。

    jieba.add_word("鐵甲網(wǎng)")
    print(jieba.lcut(txt))

結(jié)果為:

['鐵甲網(wǎng)', '是', '中國', '最大', '的', '工程機械', '交易平臺', '。']

但是,如果要添加很多個詞,一個個添加效率就不夠高了,這時候可以定義一個文件,然后通過 load_userdict()函數(shù),加載自定義詞典,如下:

    jieba.load_userdict('user_dict.txt')
    print(jieba.lcut(txt))

結(jié)果為:

['鐵甲網(wǎng)', '是', '中國', '最大', '的', '工程機械', '交易平臺', '。']

注意事項:

jieba.cut 方法接受三個輸入?yún)?shù): 需要分詞的字符串;cut_all 參數(shù)用來控制是否采用全模式;HMM 參數(shù)用來控制是否使用 HMM 模型。

jieba.cut_for_search 方法接受兩個參數(shù):需要分詞的字符串;是否使用 HMM 模型。該方法適合用于搜索引擎構(gòu)建倒排索引的分詞,粒度比較細。

HanLP 分詞

pyhanlp 安裝

其為 HanLP 的 Python 接口,支持自動下載與升級 HanLP,兼容 Python2、Python3。

安裝命令為 pip install pyhanlp,使用命令 hanlp 來驗證安裝。

pyhanlp 目前使用 jpype1 這個 Python 包來調(diào)用 HanLP,如果遇到:

building '_jpype' extensionerror: Microsoft Visual C++ 14.0 is required. Get it with "Microsoft VisualC++ Build Tools": http://landinghub.visualstudio.com/visual-cpp-build-tools

則推薦利用輕量級的 Miniconda 來下載編譯好的 jpype1。

    conda install -c conda-forge jpype1
    pip install pyhanlp

未安裝 Java 時會報錯

jpype._jvmfinder.JVMNotFoundException: No JVM shared library file (jvm.dll) found. Try setting up the JAVA_HOME environment variable properly.

HanLP 主項目采用 Java 開發(fā),所以需要 Java 運行環(huán)境,請安裝 JDK。

命令行交互式分詞模式

在命令行界面,使用命令 hanlp segment 進入交互分詞模式,輸入一個句子并回車,HanLP 會輸出分詞結(jié)果:

enter image description here

可見,pyhanlp 分詞結(jié)果是帶有詞性的。

服務(wù)器模式

通過 hanlp serve 來啟動內(nèi)置的 HTTP 服務(wù)器,默認本地訪問地址為:http://localhost:8765

enter image description here
enter image description here

也可以訪問官網(wǎng)演示頁面:http://hanlp.hankcs.com/

通過工具類 HanLP 調(diào)用常用接口

通過工具類 HanLP 調(diào)用常用接口,這種方式應(yīng)該是我們在項目中最常用的方式。

(1)分詞

    from pyhanlp import *
    content = "現(xiàn)如今,機器學習和深度學習帶動人工智能飛速的發(fā)展,并在圖片處理、語音識別領(lǐng)域取得巨大成功。"
    print(HanLP.segment(content))

結(jié)果為:

[現(xiàn)如今/t, ,/w, 機器學習/gi, 和/cc, 深度/n, 學習/v, 帶動/v, 人工智能/n, 飛速/d, 的/ude1, 發(fā)展/vn, ,/w, 并/cc, 在/p, 圖片/n, 處理/vn, 、/w, 語音/n, 識別/vn, 領(lǐng)域/n, 取得/v, 巨大/a, 成功/a, 。/w]

(2)自定義詞典分詞

在沒有使用自定義字典時的分詞。

    txt = "鐵甲網(wǎng)是中國最大的工程機械交易平臺。"
    print(HanLP.segment(txt))

結(jié)果為:

[鐵甲/n, 網(wǎng)/n, 是/vshi, 中國/ns, 最大/gm, 的/ude1, 工程/n, 機械/n, 交易/vn, 平臺/n, 。/w]

添加自定義新詞:

    CustomDictionary.add("鐵甲網(wǎng)")
    CustomDictionary.insert("工程機械", "nz 1024")
    CustomDictionary.add("交易平臺", "nz 1024 n 1")
    print(HanLP.segment(txt))

結(jié)果為:

[鐵甲網(wǎng)/nz, 是/vshi, 中國/ns, 最大/gm, 的/ude1, 工程機械/nz, 交易平臺/nz, 。/w]

當然了,jieba 和 pyhanlp 能做的事還有很多,關(guān)鍵詞提取、自動摘要、依存句法分析、情感分析等,后面章節(jié)我們將會講到,這里不再贅述。

參考文獻:

  1. https://github.com/fxsjy/jieba
  2. https://github.com/hankcs/pyhanlp

如有侵權(quán)請聯(lián)系QQ:758230255刪除

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 227,533評論 6 531
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 98,055評論 3 414
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 175,365評論 0 373
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經(jīng)常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 62,561評論 1 307
  • 正文 為了忘掉前任,我火速辦了婚禮,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 71,346評論 6 404
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 54,889評論 1 321
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 42,978評論 3 439
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 42,118評論 0 286
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 48,637評論 1 333
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 40,558評論 3 354
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 42,739評論 1 369
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,246評論 5 355
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 43,980評論 3 346
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,362評論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 35,619評論 1 280
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 51,347評論 3 390
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 47,702評論 2 370