前言
從本文開始驰吓,我們進(jìn)入實(shí)戰(zhàn)部分。首先履腋,我們按照中文自然語(yǔ)言處理流程的第一步獲取語(yǔ)料珊燎,然后重點(diǎn)進(jìn)行中文分詞的學(xué)習(xí)。中文分詞有很多種遵湖,常見的比如有中科院計(jì)算所 NLPIR悔政、哈工大 LTP、清華大學(xué) THULAC 延旧、斯坦福分詞器谋国、Hanlp 分詞器、jieba 分詞迁沫、IKAnalyzer 等芦瘾。這里針對(duì) jieba 和 HanLP 分別介紹不同場(chǎng)景下的中文分詞應(yīng)用。
jieba 分詞
jieba 安裝
(1)Python 2.x 下 jieba 的三種安裝方式集畅,如下:
全自動(dòng)安裝:執(zhí)行命令
easy_install jieba
或者pip install jieba
/pip3 install jieba
近弟,可實(shí)現(xiàn)全自動(dòng)安裝。半自動(dòng)安裝:先下載 jieba挺智,解壓后運(yùn)行
python setup.py install
祷愉。手動(dòng)安裝:將 jieba 目錄放置于當(dāng)前目錄或者 site-packages 目錄。
安裝完通過(guò) import jieba
驗(yàn)證安裝成功與否赦颇。
(2)Python 3.x 下的安裝方式二鳄。
Github 上 jieba 的 Python3.x 版本的路徑是:https://github.com/fxsjy/jieba/tree/jieba3k。
通過(guò) git clone https://github.com/fxsjy/jieba.git
命令下載到本地媒怯,然后解壓订讼,再通過(guò)命令行進(jìn)入解壓目錄,執(zhí)行 python setup.py install
命令沪摄,即可安裝成功躯嫉。
jieba 的分詞算法
主要有以下三種:
- 基于統(tǒng)計(jì)詞典纱烘,構(gòu)造前綴詞典,基于前綴詞典對(duì)句子進(jìn)行切分祈餐,得到所有切分可能擂啥,根據(jù)切分位置,構(gòu)造一個(gè)有向無(wú)環(huán)圖(DAG)帆阳;
- 基于DAG圖哺壶,采用動(dòng)態(tài)規(guī)劃計(jì)算最大概率路徑(最有可能的分詞結(jié)果),根據(jù)最大概率路徑分詞蜒谤;
- 對(duì)于新詞(詞庫(kù)中沒有的詞)山宾,采用有漢字成詞能力的 HMM 模型進(jìn)行切分。
jieba 分詞
下面我們進(jìn)行 jieba 分詞練習(xí)鳍徽,第一步首先引入 jieba 和語(yǔ)料:
import jieba
content = "現(xiàn)如今资锰,機(jī)器學(xué)習(xí)和深度學(xué)習(xí)帶動(dòng)人工智能飛速的發(fā)展,并在圖片處理阶祭、語(yǔ)音識(shí)別領(lǐng)域取得巨大成功绷杜。"
(1)精確分詞
精確分詞:精確模式試圖將句子最精確地切開,精確分詞也是默認(rèn)分詞濒募。
segs_1 = jieba.cut(content, cut_all=False)
print("/".join(segs_1))
其結(jié)果為:
現(xiàn)如今/鞭盟,/機(jī)器/學(xué)習(xí)/和/深度/學(xué)習(xí)/帶動(dòng)/人工智能/飛速/的/發(fā)展/,/并/在/圖片/處理/瑰剃、/語(yǔ)音/識(shí)別/領(lǐng)域/取得/巨大成功/齿诉。
(2)全模式
全模式分詞:把句子中所有的可能是詞語(yǔ)的都掃描出來(lái),速度非成我Γ快粤剧,但不能解決歧義。
segs_3 = jieba.cut(content, cut_all=True)
print("/".join(segs_3))
結(jié)果為:
現(xiàn)如今/如今///機(jī)器/學(xué)習(xí)/和/深度/學(xué)習(xí)/帶動(dòng)/動(dòng)人/人工/人工智能/智能/飛速/的/發(fā)展///并/在/圖片/處理///語(yǔ)音/識(shí)別/領(lǐng)域/取得/巨大/巨大成功/大成/成功//
(3)搜索引擎模式
搜索引擎模式:在精確模式的基礎(chǔ)上舀凛,對(duì)長(zhǎng)詞再次切分俊扳,提高召回率,適合用于搜索引擎分詞猛遍。
segs_4 = jieba.cut_for_search(content)
print("/".join(segs_4))
結(jié)果為:
如今/現(xiàn)如今/馋记,/機(jī)器/學(xué)習(xí)/和/深度/學(xué)習(xí)/帶動(dòng)/人工/智能/人工智能/飛速/的/發(fā)展/,/并/在/圖片/處理/懊烤、/語(yǔ)音/識(shí)別/領(lǐng)域/取得/巨大/大成/成功/巨大成功/梯醒。
(4)用 lcut 生成 list
jieba.cut 以及 jieba.cut_for_search
返回的結(jié)構(gòu)都是一個(gè)可迭代的 Generator,可以使用 for 循環(huán)來(lái)獲得分詞后得到的每一個(gè)詞語(yǔ)(Unicode)腌紧。jieba.lcut 對(duì) cut 的結(jié)果做了封裝茸习,l 代表 list,即返回的結(jié)果是一個(gè) list 集合壁肋。同樣的号胚,用 jieba.lcut_for_search
也直接返回 list 集合籽慢。
segs_5 = jieba.lcut(content)
print(segs_5)
結(jié)果為:
['現(xiàn)如今', ',', '機(jī)器', '學(xué)習(xí)', '和', '深度', '學(xué)習(xí)', '帶動(dòng)', '人工智能', '飛速', '的', '發(fā)展', '猫胁,', '并', '在', '圖片', '處理', '箱亿、', '語(yǔ)音', '識(shí)別', '領(lǐng)域', '取得', '巨大成功', '。']
(5)獲取詞性
jieba 可以很方便地獲取中文詞性弃秆,通過(guò) jieba.posseg 模塊實(shí)現(xiàn)詞性標(biāo)注届惋。
import jieba.posseg as psg
print([(x.word,x.flag) for x in psg.lcut(content)])
結(jié)果為:
[('現(xiàn)如今', 't'), (',', 'x'), ('機(jī)器', 'n'), ('學(xué)習(xí)', 'v'), ('和', 'c'), ('深度', 'ns'), ('學(xué)習(xí)', 'v'), ('帶動(dòng)', 'v'), ('人工智能', 'n'), ('飛速', 'n'), ('的', 'uj'), ('發(fā)展', 'vn'), ('菠赚,', 'x'), ('并', 'c'), ('在', 'p'), ('圖片', 'n'), ('處理', 'v'), ('脑豹、', 'x'), ('語(yǔ)音', 'n'), ('識(shí)別', 'v'), ('領(lǐng)域', 'n'), ('取得', 'v'), ('巨大成功', 'nr'), ('。', 'x')]
(6)并行分詞
并行分詞原理為文本按行分隔后衡查,分配到多個(gè) Python 進(jìn)程并行分詞瘩欺,最后歸并結(jié)果。
用法:
jieba.enable_parallel(4) # 開啟并行分詞模式拌牲,參數(shù)為并行進(jìn)程數(shù) 击碗。
jieba.disable_parallel() # 關(guān)閉并行分詞模式 。
注意: 并行分詞僅支持默認(rè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), ('學(xué)習(xí)', 2), ('現(xiàn)如今', 1), ('機(jī)器', 1), ('和', 1)]
(8)自定義添加詞和字典
默認(rèn)情況下砚婆,使用默認(rèn)分詞,是識(shí)別不出這句話中的“鐵甲網(wǎng)”這個(gè)新詞突勇,這里使用用戶字典提高分詞準(zhǔn)確性装盯。
txt = "鐵甲網(wǎng)是中國(guó)最大的工程機(jī)械交易平臺(tái)。"
print(jieba.lcut(txt))
結(jié)果為:
['鐵甲', '網(wǎng)是', '中國(guó)', '最大', '的', '工程機(jī)械', '交易平臺(tái)', '甲馋。']
如果添加一個(gè)詞到字典埂奈,看結(jié)果就不一樣了。
jieba.add_word("鐵甲網(wǎng)")
print(jieba.lcut(txt))
結(jié)果為:
['鐵甲網(wǎng)', '是', '中國(guó)', '最大', '的', '工程機(jī)械', '交易平臺(tái)', '定躏。']
但是账磺,如果要添加很多個(gè)詞,一個(gè)個(gè)添加效率就不夠高了痊远,這時(shí)候可以定義一個(gè)文件垮抗,然后通過(guò) load_userdict()
函數(shù),加載自定義詞典碧聪,如下:
jieba.load_userdict('user_dict.txt')
print(jieba.lcut(txt))
結(jié)果為:
['鐵甲網(wǎng)', '是', '中國(guó)', '最大', '的', '工程機(jī)械', '交易平臺(tái)', '冒版。']
注意事項(xiàng):
jieba.cut 方法接受三個(gè)輸入?yún)?shù): 需要分詞的字符串;cut_all
參數(shù)用來(lái)控制是否采用全模式逞姿;HMM 參數(shù)用來(lái)控制是否使用 HMM 模型辞嗡。
jieba.cut_for_search
方法接受兩個(gè)參數(shù):需要分詞的字符串捆等;是否使用 HMM 模型。該方法適合用于搜索引擎構(gòu)建倒排索引的分詞续室,粒度比較細(xì)栋烤。
HanLP 分詞
pyhanlp 安裝
其為 HanLP 的 Python 接口,支持自動(dòng)下載與升級(jí) HanLP猎贴,兼容 Python2班缎、Python3。
安裝命令為 pip install pyhanlp
她渴,使用命令 hanlp 來(lái)驗(yàn)證安裝达址。
pyhanlp 目前使用 jpype1 這個(gè) Python 包來(lái)調(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
則推薦利用輕量級(jí)的 Miniconda 來(lái)下載編譯好的 jpype1趁耗。
conda install -c conda-forge jpype1
pip install pyhanlp
未安裝 Java 時(shí)會(huì)報(bào)錯(cuò):
jpype.jvmfinder.JVMNotFoundException: No JVM shared library file (jvm.dll) found. Try setting up the JAVAHOME environment variable properly.
HanLP 主項(xiàng)目采用 Java 開發(fā)沉唠,所以需要 Java 運(yùn)行環(huán)境,請(qǐng)安裝 JDK苛败。
命令行交互式分詞模式
在命令行界面满葛,使用命令 hanlp segment 進(jìn)入交互分詞模式,輸入一個(gè)句子并回車罢屈,HanLP 會(huì)輸出分詞結(jié)果:
可見嘀韧,pyhanlp 分詞結(jié)果是帶有詞性的。
服務(wù)器模式
通過(guò) hanlp serve 來(lái)啟動(dòng)內(nèi)置的 HTTP 服務(wù)器缠捌,默認(rèn)本地訪問(wèn)地址為:http://localhost:8765 锄贷。
也可以訪問(wèn)官網(wǎng)演示頁(yè)面:http://hanlp.hankcs.com/。
通過(guò)工具類 HanLP 調(diào)用常用接口
通過(guò)工具類 HanLP 調(diào)用常用接口曼月,這種方式應(yīng)該是我們?cè)陧?xiàng)目中最常用的方式谊却。
(1)分詞
from pyhanlp import *
content = "現(xiàn)如今,機(jī)器學(xué)習(xí)和深度學(xué)習(xí)帶動(dòng)人工智能飛速的發(fā)展哑芹,并在圖片處理炎辨、語(yǔ)音識(shí)別領(lǐng)域取得巨大成功。"
print(HanLP.segment(content))
結(jié)果為:
[現(xiàn)如今/t, 聪姿,/w, 機(jī)器學(xué)習(xí)/gi, 和/cc, 深度/n, 學(xué)習(xí)/v, 帶動(dòng)/v, 人工智能/n, 飛速/d, 的/ude1, 發(fā)展/vn, 碴萧,/w, 并/cc, 在/p, 圖片/n, 處理/vn, 、/w, 語(yǔ)音/n, 識(shí)別/vn, 領(lǐng)域/n, 取得/v, 巨大/a, 成功/a, 末购。/w]
(2)自定義詞典分詞
在沒有使用自定義字典時(shí)的分詞勿决。
txt = "鐵甲網(wǎng)是中國(guó)最大的工程機(jī)械交易平臺(tái)。"
print(HanLP.segment(txt))
結(jié)果為:
[鐵甲/n, 網(wǎng)/n, 是/vshi, 中國(guó)/ns, 最大/gm, 的/ude1, 工程/n, 機(jī)械/n, 交易/vn, 平臺(tái)/n, 招盲。/w]
添加自定義新詞:
CustomDictionary.add("鐵甲網(wǎng)")
CustomDictionary.insert("工程機(jī)械", "nz 1024")
CustomDictionary.add("交易平臺(tái)", "nz 1024 n 1")
print(HanLP.segment(txt))
結(jié)果為:
[鐵甲網(wǎng)/nz, 是/vshi, 中國(guó)/ns, 最大/gm, 的/ude1, 工程機(jī)械/nz, 交易平臺(tái)/nz, 低缩。/w]
當(dāng)然了,jieba 和 pyhanlp 能做的事還有很多,關(guān)鍵詞提取咆繁、自動(dòng)摘要讳推、依存句法分析、情感分析等玩般,后面章節(jié)我們將會(huì)講到银觅,這里不再贅述。