中文机械分词算法入门

转载 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

怎样知道我的程序是否运行在DELPHI?

function IsAppRunningInDelphi : boolean; var   hKernelDll : THANDLE;   proc_IsDebuggerPresent : TPro...
  • laoli
  • laoli
  • 2001-10-05 14:16:00
  • 927

中文机械分词算法

机械分词方法又叫基于字符串匹配的分词方法,它是按照一定的策略将待分析的汉字串与一个“充分大的”机器词典中的词条进行区配,若在词典中找到某个字符串,则匹配成功(识别出一个词)。按照扫描方向的不同,串匹配...
  • mlks_2008
  • mlks_2008
  • 2007-12-04 17:24:00
  • 976

中文分词算法总结

中文分词算法现在一般分为三类:基于字符串匹配,基于理解,基于统计的分词。 基于字符串匹配分词:机械分词算法。将待分的字符串与一个充分大的机器词典中的词条进行匹配。分为正向匹配和逆向匹配;最大长度匹配...
  • yezi2413
  • yezi2413
  • 2008-10-26 20:16:00
  • 21139

中文分词:原理及分词算法

http://www.dianacody.com/2014/11/05/cn_cutwords.html 中文分词:原理及分词算法 05 Nov 2014 By DianaCody ...
  • chengzheng_hit
  • chengzheng_hit
  • 2017-01-27 04:53:56
  • 3231

ANSYS 14.0机械与结构有限元分析 从入门到精通[扫描版PDF电子书]

  • 2015年05月11日 07:00
  • 69.63MB
  • 下载

中文自动分词算法

  • 2014年04月02日 22:02
  • 215KB
  • 下载

基于python的分词算法的实现(1) - 算法

从网络上搜索分词算法,可以找到一个很有名的开源项目ictclas(http://ictclas.org/)。这个算法是基于概率的。概率的确是个好玩意,很多语言层面难以简单概括的东西,用一个概率就可以描...
  • yr_lihuan
  • yr_lihuan
  • 2011-04-07 12:01:00
  • 1062

汉仪凌心体,机械字体设计原形

  • 2013年05月09日 10:00
  • 1.5MB
  • 下载

java中文分词算法

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

mmseg中文分词算法的python实现及其优化

mmseg中文分词算法的python实现及其优化任务定义实现一个中文分词系统并对其性能做测试。输入输出该分词的训练语料取自人民日报1998年公开的语料库。为了保证测试的严谨性,选择另一份语料库做测试文...
  • say_c_box
  • say_c_box
  • 2017-11-16 14:23:31
  • 405
收藏助手
不良信息举报
您举报文章:中文机械分词算法入门
举报原因:
原因补充:

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