随思:关于中文分词方法-阿里云开发者社区

开发者社区> wangtaotao> 正文

随思:关于中文分词方法

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


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

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



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

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


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

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来命名,表示中文分词的意思

版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

相关文章
使用NAT网关轻松为单台云服务器设置多个公网IP
在应用中,有时会遇到用户询问如何使单台云服务器具备多个公网IP的问题。 具体如何操作呢,有了NAT网关这个也不是难题。
25920 0
阿里云服务器如何登录?阿里云服务器的三种登录方法
购买阿里云ECS云服务器后如何登录?场景不同,大概有三种登录方式:
2503 0
阿里云服务器ECS远程登录用户名密码查询方法
阿里云服务器ECS远程连接登录输入用户名和密码,阿里云没有默认密码,如果购买时没设置需要先重置实例密码,Windows用户名是administrator,Linux账号是root,阿小云来详细说下阿里云服务器远程登录连接用户名和密码查询方法
9501 0
阿里云服务器端口号设置
阿里云服务器初级使用者可能面临的问题之一. 使用tomcat或者其他服务器软件设置端口号后,比如 一些不是默认的, mysql的 3306, mssql的1433,有时候打不开网页, 原因是没有在ecs安全组去设置这个端口号. 解决: 点击ecs下网络和安全下的安全组 在弹出的安全组中,如果没有就新建安全组,然后点击配置规则 最后如上图点击添加...或快速创建.   have fun!  将编程看作是一门艺术,而不单单是个技术。
8920 0
windows server 2008阿里云ECS服务器安全设置
最近我们Sinesafe安全公司在为客户使用阿里云ecs服务器做安全的过程中,发现服务器基础安全性都没有做。为了为站长们提供更加有效的安全基础解决方案,我们Sinesafe将对阿里云服务器win2008 系统进行基础安全部署实战过程! 比较重要的几部分 1.
8120 0
阿里云服务器如何登录?阿里云服务器的三种登录方法
购买阿里云ECS云服务器后如何登录?场景不同,阿里云优惠总结大概有三种登录方式: 登录到ECS云服务器控制台 在ECS云服务器控制台用户可以更改密码、更换系.
10522 0
如何设置阿里云服务器安全组?阿里云安全组规则详细解说
阿里云安全组设置详细图文教程(收藏起来) 阿里云服务器安全组设置规则分享,阿里云服务器安全组如何放行端口设置教程。阿里云会要求客户设置安全组,如果不设置,阿里云会指定默认的安全组。那么,这个安全组是什么呢?顾名思义,就是为了服务器安全设置的。安全组其实就是一个虚拟的防火墙,可以让用户从端口、IP的维度来筛选对应服务器的访问者,从而形成一个云上的安全域。
6013 0
阿里云服务器如何登录?阿里云服务器的三种登录方法
购买阿里云ECS云服务器后如何登录?场景不同,云吞铺子总结大概有三种登录方式: 登录到ECS云服务器控制台 在ECS云服务器控制台用户可以更改密码、更换系统盘、创建快照、配置安全组等操作如何登录ECS云服务器控制台? 1、先登录到阿里云ECS服务器控制台 2、点击顶部的“控制台” 3、通过左侧栏,切换到“云服务器ECS”即可,如下图所示 通过ECS控制台的远程连接来登录到云服务器 阿里云ECS云服务器自带远程连接功能,使用该功能可以登录到云服务器,简单且方便,如下图:点击“远程连接”,第一次连接会自动生成6位数字密码,输入密码即可登录到云服务器上。
20957 0
+关注
wangtaotao
专注于互联网系统设计
167
文章
0
问答
文章排行榜
最热
最新
相关电子书
更多
《Nacos架构&原理》
立即下载
《看见新力量:二》电子书
立即下载
云上自动化运维(CloudOps)白皮书
立即下载