首页 > 其他 > 详细

随思:关于中文分词方法

时间:2014-04-06 17:00:48      阅读:606      评论:0      收藏:0      [点我收藏+]


疑问:为什么会涉及到分词方法学呢?

为什么需要确定哪些是词语,哪些不是词语呢?



为什么需要进行分词,如果不分词会是什么情况呢?

分词的根本目的是为了搜索服务的,更确切的是为快速搜索而服务的


了解倒排索引后,就知道全文搜索需要分词了。理解一下正向索引(反向索引就是倒排索引,先产生了正向索引来搜索,后面才发明了反向索引):

http://www.cnblogs.com/wangtao_20/p/3647193.html

比如要搜索词语"湖南",那么意思是搜索哪些资料中带有关键词"湖南"。

如果一篇文档中有2000个字,里面确实有文字"湖南"。但是要拿到内容进行遍历查找是否有"湖南",那么多篇文档,比如一万篇,如果每个文档内容都去看,这样效率太低了。
所以有种索引办法。对文档提取关键词出来,比如这篇文档提取出带有哪些关键词,为这篇文档生成一个关键词列表,列表中列出了这篇文档的所有关键词以及关键词出现的位置和出现次数等信息,可以暂时把这个列表叫做索引(其实就是正向索引)。
  {关键词编号,出现位置,出现频率}

如果统计出是20个关键词,其中有个关键词是"湖南",搜索"湖南"的时候,直接去每篇文档的关键词列表中搜索是否有词语"湖南",有,表示这篇文档符合搜索条件,返回作为搜索结果。


由于要建立这种索引结构,那就更加需要用一种办法来确定哪些作为词语,哪些不能作为一个词语。
比如文档中的文字"中国天安门", 把"中国天安门"作为一个词语加入到索引中去吗?还是只把"中国"和"天安门"作为两个独立的词语加入到倒排索引中去呢?所以就需要确定一种分词规则了。


中文才会涉及到复杂的分词技术,因为英文的分词比较简单,不涉及到复杂的关键词提取方法,这是由于英文词语与词语之间有明显的空格作为分割。而中文是紧密相连的。比如"我爱北京天安门",词语"北京"与"天安门"是紧密相连的。计算机怎么知道"北京"和"天安门"算是两个词语呢。

 


分词法的发展阶段包括:机械式分词、基于规则的分词、基于统计的分词

目前的中文分词算法如果按照是否基于词典分的话,分为两大类:词典方式与非词典方式

一、基于词典的分词方法

关于它的别名,有的地方也叫做机械分词方法,基于字符匹配(其就是匹配词语字典嘛)

建立一个关键词词典,类似于字典,里面存储的结构像这样子:

中国
北京
萝卜
衣服

每一行就是一个关键词。

查查字典,依据词典决定哪些词语作为关键词。比如拿到一个篇文章,要提取文章中的关键词的话,是与词典中的词语进行对比,词典中出现的就算为关键词。



mmseg算法(这是基于词典的分词法),以正向最大匹配为主,多种消除歧义的规则为辅。
这个算法是国外人提出的。作者博客:http://technology.chtsai.org/mmseg/

基于词典的分词方法,以前只是机械式分词,也就是机械式匹配词典里面的单词。

机械式分词的算法有以下几种:
1、按照长度优先级的不同,可以分为最大匹配、最小匹配;
2、按照匹配方向的不同,可以分为正向匹配、逆向匹配。

机械匹配法中,正向匹配,最大匹配等方式,缺乏歧义切分处理,这样的切分精度低,于是后来就发展了一种基于规则分词方式。还有一种基于统计的分词方法。基于规则和基于统计可以依赖于词库也可以不依赖于词库,一般都是与词典分词方式结合起来时候。难以严格来区分

实践中,经常以正向匹配方式为主。
依赖于词典的方法,缺点是:没有在词典中出现的词语,就没法作为关键词进行切分。

二、基于词语频率统计分词

将文章中任意两个字同时出现的频率进行统计,次数越高的就可能是一个词。

实际应用的统计分词系统都要使用一部基本的分词词典(常用词词典)进行串匹配分词,同时使用统计方法识别一些新的词,即将串频统计和串匹配结合起来,既发挥匹配分词切分速度快、效率高的特点,又利用了无词典分词结合上下文识别生词、自动消除歧义的优点。


