生成式句法分析指的是,生成一系列依存句法樹,從它們中用特定算法挑出機率最大那一棵。句法分析中,生成模型的構建主要使用三類信息:詞性信息、詞彙信息和結構信息。前二類很好理解,而結構信息須要特殊語法標記,不作考慮。算法
本文主要利用了詞彙+詞性生成聯合機率模型,使用最大生成樹Prim算法搜索最終結果,獲得了一個簡單的漢語依存句法分析器。網絡
開源項目工具
本文代碼已集成到HanLP中開源:http://hanlp.dksou.com/測試
基本思路spa
統計詞語WordA與詞語WordB構成依存關係DrC的頻次,詞語WordA與詞性TagB構成依存關係DrD的頻次,詞性TagA與詞語WordB構成依存關係DrE的頻次,詞性TagA與詞詞性TagB構成依存關係DrF的頻次。爲句子中詞語i與詞語j生成多條依存句法邊,其權值爲上述四種頻次的綜合(主要利用詞-詞頻次,其他的做平滑處理用)。取邊的權值最大的做爲惟一的邊,加入有向圖中。3d
在有向圖上使用Prim最大生成樹算法,計算出最大生成樹,格式化輸出。blog
模型訓練博客
簡單地統計一下清華大學語義依存網絡語料,獲得以下結果:可視化
@符號鏈接起兩個詞彙或詞性,用<>括起來的表示詞性,不然是詞彙。若是@後面沒有內容,則表示頻次,不然表示一些依存關係與其出現的頻次。搜索
依存句法分析
分詞標註
以「我吃米飯」爲例,先進行分詞與詞性標註,結果:
生成有向圖
因爲依存句法樹中有虛根的存在,因此爲其加入一個虛節點,這樣一共有四個節點:
每一個節點都與另外三個構成一條有向邊,一共4 * 3 = 12 條:
其中「未知」表示邊不存在,「受事」「施事」表示依存關係,後面的小數表示權值。我對機率取了負對數,因此接下來用加法求最小生成樹便可。
最小生成樹
關於最小生成樹的Prim算法請參考《最小生成樹算法初步》,這裏必須有所改動,因爲虛根有且只能有一個孩子,因此虛根必須單獨計算:
而後就是中規中矩的Prim算法:
得出最小生成樹:
格式化輸出
將其轉爲CoNLL格式輸出:
可視化
使用可視化工具展示出來:
結果評測
我沒有進行嚴格的測試,這只是一個玩具級別的漢語依存句法分析器。先來看幾個good case與bad case——
效果比較馬虎,爲什麼這麼說,這是由於分詞的訓練語料和句法分析語料不一樣,且我自知此方法嚴重依賴詞彙共現,主要是這種二元詞彙生成模型沒法充分利用上下文。
短一點的搜索語句可能仍是有微量的利用價值。
TODO
應當採用判別式模型,導入SVM或最大熵做爲權值的計算工具,而後使用最大生成樹算法獲取全局最優解。
文章轉載自hankcs 的博客