中文句法分析及LTP使用

目錄

一、中文句法分析內容概述

二、使用LTP實現句法分析

1、LTP基礎

2、pyltp安裝

3、代碼實現

4、LTP標註集參考


今天是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提供了一系列中文自然語言處理工具,用戶可以使用這些工具對於中文文本進行分詞、詞性標註、句法分析等工作。

LTP官網  ;LTP GitHub ;pyltp使用教程

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 ( 被持有 )

 

Asia-Lee的博客

句法分析可視化軟件 

騰訊文智中文語義平臺

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章