句法分析
句法分析是機器翻譯的核心資料結構,是對語言進行深層次了解的基石。
句法分析簡介
1.主要任務
識别句子中所包含的句法成分以及這些成分之間的關系,一般以句法樹來表示句法分析的結果。
2.主要難點
歧義
搜尋空間
3.句法分析分類
完全句法分析:企圖擷取整個句子的句法結構
部分句法分析:隻關注局部的一些成分
4.相關方法
基于規則
存在着文法規則覆寫有限、系統可遷移差等缺陷
基于統計(主流)
資料集與評測方法
資料集
與别的語言處理所需要的資料集不同,句法分析需要的是一種樹形的标注結構,又稱為樹庫,如下圖所示:
最常使用的樹庫為美國賓夕法尼亞大學的英文賓州樹庫PTB,中文樹庫則包括CTB、TCT和台灣中研院樹庫。
評測方法
主要任務是評測句法分析生成的樹結構與手工标記的樹結構之間的相似性程度。
1.滿意度:測試句法分析器是否适合或勝任某個特定的自然語言處理任務
2.效率:運作時間
主流的評測方法是PARSEVAL評測體系,主要考察準确率、召回率、交叉括号數。其中交叉括号表示分析得到的某一個短語的覆寫範圍與标準句法分析結果的某個短語的覆寫範圍存在交叉又不包含的關系,即構成一個交叉括号。
句法分析的常用方法
基于PCFG的句法分析
PCFG基于機率的短語結構分析方法,是一種上下文無關文法的擴充
PCFG處理的問題
1.計算分析樹的機率值
2.若一個句子有多個分析樹,依據機率進行排序
3.可用來進行句法排歧
PCFG五元組表示(X,V,S,R,P)(X,V,S,R,P)
1.XX是一個有限詞彙的集合(詞典),其元素稱為詞彙或終結符
2.VV是一個有限标注的集合,稱為非終結符
3.SS包含于VV,稱為文法的開始符号
4.RR是有序對(α,β)(α,β)的集合,也就是産生的規則集
5.PP表示每個産生規則的統計機率
PCFG運算表示
1.形式:A→α,PA→α,P
2.限制:∑αP(A→α)
基于最大間隔馬爾可夫網絡的句法分析
基于最大間隔馬爾可夫網絡的句法分析是一種判别式的句法分析方法,通過豐富特征來消除歧義。
判别函數:
其中Φ(x,y)Φ(x,y)表示與xx相對應的句法樹yy的特征向量,ww表示特征權重
基于CRF的句法分析
将句法分析作為序列标注問題來解決,可以使用CRF模型
也是判别式方法,需要融合大量特征
與PCFG的差別
1.機率計算方法和機率歸一化方法不同
2.CRF模型最大化的是句法樹的條件機率而非聯合機率
基于移進-歸約的句法分析模型
移進-規約法是一種自下而上的方法,操作的基本資料結構是堆棧。
主要操作(SS表示句法樹的根節點)
1.移進:從句子左端将一個終結符移至棧頂
2.歸約:根據規則,将棧頂的若幹字元替換為一個字元
3.接收:句子中所有詞都已入棧,且棧中隻剩下一個符号SS,則分析成功
4.拒絕:句子中所有詞都已入棧,且棧中并非隻有一個符号SS,也無法進行任何歸約操作,則分析失敗
使用Stanford Parser的PCFG算法實作句法分析
Stanford Parser
Stanford Parser是基于Java的,是以需要jdk環境
Stanford Parser是封裝在nltk庫中實作的,是以要先安裝nltk
需要下載下傳Stanford Parser的jar包:https://nlp.stanford.edu/software/lex-parser.shtml#Download
我的百度雲位址:連結:https://pan.baidu.com/s/1YkKZytQ84UqPKGQh4m77Ug
提取碼:9u1o
需要三個檔案:
stanford-parser-4.0.0-models.jar
stanford-parser.jar
chinesePCFG.ser.gz(中文句法分析)
注意:如果是英文句法分析,需要englishPCFG.ser.gz,而不是chinesePCFG.ser.gz
擷取上述三個檔案:解壓剛下載下傳的壓縮包(stanford-parser-4.0.0.zip),從中找到stanford-parser-4.0.0-models.jar和stanford-parser.jar檔案。再将stanford-parser-4.0.0-models.jar檔案解壓,chinesePCFG.ser.gz檔案就藏在stanford-parser-4.0.0-models.jar檔案中,一直單擊\edu\stanford\nlp\models\lexparser,就可以找到chinesePCFG.ser.gz檔案。
簡單示例
我們對“他騎自行車去了菜市場”進行句法分析。
分詞
這裡我們采用Jieba分詞,代碼如下:
######Jieba分詞######
import jieba
string='我愛NLP'
seg_list=jieba.cut(string,cut_all=False,HMM=True)
seg_str=' '.join(seg_list)
print(seg_str)
結果如下所示:
我 愛 NLP
PCFG句法分析
下面進行句法分析,代碼如下所示:
######PCFG句法分析######
from nltk.parse import stanford
import os
root='file/stanford-parser-4.0.0/'
parser_path=root+'stanford-parser.jar'
model_path=root+'stanford-parser-4.0.0-models.jar'
# 指定JDK路徑
if not os.environ.get('JAVA_HOME'):
JAVA_HOME = 'C:\Program Files\Java\jdk1.8.0_45'
os.environ['JAVA_HOME'] = JAVA_HOME
##PCFG模型路徑
pcfg_path='file/stanford-parser-4.0.0/edu/stanford/nlp/models/lexparser/chinesePCFG.ser.gz'
parser=stanford.StanfordParser(path_to_jar=parser_path,path_to_models_jar=model_path,model_path=pcfg_path)
sentence=parser.raw_parse(seg_str)
for line in sentence:
print(line)
line.draw()
ROOT:要處理文本的語句
IP:簡單從句
NP:名詞短語
VP:動詞短語
PN:代詞
VV:動詞
NN:常用名詞