三、基于规则。规则派,让机器根据现有资料"学习"如何分词。计算机来模拟人的理解方式,对文字进行分词。需要制定一些规则。这个确实比较麻烦。需要很大的人力和精力投入,目前没有通用可以生产的系统使用,处在试验阶段。
基于规则的的分法,有的地方也叫做基于理解的分词方法。
规则法,目前常见的是CRF(Conditional random field, http://en.wikipedia.org/wiki/Conditional_random_field)。具体的实现可参考http://nlp.stanford.edu/software/segmenter.shtml



基于统计和基于规则的分词法是非词典,也就是可以不需要词典的(实际中是多种方式结合,所以会与词典结合)。

基于词典的和不基于词典的两类分词法,有他们各自的优缺点
基于词典的,部署比较简单,只需要安装词库即可。实现也简单,对比查找词语库的思路。
缺点是,分词精度有限,对于词典里没有的词语识别较差。

非词典分词法,优点是,对于出现过的词语识别效果较好,能够根据使用领域达到较高的分词精度。
缺点:实现比较复杂。前期需要做大量的工作。

================================================================================

现实中,没有一种分词方法能够满足所有需求。所以一般都是多种分词方法结合起来使用,相互弥补。词典+统计法结合。

既能达到分词精准,又能分词速度快。是比较理想的状态。但要求精准就会存在性能消耗。搜索引擎需要在分词速度与分词准确度方面求得平衡。

中文分词一直要解决的两大技术难点为:歧义识别和新词识别(新的人名、地名等)




另外,从网上看到点资料,了解到业界研究分词的研发情况:

研究中文分词的大多是科研院校,清华、北大、哈工大、中科院、北京语言学院、山西大学、东北大学、IBM研究院、微软中国研究院等都有自己的研究队伍,而真正专业研究中文分词的商业公司除了海量科技以外,几乎没有了。科研院校研究的技术,大部分不能很快产品化,而一个专业公司的力量毕竟有限,看来中文分词技术要想更好的服务于更多的产品,还有很长一段路。




了解基于词典、基于规则、基于统计三大类分词法的优缺点,对实际应用有什么帮助?

并不是说自己开发分词组件(系统),因为开发是一件很投入人力、财力、时间的工作,网上有很多开源免费或者收费的(个人作者开发的收费都不贵,值得投入获得他们技术支持),自己去做也做不了他们那么专业,术业有专攻,这是一个比较专业性的领域,何必重复造轮子。

作为技术人员,知道如何选型,什么情况下该用什么方案,不一定要自己去造轮子。懂得资源组装和好好使用拿来的分词系统也需要技能。

网上有什么盘古分词,庖丁解牛分词等分词组件,又有什么提到mmseg算法,如果不了解他们实现的原理,就会云里雾里,知道了几种基本分词方法。就知道如何选择适合自己应用的分词系统。因为本身没有一种分词方法是完美、能完全满足你所有需求的。就会存在不足的一面,了解了这些原理,能够提早知道哪些方面不足,这些不足是否在你可容忍之内。

比如,我曾经的公司只是一个小应用。全站搜索,我在使用sphinx的时候,考虑到如果使用基于词典的分词法,本身技术维护就麻烦,得往词库里面加新的词语。何况当时我也没拿到比较好的词库。
于是我觉得不用词典算了。直接使用一元分词法。搜索精准一点,我们应用数据量小的情况下,分词速度也不会成为问题。

比如拿到一个分词组件,说是mmseg算法实现的,如果了解这种算法,就知道这种算法是基于词典来匹配的。只不过在词典的基础上增加了一种切分方式。也就是说使用这个组件,自己必须要有个词典才行。





中文的n元分词法

n元分词,也有的叫做交叉切分算法。看上面的就是词语交叉。
经常见到的有一元分词,二元分词

n元分词法的特点:不需要词库。是基于算法的。
n元就是指,拆分成多少个字符算一个关键词。比如一元,就是一个汉字当成一个词语,建立成一个索引。二元的话,就是2个字符算一个词语。把所有可能出现的2个字符组合都拿出来。

"我爱北京天安门"
二元分词分出的词语如下:
我爱,爱北,北京,京天,天安,安门

常见的有一元分词,二元分词。

一元分词是一个汉字就是一个词。比如"我是北京人" 分成的词语为:我,是,北,京,人

缺点:不是很准确。无法搜索到用户想要的。比如用户希望出现带有"北京"的,结果程序分词拆分成了单独的“北”和"京"
二元分词法:
以两个为单位作为词语单位,比如"我是北京人",分词结果为:我是,是北,北京,京人。



关于:三元交叉切分法

“全文索引”或“1台x光机”四个字会被交叉分拆为6份,建立反向索引如下:
  012  123  234  345  456  567

我觉得,这种正向匹配法,目标就是把所有可能出现的词语都顾及到。这样子不需要去建立词库来分词。

出现一个"我爱北京天安门"

其实本质就是3元切分法。

疑问: 我只理解n元交叉分词,那么这个n元分词法不需要词典,也不是基于统计词频率的。是不是应该归类到规则派去呢?


收集业界分词项目(供以后需要时候查看):

1、盘古分词是一个基于.net 平台的开源中文分词组件,提供lucene(.net 版本) 和HubbleDotNet的接口
2、Paoding(庖丁解牛分词)基于Java的开源中文分词组件

3、HTTPCWS 是一款基于HTTP协议的开源中文分词系统,目前仅支持Linux系统。是PHPCWS的前身。
HTTPCWS 使用“ICTCLAS 3.0 2009共享版中文分词算法”的API进行分词处理,得出分词结果。
ICTCLAS商业版是收费的,而免费提供的 ICTCLAS 3.0 共享版不开源。
ICTCLAS(Institute of Computing Technology, Chinese Lexical Analysis System)是中国科学院计算技术研究所在多年研究工作积累的基础上,基于多层隐马模型研制出的汉语词法分析系统,主要功能包括中文分词;词性标注;命名实体识别;新词识别;同时支持用户词典。

通俗点说,HTTPCWS是基于词典分词法,使用的词典是ICTCLAS,这个东东收费。

4、SCWS,Hightman开发的一套基于词频词典的机械中文分词引擎
5、MFSOU中文分词PHP扩展
6、智呈分词
7、friso,使用c语言开发的一个中文分词器,使用流行的mmseg算法实现。完全基于模块化设计和实现,可以很方便的植入到其他程序中,例如:MySQL,PHP等。并且提供了一个php中文分词扩展robbe。

.
.
.
.
cws是chinese word segmenter的简称。一般都喜欢以cws来命名,表示中文分词的意思

随思:关于中文分词方法,布布扣,bubuko.com

随思:关于中文分词方法

原文:http://www.cnblogs.com/wangtao_20/p/3647240.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!