暑期实习||汉语分词的一些体会

现在已经完全不做了,只是偶尔关注一下NLP的一些东西,回想起来,从刚开始的一无所知,到后来能够使用第三方API做出来使用的工具和API,收获还是蛮大的,先将做过的东西记录下。

刚开始我们的想法是自己做出来数据结构,也就是分词里面的词典,真是无从下手啊,数据结构涉及到词典编码,词典查找,以及如何词典的具体结构(后来看别人的源码如何实现的词典才知道我们浪费了太多时间与精力在这个地方),原来很幼稚的思路就是,对文本输入的每一个句子建立树,树的每一个节点是单字,单字的指针包含了两部分,一部分是下一个节点的个数(也就是接下来的与本节点成词的有多少个字),一部分就是指针指向下一个字,最后生成的就是一个巨大的错乱无比的图,寻找一个已经存在的句子首先要通过单字的汉字索引来找,出现的问题就是图会有环而且,维护起来极其不方便。而且这也不是词典。Stupid!

统计文本可以发现,双字、三字和四字词语加起来的概率占了大概所有词语的90%以上,所以没必要依照句子进行存储,考虑使用双字结构、三字结构、四字结构存储词典,词典并非预先定义的,而是通过文本训练得到的,有些词语出现的概率很好,比如‘的我’‘了是’等等有助词参与,导致概率上升的词语,剔除掉,还有一些完全没有意义的词语,这样做的一个好处就是按照概率排列的话,出现频率比较高的基本就是词语了,可以看出一些规律,但是跟实际的分词系统相差很远,放弃不用。

直到我看了《数学之美》,才知道统计模型的巨大威力,使用数学的手段对文本进行分析,不能说是完美,但是起码是现在最好的分词系统的核心算法,开始研究ICTALCAL的源代码,从开始的词典建立,到核心算法(没时间仔细看),大致有了个了解,然后开始按照思路建立自己的词典,源代码里面有些功能没有导出来,我想要操作这些词典的话,就需要自己写啦

…..

折腾来折腾去,最后实现的大体框架是按照ICTALCAL的API来的,NLP带给我的不仅仅是这一段时间让我费劲脑汁使用STL的高效MAP,HASH_MAP,MULTIPLE_MAP,SET,HASH_SET等容器,还有对字符串的切分,变换一些其他操作,字符编码的深入理解,高效查找,最重要的是培养起来的兴趣,你不做,永远不知道自己喜欢什么,有可能其中滋味不好受,折腾来折腾去,但回想起来,最值的记起的往往是死扛的那段时期,实习带给我的思考远没有结束,最后的画面:

早上磨磨蹭蹭极其不情愿爬起来,然后买俩包子,揣着去地铁坐车,车上打开,电子书,看看面试题目之类的(奇葩吧,真事!),到了西二旗再走上个十分钟,开始一天的日子,中午去辉煌国际吃难吃的饭,回去往往没有午休=_=,继续编码,刚开始还要被要求做测试,我后来抵制就罢了。跟公司的那个HR矛盾挺多,不怨她怨这DT的规章制度,你听说过请假要提前一个月么?一个星期呢?MD,这就是我碰见的事情。实习生当驴子使,工资不按时发放,却要求你做出成果,还好,熬过来了!坚决辞了。

我不怀念,虽然值得回忆,走过的路也不后悔,向前看,未来,我为你准备。(原文写于2012.0903)

0904面了搜狗的NLP职位后打击太大,面试官看我没有这方面基础,就找个理由放了我=_=

点赞