中文机械分词算法入门

转载 2007年10月14日 23:46:00
原贴:http://hunteagle.javaeye.com/blog/118538

中文机械分词算法入门2007/06/04

作者:Sunny from Hour41 (www.hour41.com )

这几天因为要负责新的搜索系统中的分词,所以看了一些入门级的分词算法。其中主要是机械分词方法,趁这个机会总结下。

机械分词方法又叫基于字符串匹配的分词方法,它是按照一定的策略将待分析的汉字串与一个“充分大的”机器词典中的词条进行区配,若在词典中找到某个 字符串,则匹配成功(识别出一个词)。按照扫描方向的不同,串匹配分词方法可以分为正向匹配和逆向匹配;按照不同长度优先匹配的情况,可以分为最大(最 长)匹配和最小(最短)匹配;按照是否与词性标注过程相结合,又可以分为单纯分词方法和分词与标注相结合的一体化方法。常用的几种机械分词方法如下:
    1)正向最大匹配法(由左到右的方向);
    2)逆向最大匹配法(由右到左的方向);
    3)最少切分(使每一句中切出的词数最小)。

这几种分词方法的基本原理相同, 1和2基本上只是一个方向的区别,而由于我们习惯都是正向的来理解句子,所以反向分词的匹配的错误率会稍小。据网上的统计数据表明,单纯使用正向最大匹配 的错误率为1/169,单纯使用逆向最大匹配的错误率为1/245。但有时候正向分出的结果却比反向更优,所以通过需要通过计算总的概率来选择最优的分词 结果:
 比如: 中国是世界上5个常任理事国之一
 反向: 中/国是/世界/上/5/个/常任/理事国/之一/
 正向: 中国/是/世界/上/5/个/常任/理事国/之一/

方法3就是在在前两种方法的结果基础上用统计方法找出切出词最小的匹配方法。

下面我们来看看一个机械分词算法的基本实现。首先,需要有一个词库。用来在其中对搜索串中可能为词的子串进行一个搜索,如果找到则表明是一个词。让 计算机能够按照语言习惯进行切分,往往需要机器有一个比较丰富的词库才能够比较准确的识别出语句中的单词。理论上来说,词库越大越好。但由于考虑到加载后 的速度问题,一般的词库都保持在几十万字的水平。一般应用中词库都是预先加载至内存中。下面是我看到的几种常见的字典加载的方法(当然词库的建法都是与后 面的具体算法对应的):

l )直接建一个链表(LinkedList)加载,可用于二分查找匹配。
2)对字典建一个哈希表(HashTable)或键值对(Map),可以建立首字哈希搜索,也可以加入权重值进行搜索时的权重控制。还可以用值来标明匹配时目前的匹配是否有“潜力”成为一个词。
3)树形字典: 树的每个节点包含一个字. 比方  中国   中国人  中华民族  中华人民共和国  几个词,构成的树的结构:
  
                 中
           国^    华
      人^        人    民
                   民       族^
                   共
                   和
                   国^
树中结点标明匹配到这一点是否已经成词,否则说明继续往下(添加输入字)才可成词。
4)将字典构造为一个对象后,将其序列化再写入文件,直接将字典作为一个对象来进行操作。

加载了词库后,主要的算法步骤如下(正向最大匹配):
1, 待处理的短语为S;
2, 测试S.substring(0,k)是否是词语,如果是,保存其长度max=k。否则将k加1后继续在字典中匹配,重复此步骤。这里k为2到字典的词语的最大长度。
3, 得到一个最大词语,长为max。
4, 返回2,继续处理S = S.substring(max),即余下的字符。

反向匹配与此类似, 如下(最大匹配):
1, 得到搜索串中的一个子串S(0,k);
2, 测试S.substring(0,k)是否是词语,如果是,保存其长度max=k。否则继续在字典中匹配S.substring(1,k),重复此步骤。这里k为2到字典的词语的最大长度。
3, 得到一个最大词语,长为max。
4, 如果max=k,返回1以取得新的子串进行匹配;否则返回2,继续处理S = S.substring(0,k-max),即余下的字符。

