自然语言处理和数据挖掘项目中的一些技术体会
从事自然语言处理的工作快一年了,一直想写些东西,但自己学的太少一直不知道该从哪里开始下手,虽然现在还是很菜,但看着自己的项目即将完成,鼓起勇气写点东西,主要是自己在项目中遇到的一些问题。
这次做的这个项目,也是我工作的第一个项目,就是利用自然语言处理的分词、词性标注、句法分析,还有就是数据挖掘的一些东西。
主要实现的功能是,输入一句话,通过NLP的相关技术理解到这句话的意思(当然这个理解很浅层,不像百度google做的那样好,毕竟我只是一个才本科毕业的菜鸟,哈哈),然后通过理解到的意思,再从网上抓取的电子邮件数据(就是网络抓包的技术,我没有做这一块,我只是用抓取到的数据,分析整理成我要的格式)中找到和输入数据相关的电子邮件数据,然后分析出这些邮件发送的轨迹图,最后确定邮件发送轨迹图中比较重要的邮件用户。
最开始我是从NLP中分词,词性标注,未登录词识别等等到句法分析一步一步慢慢学过来的,中间也折磨了我好久(特别是句法分析,还要感谢公司给这么多时间给我学习),最后还是没能把句法分析搞得很明白,只是能够使用其中的一些技术。
在NLP这方面,我个人觉得,最好还是要有较好的数学基础,要熟练使用其中的各种公式好好的复习大学的概率与数理统计这门课程,当然信息论也是必须的,里面主要的我觉得就是熵,最大熵的一些知识,最主要的还是高等代数的知识(非数学专业的貌似叫大学数学,包括微积分和线性代数,我们数学专业是分开的是,数学分析主要是微积分之类的,高等代数主要是矩阵相关的知识)这能让你更好的理解NLP的各种模型。语言学方面我觉得也没必要要怎样特意的学习,就是看书的时候理解下,应该就没什么问题了。然后就是计算机的编程知识,我用的主要是C和C++语言,因为要处理大量字符串的问题,所以一定要熟悉char*数组的使用,和string类型数组的使用,以及各种类型之间的相互转换,当然还要了解一些编码的知识,比如GB2312之类的。具备了这些基础,或者更多的知识你才能够,或者有资格去学习NLP的相关技术(仅仅个人觉得,哈哈)。
我学习NLP是从正则表达式开始学习的,你必须要了解一些正则表达式的知识,当你处理文档,字符串之类的,有时候难免会遇到。然后作为过渡,我先看了看google研究员吴军的数学之美,这可以让你大概的了解自然语言处理是怎么回事,该怎么去学习,以及现在的研究状况。然后才开始真正的NLP的学习,我使用的书籍是,《统计自然语言处理》国外很经典的一本书,现在已经出第二版了,名字叫《语音与语言处理》(不过第二版,只有英文版,我买了一本,现在正苦逼的读着),也没必要挨着挨着一直读,看自己的状况,可以从N元语法,HMM模型开始学习,去感受一下数学知识的魅力。这期间你肯定要写代码,而很好学习代码就是中科院的分词系统《ICTCLAS》,如果你把这个系统读懂了,并自己写了一遍,我觉得你就了解了大部分关于中文分词以及词性标注的东西(至少我是这样的),当然这个只是其中一个方面,还有很多的方法,你可以慢慢的学习,把这些弄懂后,你会发现一些问题,你只是实现模型,你不知道数据是怎么来的,你也不知道是怎么整理。所以你就要学习语料库中的相关知识,怎样去训练模型,就会接触到HMM模型,最大熵模型,条件随机场等等的模型,其中最难的就是模型的训练,包括有监督的学习和无监督的学习,你会看到很多短时间难以理解的算法,比如EM算法,就是比较重要的一个算法。如果你能够自己训练处自己的模型了,那说明你能够做分词词性标注之类的事情了,不过你没有必要高兴,虽然中国在这方面比较落后,但现在这一块也以及基本成熟了,你只是会,然后为后面的句法分析,语义分析之类的做铺垫,去研究这些东西,这才是现在NLP还没有突破的问题。(我现在也在学习这方面的东西,希望有高手可以给些帮助,想学习的朋友能够互相交流,一起成长,我的邮箱forever1dreamsxx@sina.com,需要资料的话,我有的都会给的)
做完上面的,你能够简单的分析一些句子,或者是文档了,也许也能得到一些句法分析树,语义分析结果。对于我来说,我已经能够获取句子的一些简单的句子结构,也能够满足我项目 的需求。所以下面我就开始做数据挖掘的一些工作(我感觉是数据挖掘,我也不知道这具体叫做什么,哈哈)。
先前说过要通过NLP的结果,在数据中去寻找你想要的内容。所以第一步必须建立我自己的数学模型,怎样去整理数据,数据是什么格式的类型,怎样去查找我想要的东西。我首先想到的是矩阵,最后也确实用的是矩阵,因为矩阵可以保存大量的内容,如果太大也可以通过矩阵的奇异分解,去消除这个问题,所以矩阵很好,我就用了矩阵。
项目最开始,需要定义很多种的结构体,和类去实现这些查找的功能,比如,保存某个个体的结构,结果的结构,中间变量的结构,这些东西都没法用一个变量保存,所以要定义很多的结构体,然后就要去填补数据矩阵,定义矩阵的各种函数,最终实现数据查找的功能,找出想要的轨迹,确定最终的核心人物。
其中会遇到很多层的循环,同时还需要考虑时间复杂度和空间复杂度,因为项目最终是要处理很大量的数据,如果时间复杂度和空间复杂都不考虑,也许系统要运行几天甚至几个月才能得到想要的结果。我在实现轨迹重溯的算法的时候,自己都完全晕了,只是没想到后来竟然测试通过了,后来看到几百行的代码(就一个算法)我自己都佩服自己的逻辑能力,哈哈。然后还有一个比较重要的算法,就是在得到轨迹图以后,需要通过这个轨迹图得到其中的核心点,这个算法同样要考虑很多东西,也写了几百行,测试的时候不能用特殊数据测试,这样会忽略掉算法一些BUG和错误,我先前就遇到过,花了一天时间才发现错误,不过还好改过来了。(我想这应该就是数据挖掘吧)
上面的一些东西,最开始我没有看资料只是根据自己所学的东西去想,然后建模,然后实现模型,现在也基本成型了,虽然感觉很肤浅,不过确实也实现了。后来看了一些数据挖掘的博士论文,才发现,我和他们的思想都差不多,只是他们都写成博士论文了,而且还有自己的数学公式,而我只是一个模型,然后实现了,没有自己的公式。。。等等的,我想这就是差距吧,一个本科生做NLP的悲哀,哈哈。
写了这么多,肯定有很多不对的地方,希望好心人能够指出,帮助我学习。同样如果有想学习这方面知识的朋友,也可以问我,我会的我一定告诉,我有的资料我一定给。邮箱:forever1dreamsxx@sina.com。