随思:关于中文分词方法

简介: 疑问:为什么会涉及到分词方法学呢?为什么需要确定哪些是词语,哪些不是词语呢?为什么需要进行分词,如果不分词会是什么情况呢?分词的根本目的是为了搜索服务的,更确切的是为快速搜索而服务的。 了解倒排索引后,就知道全文搜索需要分词了。


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

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



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

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


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

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

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

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

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


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


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

 


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

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

一、基于词典的分词方法

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

粱南元教授是在1987年最早提出利用词典进行分词。


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

中国
北京
萝卜
衣服

每一行就是一个关键词。

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

 

基于字典分词的算法有:mm法(最大正向匹配法,maximum matching method)、rmm法(逆向最大匹配法,reverse maximum matching method)、ngram法

mm法和rmm法的原理基本相同,不同的是分词扫描的方向,一个是正向,一个是逆向。

也把mm、rmm两种办法都称为贪婪法。因为他们都是最大匹配(匹配的方向有正向和逆向)。

我发现,其实有的地方叫交叉分法指的就是ngram法
ngram是一种分词方法,照顾所有的可能。n表示一个数字。
比如2-gram分词法,对待"走进搜索引擎"会分成:走进、进搜、搜索、索引、引擎。
ngram分词法的缺点是:为了照顾所有可能,于是把很多不必要的词也加入到索引中,索引项增加。

在原版的sphinx中,就有一个配置项ngram_len,指的就是使用ngram分词法,默认是1,也就是使用1-gram分词法(一个字符当一个次,放到中文中就是一个汉字)。手册中说只支持0和1,大于1的方式还没有实现。


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
基于统计和基于规则的分词法是非词典,也就是可以不需要词典的(实际中是多种方式结合,所以会与词典结合)。
基于词典的和不基于词典的两类分词法,有他们各自的优缺点
基于词典的,部署比较简单,只需要安装词库即可。实现也简单,对比查找词语库的思路。
缺点是,分词精度有限,对于词典里没有的词语识别较差。

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

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

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

现实中的使用词典来存储大部分关键词,而识别新词使用统计法。最后就是词典+统计法结合起来使用。



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

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



 

 

 基于以上三类分词思路对现实应用的启发

 

看来,一般类型的公司,分词多维护一下词典就算了。
然后基于词典分词,拿一些正向匹配,逆向匹配,交叉分词算法(这几类算法都是基于词典来匹配的)。弄弄即可。索引项大就大点就大点呗,基本能够应付住。本身就没有一种办法是完美能够解决所有问题。要在维护成本和精确性进行权衡。

理由为:理解分词法,基于规则。这个还处于探索阶段,没有形成通用的系统(建立规则和进行计算需要很大工作量)。比较复杂。基于统计办法相比基于规则法而言,工作量和投入是小一些,但前面的截图也显示了,工作量其实也不小,一般为"扫描统计出现频率》》人工筛选确认"。

完全做到新词识别,需要投入的。去折腾统计分词,工作量和成本考虑。

 我在技术群里面,有个网友提供了识别新词的思路,如下:

把所有文本集中起来当成一个文本块,然后第一次扫描,记录下每一个字的偏移量,建立每个字出现的偏移量向量。然后对每一个偏移量进行统计,把相邻出现的组成集合,统计出现次数。超过2的就认为具有重复性,那就是新词。实际上肯定会多出一些不是词语的东西,但是可以通过人工筛选掉。
举个例子,在“我们是共产主义接班人,我们都爱共产主义”这句话里,词典原本是空白的,“我们”、“共产主义”这个术语未登录词。经过扫描统计以后,发现“我+们”相邻组合出现过2词,“共+产+主+义”相邻也出现过2次,那么就认为是词语了。(使用了hash算法)


 

 

 

 

 

 

 

 

 

 


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

研究中文分词的大多是科研院校,清华、北大、哈工大、中科院、北京语言学院、山西大学、东北大学、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来命名,表示中文分词的意思

目录
相关文章
|
17天前
|
自然语言处理 Python
python实现分词器
python实现分词器
|
8月前
|
自然语言处理
pkuseg 和 jieba 分词对比测试,结果出乎意料...
pkuseg 和 jieba 分词对比测试,结果出乎意料...
|
9月前
|
自然语言处理 BI
|
机器学习/深度学习 人工智能 自然语言处理
中文分词工具 MiNLP-Tokenizer
中文分词工具 MiNLP-Tokenizer
346 0
中文分词工具 MiNLP-Tokenizer
|
机器学习/深度学习 自然语言处理 算法
NLP(2) | 中文分词分词的概念分词方法分类CRFHMM分词
NLP(2) | 中文分词分词的概念分词方法分类CRFHMM分词
139 0
NLP(2) | 中文分词分词的概念分词方法分类CRFHMM分词
|
自然语言处理
HanLP分词工具中的ViterbiSegment分词流程
本篇文章将重点讲解HanLP的ViterbiSegment分词器类,而不涉及感知机和条件随机场分词器,也不涉及基于字的分词器。因为这些分词器都不是我们在实践中常用的,而且ViterbiSegment也是作者直接封装到HanLP类中的分词器,作者也推荐使用该分词器,同时文本分类包以及其他一些自然语言处理任务包中的分词器也都间接使用了ViterbiSegment分词器。
1062 0
|
自然语言处理
Ansj与hanlp分词工具对比
一、Ansj1、利用DicAnalysis可以自定义词库: 2、但是自定义词库存在局限性,导致有些情况无效:比如:“不好用“的正常分词结果:“不好,用”。 (1)当自定义词库”好用“时,词库无效,分词结果不变。
1060 0
|
自然语言处理 算法 测试技术
分词工具Hanlp基于感知机的中文分词框架
结构化感知机标注框架是一套利用感知机做序列标注任务,并且应用到中文分词、词性标注与命名实体识别这三个问题的完整在线学习框架,该框架利用
2042 0
|
自然语言处理 算法
中文分词算法工具hanlp源码解析
词图指的是句子中所有词可能构成的图。如果一个词A的下一个词可能是B的话,那么A和B之间具有一条路径E(A,B)。一个词可能有多个后续,同时也可能有多个前驱,它们构成的图我称作词图。
1672 0
|
自然语言处理 算法 Java
pyhanlp 中文词性标注与分词简介
如果想要只获取词性也是可以的,因为原分词器返回的是Java中的ArrayList属性,list中的每个单元都是一个term类,因此我们也可以通过获取term中的word字段来直接获取词语,或者nature属性,直接获取词性。这一特征,我们在之后也会用到。
4440 0