放牧代码和思想
专注自然语言处理、机器学习算法
    愛しさ 優しさ すべて投げ出してもいい

最大熵依存句法分析器的实现

目录

这是一个判决式汉语句法分析器的Java实现,基于最大熵模型和最大生成树模型,实现了中文依存句法的自动分析,分析速度达到 570.7句/秒。

开源项目

本文代码已集成到HanLP中开源:http://www.hankcs.com/nlp/hanlp.html

判别式的分析方法

该方法采用条件概率模型,将所有依存关系概率的累积作为目标函数的score,取score最大的依存关系树作为输出。

参考刘群老师的讲义:

依存分析模型.png

最大生成树模型

最大生成树模型(maximum spanning trees, MST) 定义整棵句法树的打分是树中各条边打分的加权和:

s 表示打分值,y 是句子x 的一棵依存树, (i, j)是y中的两个单词构成的一条边(依存关系),f是取值为 1 或 0 的高维二元特征函数向量,表示结点xi 和 xj 之间是否存在依存关系。w 是特征 f(i,j)的权值向量,w在确定了特征后由样本训练得到。

最大熵模型

最大熵模型的简介以及Java实现请参考《最大熵的Java实现》,这里将最大熵模型作为衡量一条依存关系存在的概率的工具。

训练模型

最大熵的特征选取

对训练集中的任意一个句子的单词集合(包括虚根),取出任意两个单词(i,j),将(i,j)的依存关系作为事件名(即使它们之间没有依存关系,也取“null”作为事件名),将i和j自身以及周围的环境选取为特征,如下表所示:

W表示单词本身,P表示词性,Dis表示i和j的距离,有正负之分,加号表示组合多种特征。

举个例子说明,对于熟语料:

1	坚决	坚决	a	ad	_	2	方式	
2	惩治	惩治	v	v	_	0	核心成分	
3	贪污	贪污	v	v	_	7	限定	
4	贿赂	贿赂	n	n	_	3	连接依存	
5	等	等	u	udeng	_	3	连接依存	
6	经济	经济	n	n	_	7	限定	
7	犯罪	犯罪	v	vn	_	2	受事

得出下列训练文件:

##空白##i-2 nulli-2 ##空白##i-1 nulli-1 ##核心##i0 rooti0 坚决i1 adi1 惩治i2 vi2 ##空白##j-2 nullj-2 ##核心##j-1 rootj-1 坚决j0 adj0 惩治j1 vj1 贪污j2 vj2 ##核心##→坚决 root→ad ##核心##→坚决-1 root→ad-1 ##空白##@##核心##→坚决 ##核心##→##核心##@坚决 null@root→ad root→root@ad null
##空白##i-2 nulli-2 ##空白##i-1 nulli-1 ##核心##i0 rooti0 坚决i1 adi1 惩治i2 vi2 ##核心##j-2 rootj-2 坚决j-1 adj-1 惩治j0 vj0 贪污j1 vj1 贿赂j2 nj2 ##核心##→惩治 root→v ##核心##→惩治-2 root→v-2 ##空白##@##核心##→惩治 ##核心##→坚决@惩治 null@root→v root→ad@v null
##空白##i-2 nulli-2 ##空白##i-1 nulli-1 ##核心##i0 rooti0 坚决i1 adi1 惩治i2 vi2 坚决j-2 adj-2 惩治j-1 vj-1 贪污j0 vj0 贿赂j1 nj1 等j2 udengj2 ##核心##→贪污 root→v ##核心##→贪污-3 root→v-3 ##空白##@##核心##→贪污 ##核心##→惩治@贪污 null@root→v root→v@v null
##空白##i-2 nulli-2 ##空白##i-1 nulli-1 ##核心##i0 rooti0 坚决i1 adi1 惩治i2 vi2 惩治j-2 vj-2 贪污j-1 vj-1 贿赂j0 nj0 等j1 udengj1 经济j2 nj2 ##核心##→贿赂 root→n ##核心##→贿赂-4 root→n-4 ##空白##@##核心##→贿赂 ##核心##→贪污@贿赂 null@root→n root→v@n null
##空白##i-2 nulli-2 ##空白##i-1 nulli-1 ##核心##i0 rooti0 坚决i1 adi1 惩治i2 vi2 贪污j-2 vj-2 贿赂j-1 nj-1 等j0 udengj0 经济j1 nj1 犯罪j2 vnj2 ##核心##→等 root→udeng ##核心##→等-5 root→udeng-5 ##空白##@##核心##→等 ##核心##→贿赂@等 null@root→udeng root→n@udeng null
##空白##i-2 nulli-2 ##空白##i-1 nulli-1 ##核心##i0 rooti0 坚决i1 adi1 惩治i2 vi2 贿赂j-2 nj-2 等j-1 udengj-1 经济j0 nj0 犯罪j1 vnj1 ##空白##j2 nullj2 ##核心##→经济 root→n ##核心##→经济-6 root→n-6 ##空白##@##核心##→经济 ##核心##→等@经济 null@root→n root→udeng@n null
##空白##i-2 nulli-2 ##空白##i-1 nulli-1 ##核心##i0 rooti0 坚决i1 adi1 惩治i2 vi2 等j-2 udengj-2 经济j-1 nj-1 犯罪j0 vnj0 ##空白##j1 nullj1 ##空白##j2 nullj2 ##核心##→犯罪 root→vn ##核心##→犯罪-7 root→vn-7 ##空白##@##核心##→犯罪 ##核心##→经济@犯罪 null@root→vn root→n@vn null
##空白##i-2 nulli-2 ##核心##i-1 rooti-1 坚决i0 adi0 惩治i1 vi1 贪污i2 vi2 ##空白##j-2 nullj-2 ##空白##j-1 nullj-1 ##核心##j0 rootj0 坚决j1 adj1 惩治j2 vj2 坚决→##核心## ad→root 坚决→##核心##1 ad→root1 ##核心##@坚决→##核心## 坚决→##空白##@##核心## root@ad→root ad→null@root null
##空白##i-2 nulli-2 ##核心##i-1 rooti-1 坚决i0 adi0 惩治i1 vi1 贪污i2 vi2 ##核心##j-2 rootj-2 坚决j-1 adj-1 惩治j0 vj0 贪污j1 vj1 贿赂j2 nj2 坚决→惩治 ad→v 坚决→惩治-1 ad→v-1 ##核心##@坚决→惩治 坚决→坚决@惩治 root@ad→v ad→ad@v 方式
##空白##i-2 nulli-2 ##核心##i-1 rooti-1 坚决i0 adi0 惩治i1 vi1 贪污i2 vi2 坚决j-2 adj-2 惩治j-1 vj-1 贪污j0 vj0 贿赂j1 nj1 等j2 udengj2 坚决→贪污 ad→v 坚决→贪污-2 ad→v-2 ##核心##@坚决→贪污 坚决→惩治@贪污 root@ad→v ad→v@v null
##空白##i-2 nulli-2 ##核心##i-1 rooti-1 坚决i0 adi0 惩治i1 vi1 贪污i2 vi2 惩治j-2 vj-2 贪污j-1 vj-1 贿赂j0 nj0 等j1 udengj1 经济j2 nj2 坚决→贿赂 ad→n 坚决→贿赂-3 ad→n-3 ##核心##@坚决→贿赂 坚决→贪污@贿赂 root@ad→n ad→v@n null
##空白##i-2 nulli-2 ##核心##i-1 rooti-1 坚决i0 adi0 惩治i1 vi1 贪污i2 vi2 贪污j-2 vj-2 贿赂j-1 nj-1 等j0 udengj0 经济j1 nj1 犯罪j2 vnj2 坚决→等 ad→udeng 坚决→等-4 ad→udeng-4 ##核心##@坚决→等 坚决→贿赂@等 root@ad→udeng ad→n@udeng null
##空白##i-2 nulli-2 ##核心##i-1 rooti-1 坚决i0 adi0 惩治i1 vi1 贪污i2 vi2 贿赂j-2 nj-2 等j-1 udengj-1 经济j0 nj0 犯罪j1 vnj1 ##空白##j2 nullj2 坚决→经济 ad→n 坚决→经济-5 ad→n-5 ##核心##@坚决→经济 坚决→等@经济 root@ad→n ad→udeng@n null
##空白##i-2 nulli-2 ##核心##i-1 rooti-1 坚决i0 adi0 惩治i1 vi1 贪污i2 vi2 等j-2 udengj-2 经济j-1 nj-1 犯罪j0 vnj0 ##空白##j1 nullj1 ##空白##j2 nullj2 坚决→犯罪 ad→vn 坚决→犯罪-6 ad→vn-6 ##核心##@坚决→犯罪 坚决→经济@犯罪 root@ad→vn ad→n@vn null
##核心##i-2 rooti-2 坚决i-1 adi-1 惩治i0 vi0 贪污i1 vi1 贿赂i2 ni2 ##空白##j-2 nullj-2 ##空白##j-1 nullj-1 ##核心##j0 rootj0 坚决j1 adj1 惩治j2 vj2 惩治→##核心## v→root 惩治→##核心##2 v→root2 坚决@惩治→##核心## 惩治→##空白##@##核心## ad@v→root v→null@root 核心成分
##核心##i-2 rooti-2 坚决i-1 adi-1 惩治i0 vi0 贪污i1 vi1 贿赂i2 ni2 ##空白##j-2 nullj-2 ##核心##j-1 rootj-1 坚决j0 adj0 惩治j1 vj1 贪污j2 vj2 惩治→坚决 v→ad 惩治→坚决1 v→ad1 坚决@惩治→坚决 惩治→##核心##@坚决 ad@v→ad v→root@ad null
##核心##i-2 rooti-2 坚决i-1 adi-1 惩治i0 vi0 贪污i1 vi1 贿赂i2 ni2 坚决j-2 adj-2 惩治j-1 vj-1 贪污j0 vj0 贿赂j1 nj1 等j2 udengj2 惩治→贪污 v→v 惩治→贪污-1 v→v-1 坚决@惩治→贪污 惩治→惩治@贪污 ad@v→v v→v@v null
##核心##i-2 rooti-2 坚决i-1 adi-1 惩治i0 vi0 贪污i1 vi1 贿赂i2 ni2 惩治j-2 vj-2 贪污j-1 vj-1 贿赂j0 nj0 等j1 udengj1 经济j2 nj2 惩治→贿赂 v→n 惩治→贿赂-2 v→n-2 坚决@惩治→贿赂 惩治→贪污@贿赂 ad@v→n v→v@n null
##核心##i-2 rooti-2 坚决i-1 adi-1 惩治i0 vi0 贪污i1 vi1 贿赂i2 ni2 贪污j-2 vj-2 贿赂j-1 nj-1 等j0 udengj0 经济j1 nj1 犯罪j2 vnj2 惩治→等 v→udeng 惩治→等-3 v→udeng-3 坚决@惩治→等 惩治→贿赂@等 ad@v→udeng v→n@udeng null
##核心##i-2 rooti-2 坚决i-1 adi-1 惩治i0 vi0 贪污i1 vi1 贿赂i2 ni2 贿赂j-2 nj-2 等j-1 udengj-1 经济j0 nj0 犯罪j1 vnj1 ##空白##j2 nullj2 惩治→经济 v→n 惩治→经济-4 v→n-4 坚决@惩治→经济 惩治→等@经济 ad@v→n v→udeng@n null
##核心##i-2 rooti-2 坚决i-1 adi-1 惩治i0 vi0 贪污i1 vi1 贿赂i2 ni2 等j-2 udengj-2 经济j-1 nj-1 犯罪j0 vnj0 ##空白##j1 nullj1 ##空白##j2 nullj2 惩治→犯罪 v→vn 惩治→犯罪-5 v→vn-5 坚决@惩治→犯罪 惩治→经济@犯罪 ad@v→vn v→n@vn null
坚决i-2 adi-2 惩治i-1 vi-1 贪污i0 vi0 贿赂i1 ni1 等i2 udengi2 ##空白##j-2 nullj-2 ##空白##j-1 nullj-1 ##核心##j0 rootj0 坚决j1 adj1 惩治j2 vj2 贪污→##核心## v→root 贪污→##核心##3 v→root3 惩治@贪污→##核心## 贪污→##空白##@##核心## v@v→root v→null@root null
坚决i-2 adi-2 惩治i-1 vi-1 贪污i0 vi0 贿赂i1 ni1 等i2 udengi2 ##空白##j-2 nullj-2 ##核心##j-1 rootj-1 坚决j0 adj0 惩治j1 vj1 贪污j2 vj2 贪污→坚决 v→ad 贪污→坚决2 v→ad2 惩治@贪污→坚决 贪污→##核心##@坚决 v@v→ad v→root@ad null
坚决i-2 adi-2 惩治i-1 vi-1 贪污i0 vi0 贿赂i1 ni1 等i2 udengi2 ##核心##j-2 rootj-2 坚决j-1 adj-1 惩治j0 vj0 贪污j1 vj1 贿赂j2 nj2 贪污→惩治 v→v 贪污→惩治1 v→v1 惩治@贪污→惩治 贪污→坚决@惩治 v@v→v v→ad@v null
坚决i-2 adi-2 惩治i-1 vi-1 贪污i0 vi0 贿赂i1 ni1 等i2 udengi2 惩治j-2 vj-2 贪污j-1 vj-1 贿赂j0 nj0 等j1 udengj1 经济j2 nj2 贪污→贿赂 v→n 贪污→贿赂-1 v→n-1 惩治@贪污→贿赂 贪污→贪污@贿赂 v@v→n v→v@n null
坚决i-2 adi-2 惩治i-1 vi-1 贪污i0 vi0 贿赂i1 ni1 等i2 udengi2 贪污j-2 vj-2 贿赂j-1 nj-1 等j0 udengj0 经济j1 nj1 犯罪j2 vnj2 贪污→等 v→udeng 贪污→等-2 v→udeng-2 惩治@贪污→等 贪污→贿赂@等 v@v→udeng v→n@udeng null
坚决i-2 adi-2 惩治i-1 vi-1 贪污i0 vi0 贿赂i1 ni1 等i2 udengi2 贿赂j-2 nj-2 等j-1 udengj-1 经济j0 nj0 犯罪j1 vnj1 ##空白##j2 nullj2 贪污→经济 v→n 贪污→经济-3 v→n-3 惩治@贪污→经济 贪污→等@经济 v@v→n v→udeng@n null
坚决i-2 adi-2 惩治i-1 vi-1 贪污i0 vi0 贿赂i1 ni1 等i2 udengi2 等j-2 udengj-2 经济j-1 nj-1 犯罪j0 vnj0 ##空白##j1 nullj1 ##空白##j2 nullj2 贪污→犯罪 v→vn 贪污→犯罪-4 v→vn-4 惩治@贪污→犯罪 贪污→经济@犯罪 v@v→vn v→n@vn 限定
惩治i-2 vi-2 贪污i-1 vi-1 贿赂i0 ni0 等i1 udengi1 经济i2 ni2 ##空白##j-2 nullj-2 ##空白##j-1 nullj-1 ##核心##j0 rootj0 坚决j1 adj1 惩治j2 vj2 贿赂→##核心## n→root 贿赂→##核心##4 n→root4 贪污@贿赂→##核心## 贿赂→##空白##@##核心## v@n→root n→null@root null
惩治i-2 vi-2 贪污i-1 vi-1 贿赂i0 ni0 等i1 udengi1 经济i2 ni2 ##空白##j-2 nullj-2 ##核心##j-1 rootj-1 坚决j0 adj0 惩治j1 vj1 贪污j2 vj2 贿赂→坚决 n→ad 贿赂→坚决3 n→ad3 贪污@贿赂→坚决 贿赂→##核心##@坚决 v@n→ad n→root@ad null
惩治i-2 vi-2 贪污i-1 vi-1 贿赂i0 ni0 等i1 udengi1 经济i2 ni2 ##核心##j-2 rootj-2 坚决j-1 adj-1 惩治j0 vj0 贪污j1 vj1 贿赂j2 nj2 贿赂→惩治 n→v 贿赂→惩治2 n→v2 贪污@贿赂→惩治 贿赂→坚决@惩治 v@n→v n→ad@v null
惩治i-2 vi-2 贪污i-1 vi-1 贿赂i0 ni0 等i1 udengi1 经济i2 ni2 坚决j-2 adj-2 惩治j-1 vj-1 贪污j0 vj0 贿赂j1 nj1 等j2 udengj2 贿赂→贪污 n→v 贿赂→贪污1 n→v1 贪污@贿赂→贪污 贿赂→惩治@贪污 v@n→v n→v@v 连接依存
惩治i-2 vi-2 贪污i-1 vi-1 贿赂i0 ni0 等i1 udengi1 经济i2 ni2 贪污j-2 vj-2 贿赂j-1 nj-1 等j0 udengj0 经济j1 nj1 犯罪j2 vnj2 贿赂→等 n→udeng 贿赂→等-1 n→udeng-1 贪污@贿赂→等 贿赂→贿赂@等 v@n→udeng n→n@udeng null
惩治i-2 vi-2 贪污i-1 vi-1 贿赂i0 ni0 等i1 udengi1 经济i2 ni2 贿赂j-2 nj-2 等j-1 udengj-1 经济j0 nj0 犯罪j1 vnj1 ##空白##j2 nullj2 贿赂→经济 n→n 贿赂→经济-2 n→n-2 贪污@贿赂→经济 贿赂→等@经济 v@n→n n→udeng@n null
惩治i-2 vi-2 贪污i-1 vi-1 贿赂i0 ni0 等i1 udengi1 经济i2 ni2 等j-2 udengj-2 经济j-1 nj-1 犯罪j0 vnj0 ##空白##j1 nullj1 ##空白##j2 nullj2 贿赂→犯罪 n→vn 贿赂→犯罪-3 n→vn-3 贪污@贿赂→犯罪 贿赂→经济@犯罪 v@n→vn n→n@vn null
贪污i-2 vi-2 贿赂i-1 ni-1 等i0 udengi0 经济i1 ni1 犯罪i2 vni2 ##空白##j-2 nullj-2 ##空白##j-1 nullj-1 ##核心##j0 rootj0 坚决j1 adj1 惩治j2 vj2 等→##核心## udeng→root 等→##核心##5 udeng→root5 贿赂@等→##核心## 等→##空白##@##核心## n@udeng→root udeng→null@root null
贪污i-2 vi-2 贿赂i-1 ni-1 等i0 udengi0 经济i1 ni1 犯罪i2 vni2 ##空白##j-2 nullj-2 ##核心##j-1 rootj-1 坚决j0 adj0 惩治j1 vj1 贪污j2 vj2 等→坚决 udeng→ad 等→坚决4 udeng→ad4 贿赂@等→坚决 等→##核心##@坚决 n@udeng→ad udeng→root@ad null
贪污i-2 vi-2 贿赂i-1 ni-1 等i0 udengi0 经济i1 ni1 犯罪i2 vni2 ##核心##j-2 rootj-2 坚决j-1 adj-1 惩治j0 vj0 贪污j1 vj1 贿赂j2 nj2 等→惩治 udeng→v 等→惩治3 udeng→v3 贿赂@等→惩治 等→坚决@惩治 n@udeng→v udeng→ad@v null
贪污i-2 vi-2 贿赂i-1 ni-1 等i0 udengi0 经济i1 ni1 犯罪i2 vni2 坚决j-2 adj-2 惩治j-1 vj-1 贪污j0 vj0 贿赂j1 nj1 等j2 udengj2 等→贪污 udeng→v 等→贪污2 udeng→v2 贿赂@等→贪污 等→惩治@贪污 n@udeng→v udeng→v@v 连接依存
贪污i-2 vi-2 贿赂i-1 ni-1 等i0 udengi0 经济i1 ni1 犯罪i2 vni2 惩治j-2 vj-2 贪污j-1 vj-1 贿赂j0 nj0 等j1 udengj1 经济j2 nj2 等→贿赂 udeng→n 等→贿赂1 udeng→n1 贿赂@等→贿赂 等→贪污@贿赂 n@udeng→n udeng→v@n null
贪污i-2 vi-2 贿赂i-1 ni-1 等i0 udengi0 经济i1 ni1 犯罪i2 vni2 贿赂j-2 nj-2 等j-1 udengj-1 经济j0 nj0 犯罪j1 vnj1 ##空白##j2 nullj2 等→经济 udeng→n 等→经济-1 udeng→n-1 贿赂@等→经济 等→等@经济 n@udeng→n udeng→udeng@n null
贪污i-2 vi-2 贿赂i-1 ni-1 等i0 udengi0 经济i1 ni1 犯罪i2 vni2 等j-2 udengj-2 经济j-1 nj-1 犯罪j0 vnj0 ##空白##j1 nullj1 ##空白##j2 nullj2 等→犯罪 udeng→vn 等→犯罪-2 udeng→vn-2 贿赂@等→犯罪 等→经济@犯罪 n@udeng→vn udeng→n@vn null
贿赂i-2 ni-2 等i-1 udengi-1 经济i0 ni0 犯罪i1 vni1 ##空白##i2 nulli2 ##空白##j-2 nullj-2 ##空白##j-1 nullj-1 ##核心##j0 rootj0 坚决j1 adj1 惩治j2 vj2 经济→##核心## n→root 经济→##核心##6 n→root6 等@经济→##核心## 经济→##空白##@##核心## udeng@n→root n→null@root null
贿赂i-2 ni-2 等i-1 udengi-1 经济i0 ni0 犯罪i1 vni1 ##空白##i2 nulli2 ##空白##j-2 nullj-2 ##核心##j-1 rootj-1 坚决j0 adj0 惩治j1 vj1 贪污j2 vj2 经济→坚决 n→ad 经济→坚决5 n→ad5 等@经济→坚决 经济→##核心##@坚决 udeng@n→ad n→root@ad null
贿赂i-2 ni-2 等i-1 udengi-1 经济i0 ni0 犯罪i1 vni1 ##空白##i2 nulli2 ##核心##j-2 rootj-2 坚决j-1 adj-1 惩治j0 vj0 贪污j1 vj1 贿赂j2 nj2 经济→惩治 n→v 经济→惩治4 n→v4 等@经济→惩治 经济→坚决@惩治 udeng@n→v n→ad@v null
贿赂i-2 ni-2 等i-1 udengi-1 经济i0 ni0 犯罪i1 vni1 ##空白##i2 nulli2 坚决j-2 adj-2 惩治j-1 vj-1 贪污j0 vj0 贿赂j1 nj1 等j2 udengj2 经济→贪污 n→v 经济→贪污3 n→v3 等@经济→贪污 经济→惩治@贪污 udeng@n→v n→v@v null
贿赂i-2 ni-2 等i-1 udengi-1 经济i0 ni0 犯罪i1 vni1 ##空白##i2 nulli2 惩治j-2 vj-2 贪污j-1 vj-1 贿赂j0 nj0 等j1 udengj1 经济j2 nj2 经济→贿赂 n→n 经济→贿赂2 n→n2 等@经济→贿赂 经济→贪污@贿赂 udeng@n→n n→v@n null
贿赂i-2 ni-2 等i-1 udengi-1 经济i0 ni0 犯罪i1 vni1 ##空白##i2 nulli2 贪污j-2 vj-2 贿赂j-1 nj-1 等j0 udengj0 经济j1 nj1 犯罪j2 vnj2 经济→等 n→udeng 经济→等1 n→udeng1 等@经济→等 经济→贿赂@等 udeng@n→udeng n→n@udeng null
贿赂i-2 ni-2 等i-1 udengi-1 经济i0 ni0 犯罪i1 vni1 ##空白##i2 nulli2 等j-2 udengj-2 经济j-1 nj-1 犯罪j0 vnj0 ##空白##j1 nullj1 ##空白##j2 nullj2 经济→犯罪 n→vn 经济→犯罪-1 n→vn-1 等@经济→犯罪 经济→经济@犯罪 udeng@n→vn n→n@vn 限定

开始训练

我没有使用最大熵的Java实现》中实现的最大熵训练工具,也没有使用被人们普遍采用的,张乐的maxent包(我认为这个包不好用),而是使用了Apache的OpenNLP:

因为训练文件非常大,一共有481MB,所以预留足够的堆内存:

-Xms7g -Xmx7g -Xmn2g

然后泡一杯咖啡,观赏CPU和内存优雅的波动。

经过100次迭代,算法终止,控制台输出:

Indexing events using cutoff of 0

	Computing event counts...  done. 1861112 events
	Indexing...  done.
Sorting and merging events... done. Reduced 1861112 events to 1833862.
Done indexing.
Incorporating indexed data for training...  
done.
	Number of Event Tokens: 1833862
	    Number of Outcomes: 70
	  Number of Predicates: 4455069
...done.
Computing model parameters ...
Performing 100 iterations.
  1:  ... loglikelihood=-7906925.47660146	0.9110778932165287
  2:  ... loglikelihood=-971858.577142937	0.9110778932165287
  3:  ... loglikelihood=-624919.4609670108	0.9110897141064052
  4:  ... loglikelihood=-462310.9670608526	0.9177013527396525
  5:  ... loglikelihood=-369281.459860001	0.9357534635207339
  6:  ... loglikelihood=-310247.897402181	0.9506155459746646
  7:  ... loglikelihood=-269854.155585957	0.9615031228641802
  8:  ... loglikelihood=-240539.3087439537	0.969453208619363
  9:  ... loglikelihood=-218235.31440539932	0.9752846685207553
 10:  ... loglikelihood=-200620.52389892808	0.9798077708380796
 11:  ... loglikelihood=-186296.82683019168	0.9832535602371055
 12:  ... loglikelihood=-174376.85525761746	0.9858057978240966
 13:  ... loglikelihood=-164270.2129251688	0.9877755879280774
 14:  ... loglikelihood=-155568.08840582886	0.9893681841823598
 15:  ... loglikelihood=-147977.98810126958	0.990592183597763
 16:  ... loglikelihood=-141284.9458857342	0.9915593473149386
 17:  ... loglikelihood=-135327.33809159094	0.9923336156018553
 18:  ... loglikelihood=-129981.19423319508	0.9929767794737769
 19:  ... loglikelihood=-125149.7233355148	0.9934705702827127
 20:  ... loglikelihood=-120756.16428692684	0.993888599933803
 21:  ... loglikelihood=-116738.79587554693	0.9942319430534003
 22:  ... loglikelihood=-113047.37622205028	0.9945129578445574
 23:  ... loglikelihood=-109640.55218258391	0.9947536741474989
 24:  ... loglikelihood=-106483.94337384604	0.9949782710551541
 25:  ... loglikelihood=-103548.70465068106	0.9951733157381178
 26:  ... loglikelihood=-100810.43325297734	0.9953328977514518
 27:  ... loglikelihood=-98248.32771636335	0.9954854946934951
 28:  ... loglikelihood=-95844.53309412279	0.9956246588061332
 29:  ... loglikelihood=-93583.62576668245	0.9957503900893659
 30:  ... loglikelihood=-91452.20406168769	0.9958761213725987
 31:  ... loglikelihood=-89438.5599694251	0.9959835840078405
 32:  ... loglikelihood=-87532.41365573417	0.9960824496322629
 33:  ... loglikelihood=-85724.69707287937	0.9961888376411522
 34:  ... loglikelihood=-84007.37630195482	0.9962855540128698
 35:  ... loglikelihood=-82373.30470432037	0.996376359939649
 36:  ... loglikelihood=-80816.10077070128	0.9964585688556089
 37:  ... loglikelihood=-79330.04591227672	0.9965499120955644
 38:  ... loglikelihood=-77909.99846227578	0.9966224493743525
 39:  ... loglikelihood=-76551.32093717014	0.9966949866531407
 40:  ... loglikelihood=-75249.81820741286	0.9967487179707616
 41:  ... loglikelihood=-74001.68469360287	0.9968078224201445
 42:  ... loglikelihood=-72803.45906938458	0.9968685388090561
 43:  ... loglikelihood=-71651.98523946866	0.9969297925111439
 44:  ... loglikelihood=-70544.37858954606	0.9969840611419409
 45:  ... loglikelihood=-69477.9966859846	0.997035643206857
 46:  ... loglikelihood=-68450.41374832438	0.9970882998981254
 47:  ... loglikelihood=-67459.39833407002	0.9971269864468124
 48:  ... loglikelihood=-66502.89376934124	0.9971640610559709
 49:  ... loglikelihood=-65579.00093537995	0.9972102699891248
 50:  ... loglikelihood=-64685.96308337934	0.9972489565378118
 51:  ... loglikelihood=-63822.15240134625	0.9972951654709657
 52:  ... loglikelihood=-62986.058099291404	0.997334389332829
 53:  ... loglikelihood=-62176.27581399071	0.9973666281234015
 54:  ... loglikelihood=-61391.49816405947	0.9974004788535027
 55:  ... loglikelihood=-60630.50631060893	0.9974316430177227
 56:  ... loglikelihood=-59892.16239919156	0.9974638818082953
 57:  ... loglikelihood=-59175.40277629493	0.9974928967198106
 58:  ... loglikelihood=-58479.23188818825	0.9975202996917971
 59:  ... loglikelihood=-57802.71678235576	0.997550926542841
 60:  ... loglikelihood=-57144.98214237416	0.9975783295148277
 61:  ... loglikelihood=-56505.20579602903	0.9976051951736381
 62:  ... loglikelihood=-55882.614644262365	0.9976336727719772
 63:  ... loglikelihood=-55276.48096502942	0.9976610757439638
 64:  ... loglikelihood=-54686.119051923764	0.9976793443919549
 65:  ... loglikelihood=-54110.88215229098	0.9976992249794746
 66:  ... loglikelihood=-53550.15967375364	0.9977201801933467
 67:  ... loglikelihood=-53003.374631728235	0.9977411354072189
 68:  ... loglikelihood=-52469.98131380689	0.9977642398737959
 69:  ... loglikelihood=-51949.46313945433	0.9977830458349631
 70:  ... loglikelihood=-51441.33069604661	0.9977997025434256
 71:  ... loglikelihood=-50945.1199343268	0.9978115234333023
 72:  ... loglikelihood=-50460.39050818265	0.9978319413339982
 73:  ... loglikelihood=-49986.72424529987	0.9978507472951654
 74:  ... loglikelihood=-49523.72373666303	0.9978690159431566
 75:  ... loglikelihood=-49071.01103417001	0.9978883592175001
 76:  ... loglikelihood=-48628.22644663535	0.9979039412996101
 77:  ... loglikelihood=-48195.027425595385	0.997921672634425
 78:  ... loglikelihood=-47771.08753300227	0.9979437024746496
 79:  ... loglikelihood=-47356.09548390075	0.9979565979908785
 80:  ... loglikelihood=-46949.754257641674	0.9979748666388697
 81:  ... loglikelihood=-46551.78027193582	0.9979856129023938
 82:  ... loglikelihood=-46161.90261458571	0.9979974337922705
 83:  ... loglikelihood=-45779.862328164156	0.9980114039348519
 84:  ... loglikelihood=-45405.41174337755	0.9980253740774333
 85:  ... loglikelihood=-45038.313857272304	0.9980393442200147
 86:  ... loglikelihood=-44678.34175273963	0.9980549263021248
 87:  ... loglikelihood=-44325.278056099254	0.9980662098788251
 88:  ... loglikelihood=-43978.91442990726	0.9980796427082304
 89:  ... loglikelihood=-43639.0510982312	0.9980903889717545
 90:  ... loglikelihood=-43305.496402030054	0.9981000606089263
 91:  ... loglikelihood=-42978.066382363024	0.9981108068724505
 92:  ... loglikelihood=-42656.58438944011	0.9981215531359746
 93:  ... loglikelihood=-42340.88071560524	0.9981371352180847
 94:  ... loglikelihood=-42030.79225052235	0.9981441202893754
 95:  ... loglikelihood=-41726.16215706383	0.998155941179252
 96:  ... loglikelihood=-41426.8395663762	0.9981677620691286
 97:  ... loglikelihood=-41132.67929083109	0.9981768963931241
 98:  ... loglikelihood=-40843.54155365343	0.9981892545961769
 99:  ... loglikelihood=-40559.29173403668	0.9981978516069963
100:  ... loglikelihood=-40279.80012676684	0.9982059113046394

依存句法分析

用最大熵模型估计任意两个单词之间最可能的依存关系以及概率,将概率的值取对数取相反数作为边的花费,接下来使用最小生成树算法计算出一颗全局最小的生成树即可。

中文句法分析实践

hankcs每天都在写程序

System.out.println(MaxEntDependencyParser.compute("hankcs每天都在写程序"));

输出:

1	hankcs	hankcs	nrf	nrf	_	5	施事	_	_
2	每天	每天	r	r	_	5	领有者	_	_
3	都	都	d	d	_	5	程度	_	_
4	在	在	p	p	_	5	介词依存	_	_
5	写	写	v	v	_	0	核心成分	_	_
6	程序	程序	n	n	_	5	内容	_	_

可视化:

System.out.println(MaxEntDependencyParser.compute("我目前在魔都某女校学习外语"));

输出:

1	我	我	rr	rr	_	7	施事	_	_
2	目前	目前	t	t	_	7	时间	_	_
3	在	在	p	p	_	4	介词依存	_	_
4	魔都	魔都	ns	ns	_	6	限定	_	_
5	某	某	rz	rz	_	6	限定	_	_
6	女校	女校	n	n	_	7	施事	_	_
7	学习	学习	v	v	_	0	核心成分	_	_
8	外语	外语	n	n	_	7	内容	_	_

可视化:

System.out.println(MaxEntDependencyParser.compute("把市场经济奉行的等价交换原则引入党的生活和国家机关政务活动中"));

输出:

1	把	把	pba	pba	_	6	介词依存	_	_
2	市场经济	市场经济	n	n	_	3	施事	_	_
3	奉行	奉行	v	v	_	6	内容	_	_
4	的	的	ude1	ude1	_	3	“的”字依存	_	_
5	等价交换	等价交换	vl	vl	_	6	限定	_	_
6	原则	原则	n	n	_	7	受事	_	_
7	引入	引入	v	v	_	0	核心成分	_	_
8	党	党	n	n	_	10	限定	_	_
9	的	的	ude1	ude1	_	8	“的”字依存	_	_
10	生活	生活	vn	vn	_	7	终处所	_	_
11	和	和	cc	cc	_	10	连接依存	_	_
12	国家机关	国家机关	n	n	_	14	限定	_	_
13	政务	政务	n	n	_	14	限定	_	_
14	活动	活动	vn	vn	_	10	连接依存	_	_
15	中	中	f	f	_	10	方位词依存	_	_

可视化:

其他的例子:

评测

直接将训练集的全部作为封闭测试集(这是一种很流氓的行径),测试结果为:

UA: 99.20% LA: 99.01% DA: 99.04% sentences: 20000 speed: 518.081   sent/s

在开发集上进行测试,效果差很多:

UA: 65.98% LA: 56.15% DA: 53.33% sentences: 2000 speed:   417.8855 sent/s

为何效果如此不令人满意,我认为:

1、跟特征的选取有关,特征太侧重词语了,语料库根本无法覆盖所有词语的搭配情况。

2、跟语料库有关,清华的依存句法树库一共有69种依存关系,造成辨识难度过大。

3、最大熵模型不是在线学习的模型,比如说,既然认定词语A是施事者,那么句子中必然有一个受事者,这种逻辑未能在最大熵里得到体现。

接下来应该试试CRF或者SVM。

Reference

http://opennlp.apache.org/index.html 

基于最大熵的依存句法分析.pdf

知识共享许可协议 知识共享署名-非商业性使用-相同方式共享码农场 » 最大熵依存句法分析器的实现

评论 7

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址
  1. #6

    你的hanlp里面的句法依存分析,没有用到最大熵的依存句法分析,你是不是写错啦?链接:http://hanlp.linrunsoft.com/doc/_build/html/dependency_parser.html

    逍遥自在0176年前 (2018-01-12)回复
  2. #5

    您好!“得出下列训练文件:”,那个文件怎么得到的啊?

    大道至公7年前 (2017-02-10)回复
  3. #4

    您好,apache opennlp训练模型具体怎么操作啊?谢谢

    大道至公7年前 (2017-01-16)回复
  4. #3

    Hi Hancks,

    Your "基于最大熵的依存句法分析.pdf" link is broker –

    {"code":"NoSuchBucket","message":"The specified bucket does not exist.","requestId":"5beea217-36ba-4919-9942-23ddcde3800c"}

    Arthur8年前 (2016-07-03)回复
  5. #2

    楼主大神是女的?

    陽炎零8年前 (2016-06-16)回复
  6. #1

    楼主你好,你这个过程中好像没用到最大生成树模型啊?

    漏网之鱼8年前 (2016-03-18)回复

我的作品

HanLP自然语言处理包《自然语言处理入门》