Last Updated on 2021-04-01 by Clay
HanLp 的全名為 Han Language Processing,根據 Github 的 README 介紹,其由『大快搜尋』開發並且開源於網路上。
HanLP 提供了各式各樣的功能,包括:
- 中文斷詞
- 詞性標記
- 命名實體識別
- 關鍵字抽取
- 自動摘要
- 拼音轉換
- 簡繁轉換
- 文本推薦
- 文本分類
- Word2Vec
- 語料庫工具
以上眾多的功能,我想我肯定還有漏掉的部份。
如果想要參閱這個工具的 Github,請看這邊: https://github.com/hankcs/HanLP
如果想要在線上直接試用這個工具,你也可以去他們在線演示的網站: http://hanlp.com/
以下,我會展示該如何透過 Python 去呼叫這個工具,來完成一些自然語言處理的工作。
事前準備
pip3 install opencc-python-reimplemented
pip3 install pyhanlp
OpenCC 是我用來簡轉繁的工具,畢竟在 HanLP 上還是簡體的文本分析效果會比較好一點。
pyhanlp 這個套件為 Python 的接口,我們可以直接使用來調用 HanLP。第一次使用時如有下載模型屬正常現象。
斷詞
POS
請原諒我這兩個功能一起提到,畢竟這兩個功能在 pyhanlp 當中似乎是沒有分開的。
以下我們就來看段簡短的 sample code:
# -*- coding: utf-8 -*- from opencc import OpenCC from pyhanlp import * cc = OpenCC('tw2sp') text = '傅達仁今將執行安樂死,卻突然爆出自己20年前遭緯來體育台封殺,他不懂自己哪裡得罪到電視台。' text = cc.convert(text) # Tokenize print(HanLP.segment(text)) for term in HanLP.segment(text): print(term.word, term.nature)
Output:
[傅/nz, 达仁/ns, 今/tg, 将/d, 运行/vn, 安乐死/v, ,/w, 却/d, 突然/ad, 爆出/v, 自己/rr, 20/m, 年前/t, 遭/v, 纬/ng, 来/vf, 体育台/nz, 封杀/v, ,/w, 他/rr, 不懂/v, 自己/rr, 哪里/rys, 得罪/v, 到/v, 电视台/nis, 。/w]
傅 nz
达仁 ns
今 tg
将 d
运行 vn
安乐死 v
, w
却 d
突然 ad
爆出 v
自己 rr
20 m
年前 t
遭 v
纬 ng
来 vf
体育台 nz
封杀 v
, w
他 rr
不懂 v
自己 rr
哪里 rys
得罪 v
到 v
电视台 nis
。 w
首先我們先 import 進 pyhanlp,然後使用 OpenCC 將 text 裡頭的句子進行了繁轉簡。然後在使用 HanLP.segment() 來進行斷詞。
我們可以看到,第一段為使用 HanLP.segment() 斷詞之後的結果;另外,我們也可以使用 for-loop 將裡頭的元素一個個讀出來, term.word 以及 term.nature 分別為斷詞的『詞』以及『詞性』。
關鍵字擷取
HanLP 雖然有關鍵字擷取的功能,但效果只能說差強人意。不過話說回來,目前的關鍵字擷取技術可能就只能做到這樣,大家可以試試看效果。
print(HanLP.extractKeyword(text, 5))
Output:
[体育台, 突然, 爆出, 纬, 年前]
後面的參數 5 指的是我想要找『多少個』關鍵字。你也可以試試看不同的數量。
自動摘要
這是一個滿有趣的功能,根據我之前使用的經驗,長點的文本會比較有效果。
print(HanLP.extractSummary(text, 6))
Output:
[他不懂自己哪里得罪到电视台]
這裡有個問題是,我不管設定多少個數字都只顯示這個句子。可能是找不到更多可以摘要的句子也不一定。
Dependency Parsing
Dependency Parsing 也許可以翻成『依賴性句子解析』,基本上跟 Stanford CoreNLP 的句法分析有點像。
以下我們來示範一段簡單的 sample code:
print(HanLP.parseDependency(text))
Output:
1 傅达仁 傅达仁 nh nr _ 4 主谓关系 _ _
2 今 今 Tg Tg _ 4 状中结构 _ _
3 将 将 d d _ 4 状中结构 _ _
4 运行 运行 v v _ 0 核心关系 _ _
5 安乐死 安乐死 a a _ 4 动宾关系 _ _
6 , , wp w _ 4 标点符号 _ _
7 却 却 d d _ 9 状中结构 _ _
8 突然 突然 a ad _ 9 状中结构 _ _
9 爆出 爆出 v v _ 4 并列关系 _ _
10 自己 自己 r r _ 11 定中关系 _ _
11 20年前 20年前 nt t _ 12 状中结构 _ _
12 遭 遭 v v _ 9 动宾关系 _ _
13 纬来 纬来 v v _ 14 定中关系 _ _
14 体育台 体育台 n n _ 15 主谓关系 _ _
15 封杀 封杀 v v _ 12 动宾关系 _ _
16 , , wp w _ 9 标点符号 _ _
17 他 他 r r _ 19 主谓关系 _ _
18 不 不 d d _ 19 状中结构 _ _
19 懂 懂 v v _ 9 并列关系 _ _
20 自己 自己 r r _ 22 主谓关系 _ _
21 哪里 哪里 r r _ 22 状中结构 _ _
22 得罪 得罪 v v _ 19 动宾关系 _ _
23 到 到 v v _ 22 动补结构 _ _
24 电视台 电视台 n n _ 22 动宾关系 _ _
25 。 。 wp w _ 4 标点符号 _ _
其實我並沒有看懂這種 Dependency Parsing 的模式,或者說我看 Stanford 工具的分析太習慣了。我會再找找有沒有這種解析模式的詳細說明。
補充
如果需要更多的功能、而目前 pyhanlp 是沒有的,你可以使用 JClass('HanLP Class 路徑')
來調用。至於不同的功能,可能就要上 HanLP 的 Github 去找找了。