简单的中文分词算法
想了解点中文文本处理的底层一些的知识,在网上查了下跟python有关的文本分析书记,意外发现一本新书。
书籍简介
本书是一本研究汉语自然语言处理方面的基础性、综合性书籍,涉及NLP的语言理论、算法和工程实践的方方面面,内容繁杂。
本书包括NLP的语言理论部分、算法部分、案例部分,涉及汉语的发展历史、传统的句法理论、认知语言学理论。需要指出的是,本书是系统介绍认知语言学和算法设计相结合的中文NLP书籍,并从认知语言学的视角重新认识和分析了NLP的句法和语义相结合的数据结构。这也是本书的创新之处。
本书适用于所有想学习NLP的技术人员,包括各大人工智能实验室、软件学院等专业机构。
分词
中文NLP比外文要难,难在第一步就是要将文本进行切词。我们知道中文常用字也就3500左右,但单个的字往往意义不多,对理解句子意思帮助不大。
而且中文词之间没有空格等标识符,这更增加了中文NLP的难度。
NLP第一步,就是从分词开始,目前市面上有ICTCLASS,jieba,HanNLP等,了解其分词算法原理,对更好的学习编程,使用编程语言处理文本数据大有裨益。汉语(其实也包括其他语言)有两大分词算法,最大匹配算法(MM)和隐马尔可夫算法(HMM)。
最大匹配分词算法
最大匹配分词算法比较简单,学起来一点也不烧脑筋。使用前提是有自己的领域词典。最早是由苏联汉俄翻译学者提出(文科生诶),简称MM(The Maximum Method),基本思想:
有一待处理字符串str1,假设已有词典中的最长词条字符长度为a,取被处理字符串(str1),从中截取出a长度的字符串记做str2,将str2与词典中词条一一匹配,如果词典中有str2,那么str2从str1中切分出来,作为一个词。
如果词典中没有str2,那么从str1中截取a-1长度的字符串记做str3,还是进行上面的匹配步骤,如果str3在词典中,str3作为一个词,反之,继续缩短字符串长度。
直到切分成功为止。即完成一轮匹配,并切出一词。
小案例
上面说的有点绕口,还是举个简单的例子看看。
例如,现有短语“计算机科学和工程”,假设词典中最长词为7,于是先取“计算机科学和工”为匹配字段,来匹配词典,由于词典中没有改词,故匹配失败;
去掉最后一个汉字成为“计算机科学和”作为新的匹配字段,重新匹配词典,同样匹配失败;
取“计算机科学”作为新字段,由于词典中有“计算机科学”一词,从而匹配成功,切出的第一个词为“计算机科学”。
以此类推,直至切分出第二、第三。。。个词
分析总结
使用MM方法切分精度不高,实际应用意义不大。随着语料的增多,误差也逐渐变大。
基于MM的搜索方法还存在局限性,比如正向最大匹配,因为只能正向的找出最长词,而不能找出所有的候选词条。因此,后来发展出了双向扫描法,从两方向对字符串进行匹配,以尽可能多的生成候选词条,增强分词效果。
但因为没有考虑词汇上下文相关性,分词精度还是不高。
基于正向最大匹配算法的分词器准确率为78%;
基于双向匹配算法最高精度也只在80%左右徘徊。显然这不能满足高精度文本处理需求
隐马尔可夫算法
基于MM算法分词器没有得到广泛的应用,但是却揭示了一个语言规律:一个词汇的出现往往与其上下文环境中出现的词汇序列存在者紧密联系。
所谓上下文相关性是指,文中第n个词的出现与其前后n-m到n+m个词有高度的相关性,而这个敢为之外的其他词相关性较低,我们把[-m,m]范围叫做窗口范围。
为了将分析简单化,我们只考虑单侧情况。文本中第n个词出现与其前面的i-n个词相关(0<n<i),而不考虑窗口范围之外的其他词的相关性。
将语言模型应用到中文分词中,效率和准确性大大提高。ICTCLASS就采用类似的算法,准确率已达到98%,从此,中文文本处理才变为可能。
更多内容
文本分析
数据分析
神奇的python
爬虫
【视频】有了selenium,小白也可以自豪的说:“去TMD的抓包、cookie”
【视频】快来get新技能--抓包+cookie,爬微博不再是梦