实际应用中,这种算法的精度还远远不能满足需要。实际使用的分词系统,都是把机械分词作为一种初分手段,还需通过利用各种其它的语言信息来进一步提 高切分的准确率。公司文档中提出的一种办法是增加辅助切分词语。这些词语并不是词语,它们是词语组合。它们来辅助的进行词语切分。比如,对于短语“吃面的 地方”来说,当后向切词的时候,它会被切分为:吃、面的、地方。显然这是不对的。所以,可以增加一个辅助切词短语:“吃面的”,这个短语固定切分为:吃 面、的。当发现某些短语切分不准确的时候,可以通过增加辅助切词词语来修正切分。当然这就需要一个额外的辅助切词短语的短语库,网上有没有现成的我还没有 找过。

下面是一些网上找到的具体算法实现:

Ø http://www.javaeye.com/topic/58701
Ø http://sourceforge.net/projects/wordsegment/
Ø http://www.solol.org/technologic/java/j-lucene2/index.html#top
Ø http://www.javaeye.com/topic/59121

自然语言处理--中文分词之机械分词

说到自然语言处理,对于中文首当其冲的就是分词。     和西方语言不同,中文句子中不像英语,每个单词间有空格隔开,而是全部连在一起,词间没有明显的界限。这就为我们的翻译、检索等等更高级的信息处理...
  • wujiaqi168
  • wujiaqi168
  • 2014年10月05日 21:25
  • 1289

中文分词算法总结

什么是中文分词 众所周知,英文是以 词为单位的,词和词之间是靠空格隔开,而中文是以字为单位,句子中所有的字连起来才能描述一个意思。例如,英文句子I am a student,用中文则为:“我是一...
  • Yelbosh
  • Yelbosh
  • 2015年05月21日 19:55
  • 26292

中文分词基本算法介绍

中文分词基本算法介绍 本文内容框架: 1、基于词典的方法(字符串匹配,机械分词方法) 2基于统计的分词(无字典分词) 3基于规则的分词(基于语义) 4基于字标注的中文分词...
  • wusecaiyun
  • wusecaiyun
  • 2015年10月26日 15:21
  • 746

基于字典的中文分词算法RMM,MM实现

引言:目前针对中文分词一般有基于字典,基于统计(HMM等),基于规则的分词方法,然而其中基于字典的中文分词是最基础,同时也是最高效的方式,但分词精度取决与字典的规模。 **一.基于字典的中文算法简介*...
  • xqhadoop
  • xqhadoop
  • 2017年03月07日 11:29
  • 1657

中文分词的python实现-基于HMM算法

隐马尔科夫模型(HMM)模型介绍HMM模型是由一个“五元组”组成: StatusSet: 状态值集合 ObservedSet: 观察值集合 TransProbMatrix: 转移概率矩阵 EmitPr...
  • orlandowww
  • orlandowww
  • 2016年09月29日 23:44
  • 3756

中文分词算法——基于统计的分词

1.基于统计的分词(无字典分词) 主要思想:上下文中,相邻的字同时出现的次数越多,就越可能构成一个词。因此字与字相邻出现的概率或频率能较好的反映词的可信度。 主要统计模型为:N元文法模型(N-gr...
  • chenwei825825
  • chenwei825825
  • 2014年03月17日 13:51
  • 2747

java中文分词算法

你想知道百度是怎么找到你想要的东西的嘛?百度到底是怎么实现的呢?相信看完这篇博文你会豁然开朗,哦,原来是那样啊~~...
  • qq_34844199
  • qq_34844199
  • 2016年05月19日 11:10
  • 9098

中文分词基本算法主要分类

基于词典的方法、基于统计的方法、基于规则的方法、(传说中还有基于理解的-神经网络-专家系统) 1、基于词典的方法(字符串匹配,机械分词方法) 定义:按照一定策略将待分析的汉字串与一个“...
  • u013524455
  • u013524455
  • 2014年02月12日 21:25
  • 1977

中文分词原理和实现

三大主流分词方法:基于词典的方法、基于规则的方法和基于统计的方法。1、基于规则或词典的方法 定义:按照一定策略将待分析的汉字串与一个“大机器词典”中的词条进行匹配,若在词典中找到某个字符串,则匹配...
  • shibing624
  • shibing624
  • 2016年06月17日 11:22
  • 15360

常用分词方法总结分析

最近对自然语言处理中常见任务的方法做了一下整理总结,并对不同方法做了一些对比分析,资料主要来源于网络以及相关的论文。 1.中文分词 中文句子是由字组成的连续字符串。为了理解中文语义,首先需要将句子...
  • yunzhongfeiniao
  • yunzhongfeiniao
  • 2015年01月28日 18:19
  • 3682
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:中文机械分词算法入门
举报原因:
原因补充:

(最多只允许输入30个字)