天天看點

【NLP】LTP中文工具集使用

學習總結

上次的NLTK是英文工具集,LTP則是中文工具集。同樣能用于詞法分析(分詞、詞性标注、命名實體識别)、句法分析(依存句法分析)和語義分析(語義角色标注和語義依存分析)等。

文章目錄

  • ​​學習總結​​
  • ​​一、中文分詞​​
  • ​​二、分句和詞性标注​​
  • ​​三、命名實體識别任務​​
  • ​​四、依存句法分析​​
  • ​​五、語義依存分析​​
  • ​​5.1 樹​​
  • ​​5.2 圖​​
  • ​​Reference​​

一、中文分詞

中文詞語之間不像英語一樣,沒有空格進行分割,NLP一般以詞為最小處理機關,需要對中文分詞處理。

# -*- coding: utf-8 -*-
"""
Created on Fri Nov 26 22:06:23 2021

@author: 86493
"""
from ltp import LTP
# 預設加載small模型,首次使用時會自動下載下傳并加載模型
ltp = LTP()

# 對句子進行分詞,結果使用segment通路
# hidden用于通路每個詞的隐含層向量,用于後續分析步驟 
segment, hidden = ltp.seg(["南京市長江大橋。"])

# LTP能夠獲得正确的分詞結果,如不會分詞為:南京,市長
print(segment)      

LTP能夠獲得正确的分詞結果,如不會分詞為:南京,市長,結果為:

[['南京市', '長江大橋', '。']]      

二、分句和詞性标注

分詞:

# 分詞
segment, hidden = ltp.seg(sentences)
print(segment)      
# [['南京市', '長江大橋', '。'], ['湯姆', '生病', '了', '。'], 
# ['他', '去', '了', '醫院', '。']]      

詞性标注:

# 詞性标注 
pos_tags = ltp.pos(hidden)
print(pos_tags)      
# [['ns', 'ns', 'wp'], ['nh', 'v', 'u', 'wp'], 
# ['r', 'v', 'u', 'n', 'wp']]      

三、命名實體識别任務

from ltp import LTP

ltp = LTP()

seg, hidden = ltp.seg(["他叫湯姆去拿外衣。"])
ner = ltp.ner(hidden)
# [['他', '叫', '湯姆', '去', '拿', '外衣', '。']]
# [[('Nh', 2, 2)]]

tag, start, end = ner[0][0]
print(tag,":", "".join(seg[0][start:end + 1]))
# Nh : 湯姆      

四、依存句法分析

注意:在依存句法當中,虛節點ROOT占據了0位置,是以節點的下标從1開始。

from ltp import LTP

ltp = LTP()

seg, hidden = ltp.seg(["他叫湯姆去拿外衣。"])
dep = ltp.dep(hidden)
print(dep)      

結果:

# [['他', '叫', '湯姆', '去', '拿', '外衣', '。']]
# [
#     [
#         (1, 2, 'SBV'),
#         (2, 0, 'HED'),    # 叫 --|HED|--> ROOT
#         (3, 2, 'DBL'),
#         (4, 2, 'VOB'),
#         (5, 4, 'COO'),
#         (6, 5, 'VOB'),
#         (7, 2, 'WP')
#     ]
# ]      

(1)上面結果的第1、2行為例:​

​(1, 2, 'SBV')​

​​,​

​(2, 0, 'HED')​

​,依存句法樹會有預設的虛拟root節點,其索引為0,分詞後的索引是從1開始的:

湯姆 外衣
1 2 3 4 5 6

(2)第二行的​

​(2, 0, 'HED')​

​​第二列為0,代表索引為2的結點(叫)的父節點是索引為0的虛拟root節點。

(3)第一行的​​

​(1, 2, 'SBV')​

​​的​

​SBV​

​是表示兩個節點的依存關系是主謂關系,即“叫”和“他”是主謂關系。

五、語義依存分析

5.1 樹

from ltp import LTP

ltp = LTP()

seg, hidden = ltp.seg(["他叫湯姆去拿外衣。"])
sdp = ltp.sdp(hidden, mode='tree')      
# [['他', '叫', '湯姆', '去', '拿', '外衣', '。']]
# [
#     [
#         (1, 2, 'Agt'),
#         (2, 0, 'Root'),   # 叫 --|Root|--> ROOT
#         (3, 2, 'Datv'),
#         (4, 2, 'eEfft'),
#         (5, 4, 'eEfft'),
#         (6, 5, 'Pat'),
#         (7, 2, 'mPunc')
#     ]
# ]      

5.2 圖

from ltp import LTP

ltp = LTP()

seg, hidden = ltp.seg(["他叫湯姆去拿外衣。"])
sdp = ltp.sdp(hidden, mode='graph')      
# [['他', '叫', '湯姆', '去', '拿', '外衣', '。']]
# [
#     [
#         (1, 2, 'Agt'),
#         (2, 0, 'Root'),   # 叫 --|Root|--> ROOT
#         (3, 2, 'Datv'),
#         (3, 4, 'Agt'),
#         (3, 5, 'Agt'),
#         (4, 2, 'eEfft'),
#         (5, 4, 'eEfft'),
#         (6, 5, 'Pat'),
#         (7, 2, 'mPunc')
#     ]
# ]      

Reference

繼續閱讀