目錄
今天是1024,首先,祝大家節日快樂!😊😊 …… 中文句法分析,先分析下面的一句話再進入正題哈哈(🙂🙂):博客技術交流加QQ羣:955817470
分析結果如下:
從分析結果我們可以看到每個詞的詞性以及句法結構,比如:交流和加這兩個詞構成了主謂關係(SBV),加和羣這兩個詞構成了動賓關係(VOB),通過該結果可以分析句子的組成成分等。這個其實就是依存句法分析的一個例子,接下來看正文 ……
一、中文句法分析內容概述
主要任務:
- 詞法分析:分句、分詞、詞性標註、命名實體識別
- 句法分析:依存句法分析
- 語義分析:語義角色標註、語義依存分析
1、分句
一般可以根據標點符號正則表達式進行分句。
2、分詞
中文分詞(Chinese Word Segmentation) 指的是將一個漢字序列切分成一個一個單獨的詞。分詞就是將連續的字序列按照一定的規範重新組合成詞序列的過程。
3、詞性標註
詞性(part-of-speech)是詞彙基本的語法屬性,通常也稱爲詞性。
詞性標註(part-of-speech tagging)又稱爲詞類標註或者簡稱標註,是指爲分詞結果中的每個單詞標註一個正確的詞性的程序,也即確定每個詞是名詞、動詞、形容詞或者其他詞性的過程。詞性標註是很多NLP任務的預處理步驟,如句法分析,經過詞性標註後的文本會帶來很大的便利性,但也不是不可或缺的步驟。
詞性標註主要可以分爲基於規則和基於統計的方法,下面列舉幾種統計方法:基於最大熵的詞性標註、基於統計最大概率輸出詞性、基於HMM的詞性標註。
詞性標註的應用:句法分析預處理、詞彙獲取預處理、信息抽取預處理。
4、命名實體識別
命名實體識別(Named Entity Recognition,NER)是將文本中的元素分成預先定義的類,如人名、地名、 機構名、時間、貨幣等等。作爲自然語言的承載信息單位,命名實體識別 屬於文本信息處理的基礎的研究領域,是信息抽取、信息檢索、機器翻譯、 問答系統等多種自然語言處理技術中必不可少的組成部分。
5、依存句法分析
依存語法 (Dependency Parsing, DP) 通過分析語言單位內成分之間的依存關係揭示其句法結構。 直觀來講,依存句法分析識別句子中的“主謂賓”、“定狀補”這些語法成分,並分析各成分之間的關係。
6、語義角色標註
語義角色標註(Semantic Role Labeling,SRL)是一種淺層的語義分析技術,標註句子中某些短語爲給定謂詞的論元 (語義角色) ,如施事、受事、時間和地點等。其能夠對問答系統、信息抽取和機器翻譯等應用產生推動作用。
7、語義依存分析
語義依存分析 (Semantic Dependency Parsing, SDP),分析句子各個語言單位之間的語義關聯,並將語義關聯以依存結構呈現。 使用語義依存刻畫句子語義,好處在於不需要去抽象詞彙本身,而是通過詞彙所承受的語義框架來描述該詞彙,而論元的數目相對詞彙來說數量總是少了很多的。
語義依存分析目標是跨越句子表層句法結構的束縛,直接獲取深層的語義信息。
二、使用LTP實現句法分析
1、LTP基礎
LTP提供了一系列中文自然語言處理工具,用戶可以使用這些工具對於中文文本進行分詞、詞性標註、句法分析等工作。
2、pyltp安裝
環境:Linux
準備:LTP模型下載
安裝pyltp:pip install pyltp
注:安裝成功之後,嘗試import pyltp,可能報錯:undefined symbol: _ZTISt19__codecvt_utf8_baseIwE
解決方法如下(參看方法):
cd ~/anaconda2/lib
rm libstdc++.so.6.0.19
ln -s /usr/lib/x86_64-linux-gnu/libstdc++.so.6 libstdc++.so.6.0.19
3、代碼實現
pyltp實現分句、分詞、詞性標註、命名實體識別、依存句法分析、語義角色標註,代碼如下(ltp_analyze.py):
#!/usr/bin/env python
# coding=utf-8
import importlib,sys
importlib.reload(sys)
import os
from pyltp import SentenceSplitter,Segmentor, Postagger, NamedEntityRecognizer, Parser,SementicRoleLabeller,CustomizedSegmentor
#分句
def sentence_split(text):
sents = SentenceSplitter.split(text) # 分句
print('\n'.join(sents))
class LtpModelAnalysis(object):
def __init__(self, model_dir="/mnt/f/model/ltp_model/ltp_data_v3.4.0/"):
self.segmentor = Segmentor()
self.segmentor.load(os.path.join(model_dir, "cws.model")) #加載分詞模型
#使用自定義詞典
#self.segmentor.load_with_lexicon(os.path.join(model_dir, "cws.model"), 'lexicon') # 加載分詞模型,第二個參數是外部詞典文件路徑
#使用個性化分詞模型 #pyltp支持使用用戶訓練好的個性化模型
#customized_segmentor = CustomizedSegmentor() # 初始化實例
#customized_segmentor.load(os.path.join(model_dir, "cws.model"), 'customized_model') # 加載模型,第二個參數是增量模型的路徑
#個性化分詞模型的同時也可以使用外部詞典
#customized_segmentor = CustomizedSegmentor() # 初始化實例
#customized_segmentor.load_with_lexicon(os.path.join(model_dir, "cws.model"), 'customized_model','lexicon')
self.postagger = Postagger()
self.postagger.load(os.path.join(model_dir, "pos.model")) #加載詞性標註模型
self.recognizer=NamedEntityRecognizer()
self.recognizer.load(os.path.join(model_dir, "ner.model")) #加載命名實體識別模型
self.parser = Parser()
self.parser.load(os.path.join(model_dir, "parser.model")) #加載依存句法分析模型
self.labeller=SementicRoleLabeller()
self.labeller.load(os.path.join(model_dir, "pisrl.model")) #加載語義角色標註模型
def analyze(self, text):
#分詞
words = self.segmentor.segment(text)
print( '\t'.join(words))
#詞性標註
postags = self.postagger.postag(words)
print( '\t'.join(postags))
#命名實體識別
netags = self.recognizer.recognize(words, postags) # 命名實體識別
print('\t'.join(netags))
#句法分析
arcs = self.parser.parse(words, postags)
print("\t".join("%d:%s" % (arc.head, arc.relation) for arc in arcs)) #arc.head 表示依存弧的父節點詞的索引,arc.relation 表示依存弧的關係。
arcs_list=[]
#語義角色標註
roles = self.labeller.label(words, postags, arcs) #arcs 使用依存句法分析的結果
for role in roles:
print(role.index, "".join(["%s:(%d,%d)" % (arg.name, arg.range.start, arg.range.end) for arg in role.arguments]))
def release_model(self):
# 釋放模型
self.segmentor.release()
self.postagger.release()
self.recognizer.release()
self.parser.release()
self.labeller.release()
if __name__ == '__main__':
text="你覺得我的博客寫的怎麼樣?進一步交流請加QQ羣:955817470"
ltp = LtpModelAnalysis()
ltp.analyze(text)
ltp.release_model()
#sentence_split(text)
分詞、詞性標註、命名實體識別、依存句法分析、語義角色標註運行結果如下:
(1)依存句法結果分析
2:SBV 0:HED 5:ATT 3:RAD 6:SBV 8:ATT 6:RAD 2:VOB 2:WP 11:ADV 2:COO 11:COO 12:VOB 15:ATT 13:VOB 15:WP 13:COO
arc.head
表示依存弧的父節點詞的索引。ROOT節點的索引是0,第一個詞開始的索引依次爲1、2、3…arc.relation
表示依存弧的關係。
(2)語音角色標註結果分析
1 A0:(0,0)A1:(2,7)
5 A1:(2,4)
10 ADV:(9,9)A1:(13,15)
11 A2:(12,16)
12 A1:(13,15)
- 第一個詞開始的索引依次爲0、1、2…
- 返回結果
roles
是關於多個謂詞的語義角色分析的結果。由於一句話中可能不含有語義角色,所以結果可能爲空。 role.index
代表謂詞的索引,role.arguments
代表關於該謂詞的若干語義角色。arg.name
表示語義角色類型,arg.range.start
表示該語義角色起始詞位置的索引,arg.range.end
表示該語義角色結束詞位置的索引。
4、LTP標註集參考
(1)詞性標註集
LTP 使用的是863詞性標註集,其各個詞性含義如下表
Tag | Description | Example | Tag | Description | Example |
---|---|---|---|---|---|
a | adjective | 美麗 | ni | organization name | 保險公司 |
b | other noun-modifier | 大型, 西式 | nl | location noun | 城郊 |
c | conjunction | 和, 雖然 | ns | geographical name | 北京 |
d | adverb | 很 | nt | temporal noun | 近日, 明代 |
e | exclamation | 哎 | nz | other proper noun | 諾貝爾獎 |
g | morpheme | 茨, 甥 | o | onomatopoeia | 嘩啦 |
h | prefix | 阿, 僞 | p | preposition | 在, 把 |
i | idiom | 百花齊放 | q | quantity | 個 |
j | abbreviation | 公檢法 | r | pronoun | 我們 |
k | suffix | 界, 率 | u | auxiliary | 的, 地 |
m | number | 一, 第一 | v | verb | 跑, 學習 |
n | general noun | 蘋果 | wp | punctuation | ,。! |
nd | direction noun | 右側 | ws | foreign words | CPU |
nh | person name | 杜甫, 湯姆 | x | non-lexeme | 萄, 翱 |
(2)命名實體識別標註集
LTP 採用 BIESO 標註體系。B 表示實體開始詞,I表示實體中間詞,E表示實體結束詞,S表示單獨成實體,O表示不構成命名實體。
LTP 提供的命名實體類型爲:人名(Nh)、地名(Ns)、機構名(Ni)
標記 | 含義 |
---|---|
O | 這個詞不是NE |
S | 這個詞單獨構成一個NE |
B | 這個詞爲一個NE的開始 |
I | 這個詞爲一個NE的中間 |
E | 這個詞位一個NE的結尾 |
(3)依存句法關係
關係類型 | Tag | Description | Example |
---|---|---|---|
主謂關係 | SBV | subject-verb | 我送她一束花 (我 <– 送) |
動賓關係 | VOB | 直接賓語,verb-object | 我送她一束花 (送 –> 花) |
間賓關係 | IOB | 間接賓語,indirect-object | 我送她一束花 (送 –> 她) |
前置賓語 | FOB | 前置賓語,fronting-object | 他什麼書都讀 (書 <– 讀) |
兼語 | DBL | double | 他請我吃飯 (請 –> 我) |
定中關係 | ATT | attribute | 紅蘋果 (紅 <– 蘋果) |
狀中結構 | ADV | adverbial | 非常美麗 (非常 <– 美麗) |
動補結構 | CMP | complement | 做完了作業 (做 –> 完) |
並列關係 | COO | coordinate | 大山和大海 (大山 –> 大海) |
介賓關係 | POB | preposition-object | 在貿易區內 (在 –> 內) |
左附加關係 | LAD | left adjunct | 大山和大海 (和 <– 大海) |
右附加關係 | RAD | right adjunct | 孩子們 (孩子 –> 們) |
獨立結構 | IS | independent structure | 兩個單句在結構上彼此獨立 |
核心關係 | HED | head | 指整個句子的核心 |
(4)語義角色類型
語義角色類型 | 說明 |
---|---|
ADV | adverbial, default tag ( 附加的,默認標記 ) |
BNE | beneficiary ( 受益人 ) |
CND | condition ( 條件 ) |
DIR | direction ( 方向 ) |
DGR | degree ( 程度 ) |
EXT | extent ( 擴展 ) |
FRQ | frequency ( 頻率 ) |
LOC | locative ( 地點 ) |
MNR | manner ( 方式 ) |
PRP | purpose or reason ( 目的或原因 ) |
TMP | temporal ( 時間 ) |
TPC | topic ( 主題 ) |
CRD | coordinated arguments ( 並列參數 ) |
PRD | predicate ( 謂語動詞 ) |
PSR | possessor ( 持有者 ) |
PSE | possessee ( 被持有 ) |