中文NLP技術學習系列文章,將以NLTK
系統爲主體框架,通過整合相關的開源系統來學習NLP
中涉及的所有模塊。下面是我的PC環境:
- win10 64bits
- python 3.6.8+pip+virtualenv
- PyCharm 2018.3.5 (Professional Edition)
本系列Demo地址:NLPDemos
1. NLTK平臺搭建
NLTK,Nature Language Tool Kit
,即自然語言工具包,是一個免費、開源且使用Python程序構建的自然語言數據工作平臺。NTLK系統提供了易於使用的界面和超過50種語料庫、詞彙資源,同時還包含一套分類、分詞、詞幹、標註、分析和語義推理的基本框架,更爲重要的是我們可以將目前比較好的NLP開源應用系統整合到NLTP平臺來開發NLP項目。
NLTK平臺特徵:
- 跨平臺。完全兼容Windows、Linux等系統;
- 跨語言。允許自由整合基於Java、C++、Python等語言實現的NLP系統;
- 預先包含絕大多數的NLP常用功能,即各類基於規則的或基於統計的詞法、句法、語義等分析模塊;
- 系統內存開銷小;
1.1 安裝Python3.6和第三方庫
(1) 安裝python3.6.8
(2) 安裝網絡包
pip install Tornado
(3) 安裝數學運算包
pip install numpy
pip install scipy
1.2 搭建NLTK平臺
(1) 安裝NLTK開發環境
pip install nltk
(2) 下載中文語料庫
# NLTK_Download.py
import sys
import nltk
import importlib
# 加載sys庫
importlib.reload(sys)
# 打開NLTK Downloader下載頁面
nltk.download()
執行腳本python NLTK_Download.py
,看到如下界面:
NLTK平臺提供了50種語料庫、詞彙庫,但默認使用的都是英文語料庫。由於我們研究的是中文NLP,因此不必要下載所有語料庫,就我所知Sinica
是中央研究院提供的一個繁體中文語料庫。
2. LTP環境搭建
LTP(3.4.0),Language Technology Platform
,即語言技術平臺,是哈爾濱工業大學開發的一整套中文語言處理系統,該平臺基於C++實現,提供包括中文分詞
、 詞性標註
、命名實體識別
、依存句法分析
、語義角色標註
等豐富、高效、精確的自然語言處理技術,且支持可視化圖形輸出。另外,爲了便於在python環境下使用,LTP還提供了它的Python封裝pyltp(0.2.0),其依賴支持情況:
Py2.6 | Py2.6 | Py3.4 | Py3.5 | Py3.6 | conda-python | |
---|---|---|---|---|---|---|
Linux | 支持 | 支持 | 支持 | 支持 | 支持 | 不支持 |
Mac OS | 支持 | 支持 | 支持 | 支持 | 支持 | 不支持 |
Windows VS2015 | 不支持 | 不支持 | 不支持 | 支持 | 支持 | 不支持 |
Windows VS2017 | 不支持 | 不支持 | 不支持 | 支持 | 支持 | 不支持 |
2.1 pyltp開發環境搭建
(1) 安裝pyltp
LTP官方提供了兩種安裝方式,即使用pip在線安裝
和編譯源碼本地安裝
,具體如下:
- 使用pip安裝
pip install pyltp
注:如果安裝過程中出現Microsoft Visual Studio 14.0
錯誤,這裏推薦下載pyltp-0.2.1-cp36-cp36m-win_amd64.whl,然後直接使用pip install pyltp-0.2.1-cp36-cp36m-win_amd64.whl安裝即可。
- 從源代碼安裝(PC需安裝git)
$ git clone https://github.com/HIT-SCIR/pyltp
$ git submodule init
$ git submodule update
$ python setup.py install
(2) 下載LTP模型文件ltp_data_v3.4.0.zip,需要注意的是,在windows下 3.4.0 版本的語義角色標註模塊模型
需要單獨下載,即pisrl_win.model。
其中,cws.model
爲中文分詞模型;ner.model
爲命名實體模型;parser.model
爲句法解析模型;pisrl_win.model
爲語義角色標註模型;pos.model
爲詞性標註模型。
3. 示例演示
在上一小節中,我們成功將NLP開源系統pyltp整合到NLTK平臺,本節編寫一個句法解析
示例來演示如何利用NLTK和pyltp研究NLP相關技術。關於什麼是句法解析,這裏我們放在後面文章中詳講,你只需要知道句法解析就是漢語中解析一個句子的語法結構。示例代碼如下:
# Parser.py 句法解析示例
# Date:2019-05-07 9:43
# Author:Jiangdongguo
from pyltp import *
import nltk
from scipy._lib.six import xrange
sentence = "中國南部的湖南省,省會是長沙市,也是一座世界知名的城市。"
segment_model_path = "data/ltp_models/cws.model" # 中文分詞模型
postagger_model_path = "data/ltp_models/pos.model" # 詞性標註模型
parser_model_path = "data/ltp_models/parser.model" # 句法分析模型
# 1. 中文分詞
segmentor = Segmentor()
segmentor.load(segment_model_path)
segResult = segmentor.segment(sentence)
tmp = " ".join(segResult)
print(tmp)
# 2. 詞性標註
words = tmp.split(" ")
postagger = Postagger()
postagger.load(postagger_model_path)
postags = postagger.postag(words)
# 3. 句法分析
# 將詞性標註和分詞結果都加入到分析器進行句法解析
parser = Parser()
parser.load(parser_model_path)
arcs = parser.parse(words, postags)
arcLen = len(arcs)
conll = ""
# 構建Conll標準的數據結構
for i in xrange(arcLen):
if arcs[i].head == 0:
arcs[i].relation = "ROOT"
conll += "\t"+words[i]+"("+postags[i]+")"+"\t"+postags[i]+"\t"+str(arcs[i].head)+"\t"+arcs[i].relation+"\n"
print(conll)
# 使用nltk構建依存句法關係樹
conllTree = nltk.DependencyGraph(conll) # 轉換爲依存句法圖
tree = conllTree.tree() # 構建樹結構
tree.draw() # 顯示輸出樹
注:模型文件由於比較大,就沒有上傳,請下載後自行放在項目的data/ltp_models
目錄下。
- 運行結果:
(venv) E:\ComPython\NLPDemos>python lesson01/Parser.py
中國 南部 的 湖南省 , 省會 是 長沙市 , 也 是 一 座 世界 知名 的 城市 。
中國(ns) ns 2 ATT
南部(nd) nd 4 ATT
的(u) u 2 RAD
湖南省(ns) ns 7 SBV
,(wp) wp 4 WP
省會(n) n 7 SBV
是(v) v 0 ROOT
長沙市(ns) ns 7 VOB
,(wp) wp 7 WP
也(d) d 11 ADV
是(v) v 7 COO
一(m) m 13 ATT
座(q) q 17 ATT
世界(n) n 15 SBV
知名(a) a 17 ATT
的(u) u 15 RAD
城市(n) n 11 VOB
。(wp) wp 7 WP
- 依存句法關係樹:
本文Demo:Lesson01