您好,登錄后才能下訂單哦!
從本文開始,我們進入實戰部分。首先,我們按照中文自然語言處理流程的第一步獲取語料,然后重點進行中文分詞的學習。中文分詞有很多種,常見的比如有中科院計算所 NLPIR、哈工大 LTP、清華大學 THULAC 、斯坦福分詞器、Hanlp 分詞器、jieba 分詞、IKAnalyzer 等。這里針對 jieba 和 HanLP 分別介紹不同場景下的中文分詞應用。
(1)Python 2.x 下 jieba 的三種安裝方式,如下:
全自動安裝
:執行命令
easy_install jieba
或者
pip install jieba
/
pip3 install jieba
,可實現全自動安裝。
半自動安裝
:先
下載 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
命令下載到本地,然后解壓,再通過命令行進入解壓目錄,執行
python setup.py install
命令,即可安裝成功。
主要有以下三種:
基于統計詞典,構造前綴詞典,基于前綴詞典對句子進行切分,得到所有切分可能,根據切分位置,構造一個有向無環圖(DAG);
基于DAG圖,采用動態規劃計算最大概率路徑(最有可能的分詞結果),根據最大概率路徑分詞;
對于新詞(詞庫中沒有的詞),采用有漢字成詞能力的 HMM 模型進行切分。
下面我們進行 jieba 分詞練習,第一步首先引入 jieba 和語料:
import jieba content = "現如今,機器學習和深度學習帶動人工智能飛速的發展,并在圖片處理、語音識別領域取得巨大成功。"
(1) 精確分詞
精確分詞:精確模式試圖將句子最精確地切開,精確分詞也是默認分詞。
segs_1 = jieba.cut(content, cut_all=False)print("/".join(segs_1))
其結果為:
現如今/,/機器/學習/和/深度/學習/帶動/人工智能/飛速/的/發展/,/并/在/圖片/處理/、/語音/識別/領域/取得/巨大成功/。
(2) 全模式
全模式分詞:把句子中所有的可能是詞語的都掃描出來,速度非常快,但不能解決歧義。
segs_3 = jieba.cut(content, cut_all=True) print("/".join(segs_3))
結果為:
現如今/如今///機器/學習/和/深度/學習/帶動/動人/人工/人工智能/智能/飛速/的/發展///并/在/圖片/處理///語音/識別/領域/取得/巨大/巨大成功/大成/成功//
(3) 搜索引擎模式
搜索引擎模式:在精確模式的基礎上,對長詞再次切分,提高召回率,適合用于搜索引擎分詞。
segs_4 = jieba.cut_for_search(content) print("/".join(segs_4))
結果為:
如今/現如今/,/機器/學習/和/深度/學習/帶動/人工/智能/人工智能/飛速/的/發展/,/并/在/圖片/處理/、/語音/識別/領域/取得/巨大/大成/成功/巨大成功/。
(4) 用 lcut 生成 list
jieba.cut 以及
jieba.cut_for_search
返回的結構都是一個可迭代的 Generator,可以使用 for 循環來獲得分詞后得到的每一個詞語(Unicode)。jieba.lcut 對 cut 的結果做了封裝,l 代表 list,即返回的結果是一個 list 集合。同樣的,用
jieba.lcut_for_search
也直接返回 list 集合。
segs_5 = jieba.lcut(content) print(segs_5)
結果為:
['現如今', ',', '機器', '學習', '和', '深度', '學習', '帶動', '人工智能', '飛速', '的', '發展', ',', '并', '在', '圖片', '處理', '、', '語音', '識別', '領域', '取得', '巨大成功', '。']
(5) 獲取詞性
jieba 可以很方便地獲取中文詞性,通過 jieba.posseg 模塊實現詞性標注。
import jieba.posseg as psg print([(x.word,x.flag) for x in psg.lcut(content)])
結果為:
[('現如今', 't'), (',', 'x'), ('機器', 'n'), ('學習', 'v'), ('和', 'c'), ('深度', 'ns'), ('學習', 'v'), ('帶動', 'v'), ('人工智能', 'n'), ('飛速', 'n'), ('的', 'uj'), ('發展', 'vn'), (',', 'x'), ('并', 'c'), ('在', 'p'), ('圖片', 'n'), ('處理', 'v'), ('、', 'x'), ('語音', 'n'), ('識別', 'v'), ('領域', 'n'), ('取得', 'v'), ('巨大成功', 'nr'), ('。', 'x')]
(6) 并行分詞
并行分詞原理為文本按行分隔后,分配到多個 Python 進程并行分詞,最后歸并結果。
用法:
jieba.enable_parallel(4) # 開啟并行分詞模式,參數為并行進程數 。jieba.disable_parallel() # 關閉并行分詞模式 。
注意: 并行分詞僅支持默認分詞器 jieba.dt 和 jieba.posseg.dt。目前暫不支持 Windows。
(7) 獲取分詞結果中詞列表的 top n
from collections import Counter top5= Counter(segs_5).most_common(5) print(top5)
結果為:
[(',', 2), ('學習', 2), ('現如今', 1), ('機器', 1), ('和', 1)]
(8) 自定義添加詞和字典
默認情況下,使用默認分詞,是識別不出這句話中的“鐵甲網”這個新詞,這里使用用戶字典提高分詞準確性。
txt = "鐵甲網是中國最大的工程機械交易平臺。" print(jieba.lcut(txt))
結果為:
['鐵甲', '網是', '中國', '最大', '的', '工程機械', '交易平臺', '。']
如果添加一個詞到字典,看結果就不一樣了。
jieba.add_word("鐵甲網") print(jieba.lcut(txt))
結果為:
['鐵甲網', '是', '中國', '最大', '的', '工程機械', '交易平臺', '。']
但是,如果要添加很多個詞,一個個添加效率就不夠高了,這時候可以定義一個文件,然后通過
load_userdict()
函數,加載自定義詞典,如下:
jieba.load_userdict('user_dict.txt') print(jieba.lcut(txt))
結果為:
['鐵甲網', '是', '中國', '最大', '的', '工程機械', '交易平臺', '。']
注意事項:
jieba.cut 方法接受三個輸入參數: 需要分詞的字符串;
cut_all
參數用來控制是否采用全模式;HMM 參數用來控制是否使用 HMM 模型。
jieba.cut_for_search
方法接受兩個參數:需要分詞的字符串;是否使用 HMM 模型。該方法適合用于搜索引擎構建倒排索引的分詞,粒度比較細。
其為 HanLP 的 Python 接口,支持自動下載與升級 HanLP,兼容 Python2、Python3。
安裝命令為
pip install pyhanlp
,使用命令 hanlp 來驗證安裝。
pyhanlp 目前使用 jpype1 這個 Python 包來調用 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 開發,所以需要 Java 運行環境,請安裝 JDK。
在命令行界面,使用命令 hanlp segment 進入交互分詞模式,輸入一個句子并回車,HanLP 會輸出分詞結果:
HanlP分詞1.png
HanLp分詞2.png
可見,pyhanlp 分詞結果是帶有詞性的。
通過 hanlp serve 來啟動內置的 HTTP 服務器,默認本地訪問地址為: http://localhost:8765 。
Hanlp分詞3.png
enter image description here
也可以訪問官網演示頁面: http://hanlp.hankcs.com/ 。
通過工具類 HanLP 調用常用接口,這種方式應該是我們在項目中最常用的方式。
(1)分詞
from pyhanlp import * content = "現如今,機器學習和深度學習帶動人工智能飛速的發展,并在圖片處理、語音識別領域取得巨大成功。" print(HanLP.segment(content))
結果為:
[現如今/t, ,/w, 機器學習/gi, 和/cc, 深度/n, 學習/v, 帶動/v, 人工智能/n, 飛速/d, 的/ude1, 發展/vn, ,/w, 并/cc, 在/p, 圖片/n, 處理/vn, 、/w, 語音/n, 識別/vn, 領域/n, 取得/v, 巨大/a, 成功/a, 。/w]
(2)自定義詞典分詞
在沒有使用自定義字典時的分詞。
txt = "鐵甲網是中國最大的工程機械交易平臺。" print(HanLP.segment(txt))
結果為:
[鐵甲/n, 網/n, 是/vshi, 中國/ns, 最大/gm, 的/ude1, 工程/n, 機械/n, 交易/vn, 平臺/n, 。/w]
添加自定義新詞:
CustomDictionary.add("鐵甲網") CustomDictionary.insert("工程機械", "nz 1024") CustomDictionary.add("交易平臺", "nz 1024 n 1") print(HanLP.segment(txt))
結果為:
[鐵甲網/nz, 是/vshi, 中國/ns, 最大/gm, 的/ude1, 工程機械/nz, 交易平臺/nz, 。/w]
當然了,jieba 和 pyhanlp 能做的事還有很多,關鍵詞提取、自動摘要、依存句法分析、情感分析等,后面章節我們將會講到,這里不再贅述。
文章來源于米飯超人的博客
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。