作者: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.iteye.com/topic/58701
Ø http://sourceforge.net/projects/wordsegment/
Ø http://www.solol.org/technologic/java/j-lucene2/index.html#top
Ø http://www.iteye.com/topic/59121
相关推荐
在提供的压缩包文件中,包含了各种与分词相关的源码,例如"zt_逆向最大匹配分词算法"可能是实现逆向最大匹配算法的具体代码,"秒盘古分词"可能是指快速版本的盘古分词程序,"中文分词"和"英文分词"源码分别针对中文...
中文自动分词算法 中文自动分词算法是自然语言处理中的一项基本技术,旨在将中文文本切分成单个词语,以便更好地进行信息检索、自动标引、自动文摘、机器翻译、语言学研究、搜索引擎研究和自然语言理解等领域的应用...
分词算法 汉语分词介绍分词算法 汉语分词介绍分词算法 汉语分词介绍分词算法 汉语分词介绍分词算法 汉语分词介绍分词算法 汉语分词介绍分词算法 汉语分词介绍分词算法 汉语分词介绍分词算法 汉语分词介绍分词算法 ...
中文分词算法研究,中文分词算法研究,中文分词算法研究
分词算法是中文自然语言处理的基础,其目标是将连续的汉字序列切分成有意义的词语单元。常见的分词算法包括基于规则的方法、基于统计的方法和基于深度学习的方法。例如,最大匹配法(Maximal Matching)、HMM(隐...
中文分词是自然语言处理(NLP)领域中的基础任务,它是将连续的汉字序列切分成具有语义的单个词汇的过程。在这个“中文分词算法研究整理资料”中,我们可以期待找到关于如何处理中文文本,尤其是如何进行有效分词的...
词算法 汉语分词介绍分词算法 汉语分词介绍分词算法 汉语分词介绍分词算法 汉语分词介绍分词算法 汉语分词介绍分词算法 汉语分词介绍分词算法 汉语分词介绍分词算法 汉语分词介绍分词算法 汉语分词介绍分词算法 汉语...
中文分词算法设计 在本文中,我们将讨论中文分词算法的设计和实现。中文分词算法是自然语言处理和信息检索领域中的一个重要问题。本文将从最大匹配法的缺陷开始,讨论中文分词算法的设计目标和实现方法。 1. 最大...
### 基于逆向匹配的中文分词算法 #### 概述 中文分词作为自然语言处理(NLP)的基础任务之一,在信息检索、文本挖掘、机器翻译等领域发挥着至关重要的作用。与英文等西方语言相比,中文没有明确的单词边界标识,...
在中文文本处理中,由于汉字的组合多样性,分词显得尤为重要。本文将围绕"分词算法设计思想"这一主题,详细探讨其核心概念和实现策略。 首先,一个完整的分词系统通常包括词库和分词算法两个关键组成部分。词库是...
Java实现的中文分词算法是自然语言处理领域中的重要技术,尤其在文本挖掘、搜索引擎、信息检索等场景中发挥着关键作用。FMM(Fast Mapping Model)和BMM(Bigram Mapping Model)是两种常见的中文分词算法,它们都是...
在IT领域,分词算法是自然语言处理(NLP)中的关键步骤,它涉及将连续的文本序列划分为有意义的单词或词汇单元。本项目提供了一个C++实现的分词算法实例,对于学习和理解这一过程具有实际价值。以下是关于这个C++...
最大匹配分词算法最大匹配分词算法最大匹配分词算法最大匹配分词算法最大匹配分词算法最大匹配分词算法
《中英文分词算法详解与应用》 分词是自然语言处理中的基础步骤,它将连续的文本序列切分成有意义的词语单元,为后续的文本分析、信息检索、机器翻译等任务提供支持。本文将深入探讨由KaiToo搜索开发的中英文分词...
中文分词是自然语言处理(NLP)领域中的基础任务,它是将连续的汉字序列切分成具有语义意义的词语单元。在这个过程中,中文分词算法扮演着至关重要的角色。本文将详细介绍两种主要的中文分词算法:基于统计的贝叶斯...
中文不同于英文,单词之间没有明显的分隔符,因此在处理中文文本时,我们需要先进行分词,即将连续的汉字序列切分成有意义的词汇单元。Sanford中文分词库是一种常用的分词工具,它基于统计模型,能够根据语料库学习...
中文分词 (Chinese Word Segmentation) 指的是将一个汉字序列切分成一个一个单独的词。分词就是将连续的字序列按照一定的规范重新组合成词序列的过程。 PPT中详细的描述了现有中文分词算法
但不管实现如何,目前而言的分词系统绝大多数都是基于中文词典的匹配算法。其中最为常见的是最大匹配算法 (Maximum Matching,以下简称MM算法) 。MM算法有三种:一种正向最大匹配,一种逆向最大匹配和双向匹配。本...