Skip to content

[NLP][Python] 有許多功能的自然語言處理工具: HanLP

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 去找找了。

Tags:

Leave a Reply