2013.1.3 - NER

Posted on 2013-02-18 16:27  SnakeHunt2012  阅读(259)  评论(0)    收藏  举报
上午来到实验室就看到凌晨一点左右大师兄给我留的言, 说让我用CRF++的标准模版。一开始我不太明白,因为这里面没找到什么标准模版,后来问了师兄才知道就是职业上给出的那个示例,然后就开始亲测,发现有 错误,然后我就只用前面几百行,可以正确运行。而如果给的数据太多的话 ,没有错误,但是迭代的时候卡在某个地方然后Windows就把我程序给关了。于是我把这个问题问大师兄,大势行初步判断可能语料的格式有错误。
 
一开始我不知道是怎么错的,也不知道为什么错误在整体数据的时候回报错,然后等喂一半数据的时候就不报错,取而代之的是在迭代的时候卡机,然后 被Windows强制杀死。于是我自己判断有可能是数据太大了,因为当时调试NER的时候也遇到过这样的问题,原先最大熵的模型用全部语料训练的时候就会 卡机然后被Wndows杀死,师兄让我用千一百句语料,就可以顺利进行,当是师兄做的诊断就是我的机器是64位的问题。现在想想也有可能。因为现在一次操 作就至少得是64位,比以前的32位打了一倍,所以对内存的要求求就会比较高,然而我看资源管理器,内存没有到达8G,这个情况仍然很不解。因是我就开始 确定多少数据刚刚可以进行迭代而不被Windows关掉,我十二分着试触的,找到这个大概位置后跟大师兄问,但大师兄分析应该还是语料的问题,CRF++ 应该没有问题,然后我就开始想怎么找到错误。
 
今天我算是看到数据大的问题了,书局明明在你面前,你明明就知道里面一定有一行一有问题,而且这一行应该按照格式一眼就能看出来,可是行数太多了,几百万行,你就是不知道他在哪,他明明就在你面前,你就不知道他在哪里,感觉跟盲人差不多。
 
然后我还是二分着吧数据喂给CRF++,竟然发现当数据规模降下来的时候,他竟然能够识别出是有问题,并且报错,而不是卡在那里,然后我继续分割慢慢就找到错误了,这个地方是:

一方有难    i    O
/i/ws,    wp    O
/wp/ws八方支援    i    O
/l/ws
在    p    O
抗灾    v    O
斗争    v    O
中    nd    O
,    wp    O
行动    v    O
最    d    O
快    a    O
、    wp    O
出力    v    O
最    d    O
大    a    O
的    u    O
,    wp    O
还    d    O
是    v    O
人民    n    O
子弟兵    n    O
。    wp    O

然后我一用"/"查找,果然然有很多错误,而且不知是这种错误,有的错误比如说:

桥    n    O
是    v    O
石拱    n    O
单孔    n    O
古    a    O
桥    n    O
,    wp    O
盈盈    a    O
//m流水    n    O
映荡    v    O
着    u    O
成    v    O
排    v    O
“    wp    O
人家    r    O
”    wp    O
的    u    O
美丽    a    O
倒影    n    O
。    wp    O

就 是查不出来的,所以幸好这个地方出了错误,不然这些隐含的错误还看不见呢,我用perl过了一下语料一共有280多个"/",正常语料处理成CRF++的 格式之后就不应该有"/"了,这说明要么是我的处理程序有问题,要么是原先的语料有问题,然后我把其中一些出问题的地方搜到,然后在原语料里找到对应的位 置,果然是原语料的问题:

一方有难/i /i /ws ,/wp /wp /ws 八方支援/i /l/ws
在/p 抗灾/v 斗争/v 中/nd ,/wp 行动/v 最/d 快/a 、/wp 出力/v 最/d 大/a 的/u ,/wp 还/d 是/v 人民/n 子弟兵/n 。/wp
 
问题是找到了,不过接下来就是犯愁怎么把他们一个一个都改回来,首先是手动改了几个,然后发现这些标错的预料经过我的处理之后形成的错误可以分堆,估计它标预料标错的时候也是有机械化过程的。
 
他的规律就是,很多行是以"//m"开头的,至于标语料那人为什么总是这个错误我觉得很灵异。但我用这个标记用正则表达式处理,竟然在280多 处错误,其中有250多处是这种错误,我只需要将所有的"//m"都去掉就可以了,这样下来就一下子只剩30多处错误了,也都是跟"/"有关的,然后我用 编辑器一个一个搜到然后一个一个改就改完了。其实上面那个"//m"的错误是CRF++发现不了的,因为它没加空格,就不改变列数量,所以CRF++会将 其作为正常数据处理,好像真正能引起报错的就那么几处,但这个地方确实是错了,如果没有这几个知致命错误这些错误就不会发现,不过很有可能在我改完这些之 后还有没发现的而且CRF++检查不出来的错误。也许就是这种地方加大了复杂度,但是当我改完这些发现整个数据喂进去之后还是会卡,死机。然后我继续检 查,因为数据纯度已经很高了,所以这次就不二分测了,这次系要确定每一行都没有问题,然后我就把整个语料平分位11份,分别喂给CRF++,晚上九点多 钟意跑完了,跑数据的时候整个电脑就跟上个世纪的计算机一样死卡死卡的,我把后五分数据同时运行,然后CPU飙升到了纯100%,内存也一路飙升到了 7.4G左右,场面蔚为壮观。但是最后数据都跑下来了,估计在格式上是没有问题了,现在关心的是会不会数据内容上有不合理的地方,回不回我的处理程序把内 容弄坏了,或者有包装皮留在了数据里,因为大师兄说,很久以前的NER也用过CRF++来着,那时候没问题。晚上要走的时候把结果给大师兄留了言就回宿舍 了。