介紹
LTP(Language Technology Platform)為中文語言技術平台,是哈工大社會計算與信息檢索研究中心開發的一整套中文語言處理系統。LTP制定了基於XML的語言處理結果表示,並在此基礎上提供了一整套自底向上的豐富而且高效的中文語言處理模塊(包括詞法、句法、語義等6項中文處理核心技術),以及基於動態鏈接庫(Dynamic Link Library,DLL)的應用程序接口,可視化工具,並且能夠以網絡服務的形式進行使用。
LTP開發文檔:
https://ltp.readthedocs.io/zh_CN/latest/index.html
語言雲LTP-Cloud:
http://www.ltp-cloud.com/
模型下載地址:
http://ltp.ai/download.html
安裝
下面介紹 Windows10 Python 環境下 LTP 的擴展包 pyltp 安裝過程。
1.常見錯誤
大家通常會調用 “pip install pyltp” 安裝該擴展包,但會遇到各種錯誤,下面介紹一種可行的方法。
2.安裝pyltp包
首先,安裝Python3.6環境,如下圖所示“python-3.6.7-amd64.exe”。
接着,下載pyltp擴展包的whl文件至本地,調用CMD環境進行安裝,注意需要將所在文件的路徑寫清楚。
pyltp-0.2.1-cp35-cp35m-win_amd64.whl(對應Python3.5版本)
pyltp-0.2.1-cp36-cp36m-win_amd64.whl(對應Python3.6版本)
1 pip install C:Python36spyltp-0.2.1-cp36-cp36m-win_amd64.whl
安裝pyltp時遇到的錯誤 ===>> https://www.cnblogs.com/huangm1314/p/11320553.html
3.下載模型文件
七牛雲
http://ltp.ai/download.html
pyltp的使用
分句 - SentenceSplitter
1 from pyltp import SentenceSplitter 2 sentence = SentenceSplitter.split('我是風兒,你是傻。纏纏綿綿到天涯!') 3 print(sentence) 4 print('\n'.join(sentence))
輸出:
1 <pyltp.VectorOfString object at 0x000001C4B3C27570> 2 我是風兒,你是傻。 3 纏纏綿綿到天涯!
分詞 - Segmentor
1 from pyltp import Segmentor 2 import os 3 LTP_MODEL_DIR = 'F:\ltp_data_v3.4.0\ltp_data_v3.4.0' 4 cws_model = os.path.join(LTP_MODEL_DIR, 'cws.model') 5 6 segmentor = Segmentor() # 初始化實例 7 segmentor.load(cws_model) # 加載模型 8 words = segmentor.segment('歐幾里得是西元前三世紀的希臘數學家。') # 分詞 9 print('分詞', words) 10 print(' '.join(words)) 11 segmentor.release() # 釋放模型
分詞結果如下:
1 分詞 <pyltp.VectorOfString object at 0x000001CDB6717570> 2 歐 幾 里 得 是 西元前 三 世紀 的 希臘 數學家 。
pyltp分詞支持用戶使用自定義詞典。分詞外部詞典本身是一個文本文件,每行指定一個詞,編碼須為 UTF-8,樣例如下所示:
1 歐幾里得 2 亞里士多德
使用自定義詞典進行分詞的模型加載方式如下:
1 segmentor = Segmentor() # 初始化實例 2 segmentor.load_with_lexicon(cws_model, './word_dic.txt') # 加載模型 3 words = segmentor.segment('歐幾里得是西元前三世紀的希臘數學家。') # 分詞 4 print('分詞', words) 5 print(' '.join(words)) 6 segmentor.release() # 釋放模型
自定義詞典,分詞結果如下,分詞效果明顯得到改善。
1 分詞 <pyltp.VectorOfString object at 0x0000027657917570> 2 [INFO] 2019-08-08 21:44:53 loaded 2 lexicon entries 3 歐幾里得 是 西元前 三 世紀 的 希臘 數學家 。
詞性標注 - Postagger
1 from pyltp import Postagger 2 import os 3 LTP_MODEL_DIR = 'F:\ltp_data_v3.4.0\ltp_data_v3.4.0' 4 pos_model = os.path.join(LTP_MODEL_DIR, 'pos.model') 5 6 postagger = Postagger() # 初始化實例 7 postagger.load(pos_model) # 加載模型 8 9 words = ['歐幾里得','是','西元前','三','世紀','的','希臘','數學家','。'] 10 postags = postagger.postag(words) 11 12 for word,pos in zip(words, postags): 13 print(word,pos) 14 postagger.release() # 釋放模型
詞性標注結果如下:
nh v nt m n u ns n wp
# 歐幾里得 - nh - 人名 # 是 - v - 動詞 # 西元前 - nt - 時間名詞 # 三 - m - 數字 # 世紀 - n - 普通名詞 # 的 - u - 助詞 # 希臘 - ns - 地理名詞 # 數學家- n - 普通名詞 # 。 - wp - 標點符號
更多的詞性含義:
命名實體識別 - NamedEntityRecognizer
1 from pyltp import NamedEntityRecognizer 2 import os 3 LTP_MODEL_DIR = 'F:\ltp_data_v3.4.0\ltp_data_v3.4.0' 4 5 ner_model = os.path.join(LTP_MODEL_DIR, 'ner.model') 6 7 recognizer = NamedEntityRecognizer() # 初始化實例 8 recognizer.load(ner_model) #加載模型 9 10 words = ['歐幾里得', '是', '西元前', '三', '世紀', '的', '希臘', '數學家', '。'] 11 postags = ['nh', 'v', 'nt', 'm', 'n', 'u', 'ns', 'n', 'wp'] 12 13 nertags = recognizer.recognize(words, postags) 14 15 print(' '.join(nertags)) 16 recognizer.release() # 釋放模型
命名實體結果如下,ltp命名實體類型為:人名(Nh),地名(NS),機構名(Ni);ltp采用BIESO標注體系。B表示實體開始詞,I表示實體中間詞,E表示實體結束詞,S表示單獨成實體,O表示不構成實體。
1 S-Nh O O O O O S-Ns O O 2 # 歐幾里得 - S-Nh - 人名 3 # 希臘 - S-Ns - 地名
依存句法分析 - Parser
1 from pyltp import Parser 2 import os 3 LTP_MODEL_DIR = 'F:\ltp_data_v3.4.0\ltp_data_v3.4.0' 4 5 par_model = os.path.join(LTP_MODEL_DIR, 'parser.model') #依存句法分析模型路徑,模型名稱為`parser.model 6 7 parser = Parser() # 初始化實例 8 parser.load(par_model) # 加載模型 9 10 words = ['歐幾里得', '是', '西元前', '三', '世紀', '的', '希臘', '數學家', '。'] 11 postags = ['nh', 'v', 'nt', 'm', 'n', 'u', 'ns', 'n', 'wp'] 12 arcs = parser.parse(words, postags) # 句法分析 13 14 rely_id = [arc.head for arc in arcs] # 提取依存父節點id 15 relation = [arc.relation for arc in arcs] # 提取依存關系 16 heads = ['Root' if id == 0 else words[id - 1] for id in rely_id] 17 18 for i in range(len(words)): 19 print(f'{relation[i]}->({words[i]},{heads[i]})') 20 parser.release()
依存句法分析,輸出結果如下:
1 SBV(歐幾里得, 是) 2 HED(是, Root) 3 ATT(西元前, 世紀) 4 ATT(三, 世紀) 5 ATT(世紀, 數學家) 6 RAD(的, 世紀) 7 ATT(希臘, 數學家) 8 VOB(數學家, 是) 9 WP(。, 是)
更多關於依存句法:
語義角色標注
1 import os 2 LTP_DATA_DIR = '/path/to/your/ltp_data' # ltp模型目錄的路徑 3 srl_model_path = os.path.join(LTP_DATA_DIR, 'srl') # 語義角色標注模型目錄路徑,模型目錄為`srl`。注意該模型路徑是一個目錄,而不是一個文件。 4 5 from pyltp import SementicRoleLabeller 6 labeller = SementicRoleLabeller() # 初始化實例 7 labeller.load(srl_model_path) # 加載模型 8 9 words = ['元芳', '你', '怎么', '看'] 10 postags = ['nh', 'r', 'r', 'v'] 11 # arcs 使用依存句法分析的結果 12 roles = labeller.label(words, postags, arcs) # 語義角色標注 13 14 # 打印結果 15 for role in roles: 16 print role.index, "".join( 17 ["%s:(%d,%d)" % (arg.name, arg.range.start, arg.range.end) for arg in role.arguments]) 18 labeller.release() # 釋放模型
結果如下:
1 3 A0:(0,0)A0:(1,1)ADV:(2,2)
第一個詞開始的索引依次為0、1、2…
返回結果 roles
是關於多個謂詞的語義角色分析的結果。由於一句話中可能不含有語義角色,所以結果可能為空。
role.index
代表謂詞的索引, role.arguments
代表關於該謂詞的若干語義角色。
arg.name
表示語義角色類型,arg.range.start
表示該語義角色起始詞位置的索引,arg.range.end
表示該語義角色結束詞位置的索引。
例如上面的例子,由於結果輸出一行,所以“元芳你怎么看”有一組語義角色。 其謂詞索引為3,即“看”。這個謂詞有三個語義角色,范圍分別是(0,0)即“元芳”,(1,1)即“你”,(2,2)即“怎么”,類型分別是A0、A0、ADV。
arg.name
表示語義角色關系,arg.range.start
表示起始詞位置,arg.range.end
表示結束位置。
更多語義角色模型如下:
參考文檔: