首战!蟒蛇上的CR实现!

4.16日

 

从今天开始算吧,开始在蟒蛇上实现CR,这篇文章也是为了记录这个过程的学习心得和反思。

 

今天主要做了一些关于编码方面的学习和实验,终于弄清楚了若干个点:

1. windows的系统默认编码是gbk,实验得出之。

2. unicode和utf-8还是有差别的,他们的差别可以查看这篇文章:http://www.linuxforum.net/books/UTF-8-Unicode.html 

    我在这里记录几点:(1)就是utf8首先用一个字节记录后面跟多少个字节; (2)utf-8是为了兼容一些历史遗留问题,从8位到16位

    (3)utf-8的字节数是不等的。

3. 在python中,直接输入的汉字,是使用Utf-8来编码,如果加上前缀u,那么就是unicode,看下面这个例子:

 

 

 注意里面utf-8的编码,都是用了3个字节来编一个汉字

 

4. encode之后,会变成/x的形式,即普通的十六进制串,decode之后会转化为unicode的形式,即/u的形式

5. 对于文件,读入的line也是普通的十六进制串,而decode之后才会转化为正确unicode的形式,因此,关键是知道该文件编码的形式。

像一般的txt文件,由于其编码方式是gbk,而使用utf-8来解码,自然就会报错了:

 

  上例中的line是从文件中直接读出的字符串,如果直接输出就产生乱码了。而正确解码的cline是对的。

 

--------------------------------------------------------------------------------------------------------------------------------------------------

4.17

今天完成的工作是编写python脚本,从xml文件中读出entity,转化成自定义的mention类实例,

Mention类包括四个原始属性:id, text, sent_id, parent_id

 

今天调试遇到的问题不多,调试环境也比较强大。记录一个lambda表达式用在list.sort方法中的使用:

如:l= [1,234,5,34,33] l.sort()

而对复杂的对象,如元组

l = [(1,2,"a"),(2,32,"b"),(2,3,"d")]

l.sort(key=lambda x:x[2])

这样就可以取元组的第三个元素来比较了。而cmp参数不设为None,默认为按升序排序。

参考:http://blog.donews.com/maverick/archive/2006/07/09/951101.aspx 这个说了cmp和python排序采用的方法,小规模用二路插入,大规模用SampleSort(Quicksort)变种

http://wiki.python.org/moin/HowTo/Sorting 这篇说的比较详细

 

-----------------------------------------------------------------------------------------------------------------------------------------------

4.22

今天开始写AngelCR的其他部分,首先需要解决的问题是Jpype的使用,今天早上终于调试成功,HelloWorld。

问题在于:(1)-classpath <your class path> 

                ( 2) 在类中必须要有显式的构造函数,否则生成不了实例。

要冷静,还是冷静才能完成一切的功能,你遇到这些开发问题时显得太烦燥了,而且还有一个重要的原因,你害怕。对效率低,做不出来的恐惧让你自己心乱,迷失了方向。其实回过头来想,这根本都不是很大的问题,这都是一个过程,慢慢来,不要急~!!!特别是在做开发和调试的时候。

 

 

下午:目前的攻坚方向是弄清楚Reconcile的整个系统运行架构,好利用他里面的代码。

确认一点: 输出的确在build中,因为我修改了Preprocess之后,build中对应的class文件变化了(从时间上看)。

 

终于可以运行Reconcile了。

切记一点,不可乱,一乱则全盘皆输!一定要冷静,冷静地思考才能解决问题。

其实关键还是要弄清楚java的路径。

Java的类路径会从三处地方去寻找:

 

”虚拟机在运行一个类时,需要将其装入内存,虚拟机搜索类的方式和顺序如下: 
 
Bootstrap classes,Extension classes,User classes。 
 
Bootstrap 中的路径是虚拟机自带的 jar 或 zip 文件,虚拟机首先搜索这些包文件,用
System.getProperty("sun.boot.class.path")可得到虚拟机搜索的包名。 
 
Extension 是位于 jre/lib/ext 目录下的 jar 文件,虚拟机在搜索完 Bootstrap 后就搜索该
目录下的 jar 文件。用 System. getProperty("java.ext.dirs”)可得到虚拟机使用
Extension 搜索路径。 
 
User classes 搜索顺序为当前目录、环境变量 CLASSPATH、-classpath。

详见"http://www.diybl.com/course/3_program/java/javashl/2008520/117161.html

 

知道这一点就好办了。

 

另外记住两个符号:/表示类路径根目录  ./表示从当前目录下寻找。理解这两个符号有助于代码内部的学习。

 

目前的解决方法还是比较粗糙,直接将resource下的文件拷贝到build/目录下,但是不知道eclipse如何才能够识别resource里的文件作为classpath呢?明明.classpath里已经包含了resource的了。不解。

 

--------------------------------------------------------------------------------------------------------------------------------------------

5.2

经过之前的努力,终于成功debug了Reconcile,已经可以成功运行了。

 

接下来做的是:利用Reconcile的预处理的结果,在python上写载入程序。

 

遇到了一个问题:预处理结果中的nps中的np的位移并不吻合key的结果。但是input_xml上的数据是吻合的,于是我做的一件事情是,将input xml上的数据读进来,然后作为np处理。但是由于xml上并没有位移信息,所以要自己添加,结果遇到一个问题:(1)xml文件上的文本的格式跟raw.txt上面的有出入,如果直接用xml中读出的每个np的string来在rawtext上做匹配,那么许多np都无法找到,而且还有一个问题是(2)许多np不止出现一次,那么就需要区分这些np的位置了。

 

对于问题(1),解决方法是使用正则表达式作一些预处理(根据raw.txt上面的标点的格式)

而对于问题(2),解决方法是先利用句子匹配,确定find的范围,然后再匹配上面的Np。

 

结果是受限于对正则表达式的掌握,目前只能做到大部分的结果吻合,有少数的np无法匹配,目前的解决方法是人工的方法去解决这些np(因为没有什么规律可言...)预计需要1天的时间来完成约100+份数据。 T_T

 

不过正则表达式真的很强大。我今晚看了《精通正则表达式》的第一章,可惜没时间写读书笔记了。不过相信在研究的过程中,一定会经常使用它了。good buddy, come with me. Let's do the miracle!

 

-----------------------------------------------------------------------------------------------------------------------------------------

5.18

经过重重难关,终于到达pronoun的消解了。。。。。之前遇到了许多许多的问题都是涉及算法的问题,因此没有记录,现在记录一个关于正则表达式的错误:

* re.match('/w+',"     sdfds")

这条语句的结果是null。如果要检测出字母,则需要将前面的空格去除。这应该是正则表达式的一个bug吧。

 

------------------------------------------------------------------------------------------------------------------------------------------------

5.24

昨晚4点睡觉!!! 5月21日开始的语义聚类到5月24日凌晨写好。现在已经进入了调试阶段。

总之记住,无论遇到什么困难,只要咬牙坚持下去就行了。加油。天使就在前方。

 

以下是错误列表以及解决方案列表:

1. Toronto Star没被检测成NNP

Error:计算NNP的head时计算父亲的孩子是否都是NP,但The是DT

Solve:在检测是加入了DT的通过。

 

2. Multi-head的前置NP的处理

Error:问题出在Proper Name 的multi head中

Solve:只对common noun进行前置np的计算

 

3. Canadian ambassador没检测出前置np

Error: Canadian是JJ

Solve: 添加JJ许可

 

4. Cuban leader Fidel Castro没检测成NNP

Error:Cuban是JJ

Solve: 改为只要检测不到CC即返回上层节点(计算NNP头时)

 

5. Multi-head的同位语错误

Error:re.match只从开头算起,目前的做法是简单检测邻居tag中是否存在CC

Solve:改为re.search就OK了

 

6. Vincent不能识别是人名

Error:Debug信息问题,其实是找不到vincent这个名字 问题在于分割人名用到的正则表达式," |'|." 没有给.加上转义字符,这样split()得到的结果是所有的空字符"" 另外还有一个问题是没有加对分割后的名字加lower()

 

事实上还有问题,就是读入文件后的字符串都有一个'/n'在后面,这就是一个没能匹配的原因。 而且路径可以是相对路径,不需要是绝对路径。这个你做分词的时候都是直接放在文件夹下读进来的啦,这样都忘了!

 

 

5.25

7. Multi-head的np的PP语义关系有问题,不应该将其子结点的PP关系算成自己的语义关系,也就是说,目前只考虑多头Np的外部语义关系

Solve:添加一个条件判断就行了。对多头,p=np.parsenode。

 

8. Canadian ambassador to Peru, a mediator in the 47-days-old crisis不能计算出语义关系

Error:getNPByNode的时候出错。问题是geNPByNode方法中,用到的方法是对比head是否同一。本来应该可以计算出在内存中位置相同的head node对象,但是错误还是会发生,原因就是:parse文件中有冗余的数据,每个parse node都有两个等价的结点的表示,只是trid不等。这就导致了错误的发生,因为传入参数node是在另一个np中的树结点,即使他们指代的内容相同,但是id都未必一样。

Solve:使用位移来做衡量两个head是否等同的标准。

 

*以后遇到判断head是否匹配的情况,首先考虑是用位移来做衡量标准

 

9. one of the more than 500 initial hostage...没有检测出of这种从属关系

Error: one是CD,因为没有进入计算的while循环

Solve:添加一个HEAD_PATTERN,将CD也作为head的一种放进去

 

10. third country to take rebels, an opinion to resolve the crisis, all possibilities to resolve the crisis, MRTA's demand to drop... 由于to do sth是S或SBAR的标签,因为都不能检测出关系

Error:由于to do sth是S或SBAR的标签,因为都不能检测出关系

SOlve:在analyzeNextBroTagStr中添加对S|SBAR的处理,只要递归调用这个方法,最终分析嵌套在里面的VP和PP。

 

11. safe passage out of the country被认为是所属关系

Error:错误理所当然是发生在计算PPheads中了。这里的数据结构有些混乱,要好好理清一下。错误的原因是使用一个for循环来获得PPheads中的所有heads。但是如果非multiple PP的话,返回的PPheads就是属于一个PP的,因此就出现问题了。

Solve:修正了handleAttributeRelation。引入了一个方法,handleAttributeRelationForSinglePPHeads,对输入的PPheads,通过判断其第一个元素是否是列表来判断其是属于多头PP还是单头PP。

 

12. stormed the ambassordor's residence during a garden reception...这里将during a garden reception作为了residence的一个属性了。

Error:不应该对VP-> VP|NP|PP 这样的情况做 NP PP的关系提取。

Solve:在analyzeNextBroTagStr之前做一个filter,将不符合语法结构的实例过滤掉。

 

13. 在修改10之后,出现了一个新的错误:Dec.17 when Tupac Amaru Revolutionary Movement(MRTA) rebels stormed the ambassador's residence during a garden recption honoring the Japanese ... 这里提取出了Dec.17 和 residence的一个storm关系。

Error:由于修改了对S|SBAR的检索允许。

Solve:添加限制,目前只对to do sth的结构进行提取。从句暂时不提取。

 

--------------------------------------------------------------------------------------------------------------------------------

5.26

14. 对前置定语的判定加入一个操作:即进行完所属关系提取之后,将对应的modifier删去

 

 

15. 结果的clusters中出现了相同的cluster多次,未发现原因

Error:错误发生在同位语合并处,由于合并的时候仅仅是将 出现同位语关系的np对应的clusterDic[np]加入这个同位语, 而没有考虑原来就在这个list中的其他np,因此其他np对应的clusterDic[np]就将没有这个同位语np,因此在转换成clusters的时候,就会出现删除 不干净的情况。(例如:先输出了一个没加入同位语np的cluster,结果同位语Np对应的clusterDic[np]就幸存下来了)

Solve:在合并的时候,对每一个np的clusterDic[np]都添加上同位语np

 

16. A的A1 B的B1,如果A与B共指,不能表示A1与B1共指,这样的几率较低

Sovle:在Matcher中添加一句filter,过滤掉主动所属关系的匹配。 

 

16.1 上述做法未能解决16 

Error: 一个马虎错误,写错了属性名

 

17. 解决Fujimori与毫无关联的Peru的共指解决。

Error: clusters中包含了一个rest。

Solve:不要将未分类的放在一起,单个放置。明日再战。已解决。

 

 

18. 理论上应该Fujimori是人,Peru是地名,这里使用语义类别就可以解决了

Solve:加上这个restriction

 

19. 又发现了重复出现的cluster

Error:问题出现在 handleNpPair这个方法中,因为cluster中又出现了许多单独的cluster,所以需要使用新的合并的算法

Solve:现在采用的方法是 先保存两个列表, 使用对两个列表进行合并,完了之后对之前的列表的每一对np进行迭代求新的np.

           调试中遇到了问题,问题出现在如果newnp1和newnp2是共指的,就不需要再对它们做迭代操作了。

 

20. 还有一个重复出现的cluster

Error: 问题还不十分明确,但是估计是出现在clusters是动态数据,不断更新之后,可能会出现冗余的问题

Solve:解决方法还是先保存原来的列表。保存的方法需要明确一下 newlist= [] + oldlist, 这样就可以简单的克隆一个新列表.

 

 

------------------------------------------以下问题出现在对52的测试-----------------------------------------

21. Annan的type计算成common noun

Error: 在对proper name判断的方法中,只考虑了NNP往父节点上移的情况,没有考虑不上移的情况

Solve: 加入了判断条件针对不上移的NNP

 

22. U.N. Secretary-General Kofi Annan on Wednesday welcomed efforts by ...检测不出Predicate关系

Error:因为检测是从head上朔到U.N. Secretary-General Kofi Annan就停止了。停止条件不应该是这样,应该是到父亲是S

Solve: 将停止条件由判断是否在parsenode 的范围内,改为上朔到S|SBAR。

 

----这里出现了问题:事实上是应该需要一个在np.sta, np.end范围内的限制,不然的话就会出现许多多余的解析关系。但是要解决22这个问题,真正修改的方法应该是如果往上一层是NP并且兄弟是PP,就可以允许往上。

 

 

23. Zairean government and rebels from eastern Zaire 这个np得到了三个head,Zairean, government,和rebels

Error: 计算NP head时,算法太简单,只是将不是CC或/W的都递归计算,这样明显是不行的

Solve:修改后的算法是,从找到的CC开始向左右两边找,找一个NP,然后找下一个CC或/W,一直找到尽头,计算NP head,一定要保证输入的node是NP才对。(事实上,由于parse tree的错误,目前的做法是宽容一些,让只要是NP_PATTERN的都OK了)

 

24. 承接上面的错误,rebels的modifier是government

Error:错误的产生还是由于应该解析成一个NP的没有正确解析

Solve:目前补救的办法就只有利用CC做个判定了。

 

25. Zaire's government and rebels holding....出现了一个Zaire的所属关系。是错误的

Error:错误在计算所属关系时,对多头也进行了计算

Sovle:添加一个filter对多头不予计算

 

26. the east of the country,计算得到的头是the

Error:east是JJ,需要作修改

Solve: 引入分层计算,首先计算一遍HEAD_PATTERN的匹配,若没有就计算HEAD2_PATTERN的匹配:CD|JJ

 

27/ the east of the country没有计算得到从属关系

Error: east是JJ,计算是就根本没有进步while 循环

Solve: 在while头中加入HEAD2_PATTERN这个条件

 

28. 对NNP计算头部时,如eastern Zaire计算出来的头是eastern Zaire。事实上应该就只有Zaire

Error: 返回parent时,只是不存许父亲结点中出现CC,其实应该也不允许出现NN和NNS

Solve: 按上面的来修改,注意pattern 是 ^(NN|NNS)$ 这样才不会过滤NNP

 

29. 有个大错误:即由于parse tree的原因,使[]Zairean government and the rebels from eastern Zaire的parsenode 计算出来是Zariean government. 还有[9] [18]

 

30. 计算出一个错误的关系:other regional leaders 与 to bring together representatives... 

Error: 错误原因是之前对关系计算的修改是从head开始上朔到S,所有属于Head和Head2Pattern的结点都进行检索。事实上,对于出现了CCtag以及/W的NP,也是需要终止检索的 (这里需要修改,见22)

 

31. 计算leaders的语义类别,出现了group这个类

Error:没错的。 但是要考虑需要需要先算词元,再算语义类别

 

32. 计算U.N spokesman Fred Eckhard时计算出来的parsenode是U.N.

Error:由于解析树中的对应结点前面有 " , 因此它的sta与NP的sta不等,结果就被过滤掉了。

Solve:在计算之前首先对node.sta进行Modify,就是计算node中第一个/w的位置,从而获得精确的node的开始位移

 

33. 又出现了一个问题:事实上U.N. spokesman Fred Eckhard计算出来的head是Eckhard, 而这是由于spokesman是NN。

×××××××××××××××于是这里提出了一个关于如何有效进行NNP的head match的问题

 

34. the rebel-held town of Bukavu 没能检测出of的从属关系

Error:因为Bukavu在这里并没有作为np出现

 

 

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值