当前位置:文档之家› 一种快速分词方法

一种快速分词方法

一种快速分词方法
一种快速分词方法

一种基于自动机的分词方法

迟呈英1,战学刚2, 姚天顺2

(1鞍山科技大学计算机学院辽宁鞍山114002,

2东北大学信息学院辽宁沈阳110004)

摘要本文介绍一种简洁有效的快速分词方法,并通过理论分析和实验对比说明几种分词方法的效率差异,以说明我们所提出的方法的有效性。

关键词:中文信息处理,分词,顺序查找,二分查找,自动机,二叉树

分类号:TP 文献标识码

1 引言

西方语言在语句(或从句)内词汇之间存在分割符(空格),而汉语的词汇在语句中是连续排列的。因此,汉语词汇的切分(分词)在中文信息处理的许多应用领域,如机器翻译、文献检索、文献分类、文献过滤、以及词频统计等,是非常重要的第一步。

自动分词是基于字符串匹配的原理进行的。迄今为止,已经有许多文献对各种分词方法进行探讨,其着重点或为分词的速度方面,或为分词的精度方面以及分词的规范。本文主要探讨分词的速度问题,通过实验对比和理论分析,说明我们所提出的算法是有效的。

目前人们所提出的分词方法,在考虑效率问题时,通常在词典的组织方面进行某种调整,以适应相应的算法,如最大匹配法、最小匹配法、逐词遍历法、以及最佳匹配法等。这些方法中,或将词典按词条长度排序或按词频排序,其目的在于协调算法与数据结构,使之效率最高。客观地说,它们都在一定程度上提高了分词的效率。

本文所介绍的是基于词典的最大向前匹配方法。而在数据结构方面,我们则是将词典组织成自动机形式。

2 数据结构与算法

文献[1,2,3]给出了三种基于词典的最大向前匹配方法的分词算法(相应于文献编号,我们以后分别称其对应的算法为算法1、算法2、和算法3)。我们可以把算法1看作是原始算法,把算法2看作是算法1的改进,而算法3则是算法2的进一步优化。在词典的组织方面,算法2和算法3是按照正常的词典排序(即按汉字的机器内码表示排序),并辅以词条的首字索引,以标明以该字起始词条在词典中的首记录。例如,在一般的词典中,词条的形式如下图所示:

图1:一般分词词典的形式

啊啊哈

啊呀

啊哟

阿阿爸

阿斗

阿尔巴尼亚

阿飞

阿富汗

在实际存储时,可以在词尾部分删除首字。这样做不仅节省了存储空间,更重要的是缩短了字符串比较的长度。

算法2和算法3对首字的检索都是基于哈希算法;算法2对于词尾部分采用线性搜索,而算法3则采用二分搜索。采用何种搜索算法应根据所用词典中每个首字下的词条数目确定,一般词条数较小时,二者无明显差异。这是由这两种算法本身的特性决定的。实际词典中许多首字下的词条数目很大,因此,采用二分搜索法较优。我们的实验结果也证实了这一点。

算法2和算法3在词典的组织方面是一致的,即如同普通词典一样,按照汉字的内码递增排序,并以词条的首字建立哈希索引。我们可以将同一首字下的所有词条组织成一个子表结构,如下图所示。

图2:词典的逻辑结构

假设:源文本source_text=“中华人民共和国成立于1949年。”

分词结果=“中华人民共和国/成立/于/1949/年/。”

分词过程为:

1.从源文本source_text中取首字head_word = “中”,并设置已切分词汇

segmented_word = head_word;

2.从索引中查找该首字。若未找到,则暂将该字作为单字词输出;否则,将其后续字

符加入临时变量tail_word =“华”;

3.在以“中”为首字的子表中查找包含tail_word的词条;若查到,则从source_text

中取字,继续加入tail_word中,并继续在子表中查找。在此过程中,如果满足条

件的词条等于当前的tail_word,则置segmented_word = head_word + tail_word;

4.步骤3中的查找失败时,则以当前segmented_word中的字符串作为输出结果。

算法2和算法3的处理思想是一致的,只是在上述第三步的查找中,算法2采用的是顺序查找,而算法3采用的是二分查找。

在本例中,tail_word从“华”递增到“华人民共和国”的过程中,即使不计查找过程中的比较次数,tail_word与词典中的子表项“华”字比较了1次,同“华人民共和国”比较了5次。其比较长度分别为2、4、6、8、10、12。

“华”(segmented_word = “中华”)

“华人”

“华人民”

“华人民共”

“华人民共和”

“华人民共和国”(segmented_word = “中华人民共和国”)

显然,这种比较过程存在冗余的比较操作。例如,“人”字比较了5次,其中后4次的比较是多余的。因为字符串比较所需的时间同字符串的长度成正比,对于较长的词条,这种现象尤为突出。

为了消除这种冗余操作,我们提出将词典的词尾部分以自动机的形式来组织。为此,我们将组成单词的每个字以一种链表节点的形式存储,其抽象数据结构的定义如下:Pnode = ^Tnode;

Tnode = record

Brother: Pnode;

Cchar: String[2];

Accepted: Boolean;

Child: Pnode;

End;

这样,上述的例子中,词典的部分内容形式如下(其中T代表True,F代表False;节点左侧为兄弟链,右侧为孩子链):

图3:改进的词典逻辑结构

显然,这实际上是将词典以二叉树的形式组织起来,只是各节点中增加了接收状态。

在词典中对于特定的首字,前两字相同的词条很少,前三字相同的词条更少。当我们以这种形式组织词典后,除子表的第一层外,各个节点的兄弟数目都很小,对它们的查找采用顺序查找方法较为适宜。对于子表的第一层,则采用二分查找。由于我们无法在一个纯粹的链表结构中进行二分查找,为此,我们可以将子表的首层节点以动态数组形式组织,或装入容器类(Container)的可直接存取的线性表结构中(如C++的vector,Delphi的Tlist等)。

对应于前文所述的算法,其第三步变为:

以二分查找方法在子表首层中查找含tail_word的节点;若查到,从source_text中取后续汉字,继续加入tail_word中,并继续在当前子表的孩子节点中顺序查找该汉字。在此过程中,如果满足条件的节点中Accepted域为真,则置segmented_word = head_word + tail_word;

依此算法,显然不会出现同一词条中的重复比较,且每次比较的字符串(一个汉字)长度均为2。与算法2和算法3相比,在子表首层以下的搜索过程中,每次搜索的范围因词典的组织方式变化而大大缩小,这也在一定程度上提高了分词效率。

3 对比

文献[2,3]都采用了文献[2]所提出的复杂度估算方法,其相应算法的复杂度分别为2.89和1.66。由于在处理3字以上词时搜索空间的缩小(即使对于出现频率最高的双字词,基于最大匹配原则,也需对其后继字符进一步测试比较),本文的算法复杂度显然应低于算法3的1.66。此外,文献[2]所提出的复杂度估算方法并未考虑字符串长度对比较时间的影响。

根据我们的实验测定,算法3比算法2大约快3倍。表1是针对同一组2.576MB文本的分词结果比较,其中的比较次数是指实际调用字符串比较函数的次数,比较总长度是指每次调用字符串比较函数所比较的字符串的总长度,运行环境为Windows2000(奔腾III,800M 主频,256M内存)。

从表1可以看出,算法2比较次数过多,且字符串比较的总长度过大。而算法3的比较次数和字符串比较的总长度均大于本文算法。同一首字下的所有词条组织成的子表的查找,应采用二分查找。这正是算法3优于算法2的关键之处。而本文算法的优势则体现在比较次数的缩小和被比较字符串的长度缩小,绝无多余的比较,从而在总比较长度上占绝对优势。

从实验结果可以看出,分词时间大约与字符串比较的总长度成正比。实际上,我们的多组对比实验表明,随着被处理语料规模的增大,这种线性比例关系表现得更为明显。这也是“字符串比较所需的时间同字符串的长度成正比”这一结论的实际验证。

我们的实验所对比的三种算法均至少用C++和Object Pascal两种语言实现,而且为了对比结果客观公正,所用数据结构和算法的实现细节都尽可能一致。文中的实验数据是Delphi 版本的结果,其中括号内的时间是在用小于运算代替字符串比较函数时的结果(Object Pascal

对字符串的处理能力强于C/C++)。另外,C++的标准模板库(STL)的运行效率很低,我们的其它实验对比表明,C++版本的分词程序在不使用STL时运行速度大约是使用STL时的9倍。

另需说明的是,在本文的算法描述中,为了以文字形式描述方便,引入了几个辅助变量。它们在实际编程时并非必需,例如可以用一些下标变量来完成segmented_word和tail_word 的功能。

4 结论

随着网络技术的不断普及和发展,中文信息处理的某些应用领域,如信息的过滤与检索,对于汉语分词的效率要求越来越高。我们所讨论的快速分词算法,是在中文信息处理的研究与应用中遇到的实际问题。本文主要对比分析了文献[2,3]所提出的算法,指出其冗余的比较操作,并在此基础上提出了改进的词典数据结构和相应的分词算法,以提高分词效率。通过分析和实验,说明了我们所提出的算法的有效性。

参考文献

[1] 揭春雨,刘源,梁南元. 论汉语自动分词方法.中文信息学报,1989,3(1):1~8,1989。1~8

[2] 吴胜远. 一种汉语分词方法计算机研究与发展1996年第4期。306~311

[3] 陈桂林,王永成,韩客松,王刚. 一种改进的快速分词算法. 计算机研究与发展. 2000年第4期:418~424

An Automaton-based Word Segmentation

Method

1Chi Chenying, 2Zhan Xuegang, 2Yao Tianshun

(1Anshan University of Science and Technology, School of Computer Science and Technology,

Anshan, China, 114000;

2Northeastern University, School of Information Science and Engineering, Shenyang, China,

110004)

Abstract This paper proposes a fast method for Chinese word segmentation. Through theoretical analysis and experiment comparison, we show that our method is effective.

Key Words:Chinese Information Processing, Word Segmentation, Sequential Search, Binary Search, Automata, Binary Tree

中文分词切词超详细分析

前面我们讲个搜索引擎如何搜集网页,今天说下第二个过程网页预处理,其中中文分词就显得尤其重要,下面就详细讲解一下搜索引擎是怎么进行网页预处理的: 网页预处理的第一步就是为原始网页建立索引,有了索引就可以为搜索引擎提供网页快照功能;接下来针对索引网页库进行网页切分,将每一篇网页转化为一组词的集合;最后将网页到索引词的映射转化为索引词到网页的映射,形成倒排文件(包括倒排表和索引词表),同时将网页中包含的不重复的索引词汇聚成索引词表。如下图所示: 一个原始网页库由若干个记录组成,每个记录包括记录头部信息(HEAD)和数据(DATA),每个数据由网页头信息(header),网页内容信息(content)组成。索引网页库的任务就是完成给定一个URL,在原始网页库中定位到该URL所指向的记录。 如下图所示:

对索引网页库信息进行预处理包括网页分析和建立倒排文件索引两个部分。中文自动分词是网页分析的前提。文档由被称作特征项的索引词(词或者字)组成,网页分析是将一个文档表示为特征项的过程。在对中文文本进行自动分析前,先将整句切割成小的词汇单元,即中文分词(或中文切词)。切词软件中使用的基本词典包括词条及其对应词频。 自动分词的基本方法有两种:基于字符串匹配的分词方法和基于统计的分词方法。 1) 基于字符串匹配的分词方法 这种方法又称为机械分词方法,它是按照一定的策略将待分析的汉字串与一个充分大的词典中的词条进行匹配,若在词典中找到某个字符串,则匹配成功(识别出一个词)。 按照扫描方向的不同,串匹配分词方法可以分为正向匹配和逆向匹配;按照不同长度优先匹配的情况,可以分为最大或最长匹配,和最小或最短匹配;按照是否与词性标注过程相结合,又可以分为单纯分词方法和分词与标注相结合的一体化方法。常用的几种机械分词方法如下:

中文分词实验

中文分词实验 一、实验目的: 目的:了解并掌握基于匹配的分词方法,以及分词效果的评价方法。 实验要求: 1、从互联网上查找并构建不低于10万词的词典,构建词典的存储结构; 2、选择实现一种机械分词方法(双向最大匹配、双向最小匹配、正向减字最大匹配法等)。 3、在不低于1000个文本文件,每个文件大于1000字的文档中进行中文分词测试,记录并分析所选分词算法的准确率、分词速度。 预期效果: 1、平均准确率达到85%以上 二、实验方案: 1.实验平台 系统:win10 软件平台:spyder 语言:python 2.算法选择 选择正向减字最大匹配法,参照《搜索引擎-原理、技术与系统》教材第62页的描述,使用python语言在spyder软件环境下完成代码的编辑。 算法流程图:

Figure Error! No sequence specified.. 正向减字最大匹配算法流程

Figure Error! No sequence specified.. 切词算法流程算法伪代码描述:

3.实验步骤 1)在网上查找语料和词典文本文件; 2)思考并编写代码构建词典存储结构; 3)编写代码将语料分割为1500个文本文件,每个文件的字数大于1000字; 4)编写分词代码; 5)思考并编写代码将语料标注为可计算准确率的文本; 6)对测试集和分词结果集进行合并; 7)对分词结果进行统计,计算准确率,召回率及F值(正确率和召回率的 调和平均值); 8)思考总结,分析结论。 4.实验实施 我进行了两轮实验,第一轮实验效果比较差,于是仔细思考了原因,进行了第二轮实验,修改参数,代码,重新分词以及计算准确率,效果一下子提升了很多。 实验过程:

一种基于词典的中文分词法的设计与实现

一种基于词典的中文分词法的设计与实 现 摘要:中文分词就是把没有明显分隔标志的中文字串切分为词串,它是其他中文信息处理的基础,广泛应用于搜索引擎、自动翻译、语音合成、自动分类、自动摘要、自动校对等领域。就中文分词的基本方法作了简单阐述,并介绍了一种基于词典采用最大匹配法实现中文分词的方法。 关键词:中文分词;词库索引;正向最大匹配法 1 中文分词 中文分词技术属于自然语言处理技术范畴,对于一句话,人可以通过自己的知识来明白哪些是词,哪些不是词,但如何让计算机也能理解?其处理过程就是分词算法。 1.1中文分词方法的种类 中文自动分词方法有多种,一般来说大致可归结为以下三大类:基于词典的分词方法、基于统计的分词方法、基于规则和基于统计相结合的分词方法[2]。1.1.1基于词典的分词方法。基于词典的分词方法,又叫做基于字符串匹配的分词方法。其基本思想是:事先建立词库,其中包含所有可能出现的词。对于给定的待分词的汉子串Str,按照某种确定的原则切取Str 的子串,若该子串与词库中的某词条相匹配,则该子串是就是词,继续分割其余的部分,直到剩余部分为空;否则,该子串不是词,转到上面重新切取Str的子串进行匹配。1.1.2基于统计的分词方法。基于词典分词方法要借助词典来进行,而中文的构词非常灵活,词的数目几乎是无限的,因此要构造完备的词典几乎是不可能的。鉴于上述分词方法存在的这些缺点,一种基于统计的分词方法应运而生。这种方法撇开词典,根据字串出现的频率来判断这个字串是否是词。该方法对于大的语料,分全率还可以,但是对于小的语料分全率就比较低。该方法的另一个缺点就是不够准确,有些经常一起出现的单字构成的字串其实不是词。但是由于出现的频率很高,就被分出来当作词处理了,而且这样的“词”还非常多, 例如“这一”、“之一”、“有的”、“我的”、“许多的”等。实际应用的统计分词系统都要使用一部基本的分词词典进行串匹配分词,同时使用统计方法识别一些新的词,即将串频统计和串匹配结合起来,既发挥匹配分词切分速度快、效率高的特点,又利用了无词典分词结合上下文识别生词、自动消除歧义的优点。1.1.3基于规则和基于统计相结合的分词方法。该方法首先运用最大匹配作初步切分,然后对切分的边界处进行歧义探测,发现歧义,最后运用统计和规则相结合的方法来判断正确的切分[4]。运用不同的规则解决人名、地名、机构名识别,运用词法结构规则来生成复合词和衍生词。日前这种方法可以解决汉语中最常见的歧义类型:单字交集型歧义。并对人名、地名、机构名、后缀、动词/形容词重叠、衍生词等词法结构进行识别处理,基本解决了分词所面临的最关键的问题。若词典结构和算法设计优秀,分词速度将非常快。 1.2分词中的难题 有了成熟的分词算法,是否就能容易的解决中文分词的问题呢?事实远非如此。中文是一种十分复杂的语言,让计算机理解中文语言更是困难。在中文分词过程中,有两大难题一直没有完全突破。1.2.1歧义识别。歧义是指同样的一句话,可能有两种或者更多的切分方法。例如:“表面的”,因为“表面”和“面的”都是词,那么这个短语就可以分成“表面的”和“表面的”,这种称为交叉歧义,像这种交叉歧义十分常见。“化妆和服装”可以分成“化妆和服装”或者“化妆和服装”。由于没有人的知识去理解,计算机很难知道到底哪个方案正确。交叉歧义

百度中文分词技巧

百度中文分词技巧 什么是中文分词?我们都知道,英文句子都是由一个一个单词按空格分开组成,所以在分词方面就方便多了,但我们中文是一个一个汉字连接而成,所以相对来说是比较复杂的。中文分词指的是将一个汉语句子切分成一个一个单独的词,按照一定的规则重新组合成词序列的过程。这个也称做“中文切词”。 分词对于搜索引擎有着很大的作用,是文本挖掘的基础,可以帮助程序自动识别语句的含义,以达到搜索结果的高度匹配,分词的质量直接影响了搜索结果的精确度。目前搜索引擎分词的方法主要通过字典匹配和统计学两种方法。 一、基于字典匹配的分词方法 这种方法首先得有一个超大的字典,也就是分词索引库,然后按照一定的规则将待分词的字符串与分词库中的词进行匹配,若找到某个词语,则匹配成功,这种匹配有分以下四种方式: 1、正向最大匹配法(由左到右的方向); 2、逆向最大匹配法(由右到左的方向); 3、最少切分(使每一句中切出的词数最小); 4、双向最大匹配法(进行由左到右、由右到左两次扫描) 通常,搜索引擎会采用多种方式组合使用。但这种方式也同样给搜索引擎带来了难道,比如对于歧义的处理(关键是我们汉语的博大精深啊),为了提高匹配的准确率,搜索引擎还会模拟人对句子的理解,达到识别词语的效果。基本思想就是在分词的同时进行句法、语义分析,利用句法信息和语义信息来处理歧义现象。通常包括三个部分:分词子系统、句法语义子系统、总控部分。在总控部分的协调下,分词子系统可以获得有关词、句子等的句法和语义信息来对分词歧义进行判断,即它模拟了人对句子的理解过程。这种分词方法需要使用大量的语言知识和信息,当然我们的搜索引擎也在不断进步。 二、基于统计的分词方法 虽然分词字典解决了很多问题,但还是远远不够的,搜索引擎还要具备不断的发现新的词语的能力,通过计算词语相邻出现的概率来确定是否是一个单独的词语。所以,掌握的上下文越多,对句子的理解就越准确,分词也越精确。举个例子说,“搜索引擎优化”,在字典中匹配出来可能是:搜索/引擎/优化、搜/索引/擎/优化,但经过后期的概率计算,发现“搜索引擎优化”在上下文相邻出现的次数非常多,那么基于统计就会将这个词语也加入进分词索引库。关于这点我在《关于电商与圈的分词测试》就是同样的一个例子。 中文分词的应用分词准确性对搜索引擎来说十分重要,但如果分词速度太慢,即使准确性再高,对于搜索引擎来说也是不可用的,因为搜索引擎需要处理数以亿计的网页,如果分词耗用的时间过长,会严重影响搜索引擎内容更新的速度。因此对于搜索引擎来说,分词的准确性和速度,二者都需要达到很高的要求。 参考文档及网站: https://www.doczj.com/doc/6c17165090.html, https://www.doczj.com/doc/6c17165090.html, https://www.doczj.com/doc/6c17165090.html, https://www.doczj.com/doc/6c17165090.html,

分词工具比较

IKAnalyzer IKAnalyzer是一个开源的,基于java语言开发的轻量级的中文分词工具包。从2006年12月推出1.0版开始,IKAnalyzer已经推出了3个大版本。最初,它是以开源项目Luence为应用主体的,结合词典分词和文法分析算法的中文分词组件。新版本的IKAnalyzer3.0则发展为面向Java的公用分词组件,独立于Lucene 项目,同时提供了对Lucene的默认优化实现。 语言和平台:基于java 语言开发,最初,它是以开源项目Luence 为应用主体的,结合词典分词和文法分析算法的中文分词组件。新版本的IKAnalyzer 3.0 则发展为面向 Java 的公用分词组件,独立于 Lucene 项目,同时提供了对Lucene 的默认优化实现。 算法:采用了特有的“正向迭代最细粒度切分算法”。采用了多子处理器分析模式,支持:英文字母( IP 地址、 Email 、 URL )、数字(日期,常用中文数量词,罗马数字,科学计数法),中文词汇(姓名、地名处理)等分词处理。优化的词典存储,更小的内存占用。支持用户词典扩展定义。针对 Lucene 全文检索优化的查询分析器 IKQueryParser ;采用歧义分析算法优化查询关键字的搜索排列组合,能极大的提高 Lucene 检索的命中率。 性能:60 万字 / 秒 IKAnalyzer基于lucene2.0版本API开发,实现了以词典分词为基础的正反向全切分算法,是LuceneAnalyzer接口的实现。该算法适合与互联网用户的搜索习惯和企业知识库检索,用户可以用句子中涵盖的中文词汇搜索,如用"人民"搜索含"人民币"的文章,这是大部分用户的搜索思维;不适合用于知识挖掘和网络爬虫技术,全切分法容易造成知识歧义,因为在语义学上"人民"和"人民币"是完全搭不上关系的。 je-anlysis的分词(基于java实现) 1. 分词效率:每秒30万字(测试环境迅驰1.6,第一次分词需要1-2秒加载词典) 2. 运行环境: Lucene 2.0 3. 免费安装使用传播,无限制商业应用,但暂不开源,也不提供任何保证 4. 优点:全面支持Lucene 2.0;增强了词典维护的API;增加了商品编码的匹配;增加了Mail地址的匹配;实现了词尾消歧算法第二层的过滤;整理优化了词库; 支持词典的动态扩展;支持中文数字的匹配(如:二零零六);数量词采用“n”;作为数字通配符优化词典结构以便修改调整;支持英文、数字、中文(简体)混合分词;常用的数量和人名的匹配;超过22万词的词库整理;实现正向最大匹配算法;支持分词粒度控制 ictclas4j ictclas4j中文分词系统是sinboy在中科院张华平和刘群老师的研制的FreeICTCLAS的基础上完成的一个java开源分词项目,简化了原分词程序的复

基于二级Hash的快速最长匹配分词算法

基于二级Hash的快速最长匹配分词算法 殷鹏程,谭献海 西南交通大学,四川成都(610031) E-mail:ypc_swjtu@https://www.doczj.com/doc/6c17165090.html, 摘要:中文分词是中文信息处理的基础,在海量的中文信息处理中,分词速度至关重要。本文根据中文单词的特点,通过分析现有词典分词算法,提出了一种基于二级Hash的快速最长匹配分词算法。试验结果表明,该算法保证了分词的最长匹配,同时提高了分词的速度,适用于小型搜索引擎和自动文本分类等应用。 关键词:中文分词;Hash词典;最长匹配 1. 引言 在中文信息处理中, 如机器翻译、自动分类等等,词是最小的具有独立活动的有意义的语言成分。然而中文文本在计算机内部表示时,不像英文中词与词之间都有空格隔开,中文词与词之间没有明显的分隔标记, 而是连续的汉字串。因此, 自动识别词的边界, 将连续的汉字串切分为带有分割标记的词串将是实现中文信息处理的首要问题。 现有的分词算法可分为三大类:基于词典的分词方法、基于理解的分词方法和基于统计的分词方法。无论哪种分词方法都需要将大量时间用于将待切分语句的切分为可能的词,然后再依据统计或语法方面的规则对切分出的词进行处理,得到一种最有可能的切分结果。如果能加快初始切分的速度,对于提高整个分词算法的速度也会有很大帮助。由于词语信息都以词典的形式存储, 所以在整个汉语分词过程中, 都需要频繁地访问词典以获得词语信息。因此词典的查询速度是整个分词系统处理效率的关键所在。 现行常用的词典数据结构主要基于Hash方法和索引树方法,根据汉字编码的一对一映射关系,实现了词典的快速查询,但两种方法在构造词典时都没有考虑词语的长度这个关键信息,因此不适合最长匹配算法。本文在Hash方法的基础上,提出一种新的词典结构,不仅对词语的首字进行Hash,而且根据词语的长度进行二次Hash。实验证明,新的词典结构不仅提高了分词速度,而且满足最长匹配的分词需求。 2.二级Hash词典的设计 为了提高分词的准确度,基于词典的分词方法通常采用最长匹配算法。实验证明,如果分成的词语越长、分出的词语越少,分词的精确度就越高。通常基于Hash方法的词典只对词语的首字符进行了Hash,这样的词典虽然能实现快速查询,但是如果采用最长匹配算法,则需要对词典进行多次查询,影响算法速度。为了使词典更适合最长匹配算法,通过对对汉字编码体系、汉语词语特点的分析,针对传统Hash词典的缺点,本文设计了一种基于二级Hash的词典结构。 2.1 汉字编码体系 汉字在计算机内部是以内码的形式进行存储的,汉字内码是汉字在汉字信息处理系统中最基本的表达形式,它与汉字交换码、汉字区位码有一定的对应关系。由于自定义编码顺序的特殊性,因而,可通过计算偏移量的方法来定位该汉字在编码表中任意的位置。国标GB2312汉字编码表共收录了6763个汉字,汉字在编码表中的偏移量计算公式如下: offset = (ch1 – 0xB0) * 94 + (ch2 – 0xA1) (1) 其中,offset代表某汉字在编码表中的位置, ch1、ch2代表汉字的内部码。 2.2 汉语词的特点

百度_baidu_搜索分词算法

Baidu查询分词算法 查询处理以及分词技术 如何设计一个高效的搜索引擎?我们可以以百度所采取的技术手段来探讨如何设计一个实用的搜索引擎.搜索引擎涉及到许多技术点,比如查询处理,排序算法,页面抓取算法,CACHE机制,ANTI-SPAM等等.这些技术细节,作为商业公司的搜索引擎服务提供商比如百度,GOOGLE等是不会公之于众的.我们可以将现有的搜索引擎看作一个黑盒,通过向黑盒提交输入,判断黑盒返回的输出大致判断黑盒里面不为人知的技术细节. 查询处理与分词是一个中文搜索引擎必不可少的工作,而百度作为一个典型的中文搜索引擎一直强调其”中文处理”方面具有其它搜索引擎所不具有的关键技术和优势.那么我们就来看看百度到底采用了哪些所谓的核心技术. 我们分两个部分来讲述:查询处理/中文分词. 一. 查询处理 用户向搜索引擎提交查询,搜索引擎一般在接受到用户查询后要做一些处理,然后在索引数据库里面提取相关的信息.那么百度在接受到用户查询后做了些什么工作呢? 1. 假设用户提交了不只一个查询串,比如”信息检索理论工具”.那么搜 索引擎首先做的是根据分隔符比如空格,标点符号,将查询串分割成若干子查询串,比如上面的查询就会被解析为:<信息检索,理论,工具>三个子字符串;这个道理 简单,我们接着往下看. 2. 假设提交的查询有重复的内容,搜索引擎怎么处理呢?比如查询”理论 工具理论”,百度是将重复的字符串当作只出现过一次,也就是处理成等价的”理论工具”,而GOOGLE显然是没有进行归并,而是将重复查询子串的权重增大进行处理.那么是如何得出这个结论的呢?我们可以将”理论工具”提交给百度,返回341,000篇文档,大致看看第一页的返回内容.OK.继续,我们提交查询”理论工具理论”,在看看返回结果,仍然是那么多返回文档,当然这个不能说明太多问题,那 看看第一页返回结果的排序,看出来了吗?顺序完全没有变化,而GOOGLE则排序有些变动,这说明百度是将重复的查询归并成一个处理的,而且字符串之间的先后出现顺序基本不予考虑(GOOGLE是考虑了这个顺序关系的). 3. 假设提交的中文查询包含英文单词,搜索引擎是怎么处理的?比如查询”电影BT下载”,百度的方法是将中文字符串中的英文当作一个整体保留,并以此为断点将中文切分开,这样上述的查询就切为<电影,BT,下载>,不论中间的英文是否一个字典里能查到的单词也好,还是随机的字符也好,都会当作一个整体来对待.

中文分词技术

一、为什么要进行中文分词? 词是最小的能够独立活动的有意义的语言成分,英文单词之间是以空格作为自然分界符的,而汉语是以字为基本的书写单位,词语之间没有明显的区分标记,因此,中文词语分析是中文信息处理的基础与关键。 Lucene中对中文的处理是基于自动切分的单字切分,或者二元切分。除此之外,还有最大切分(包括向前、向后、以及前后相结合)、最少切分、全切分等等。 二、中文分词技术的分类 我们讨论的分词算法可分为三大类:基于字典、词库匹配的分词方法;基于词频度统计的分词方法和基于知识理解的分词方法。 第一类方法应用词典匹配、汉语词法或其它汉语语言知识进行分词,如:最大匹配法、最小分词方法等。这类方法简单、分词效率较高,但汉语语言现象复杂丰富,词典的完备性、规则的一致性等问题使其难以适应开放的大规模文本的分词处理。第二类基于统计的分词方法则基于字和词的统计信息,如把相邻字间的信息、词频及相应的共现信息等应用于分词,由于这些信息是通过调查真实语料而取得的,因而基于统计的分词方法具有较好的实用性。 下面简要介绍几种常用方法: 1).逐词遍历法。 逐词遍历法将词典中的所有词按由长到短的顺序在文章中逐字搜索,直至文章结束。也就是说,不管文章有多短,词典有多大,都要将词典遍历一遍。这种方法效率比较低,大一点的系统一般都不使用。 2).基于字典、词库匹配的分词方法(机械分词法) 这种方法按照一定策略将待分析的汉字串与一个“充分大的”机器词典中的词条进行匹配,若在词典中找到某个字符串,则匹配成功。识别出一个词,根据扫描方向的不同分为正向匹配和逆向匹配。根据不同长度优先匹配的情况,分为最大(最长)匹配和最小(最短)匹配。根据与词性标注过程是否相结合,又可以分为单纯分词方法和分词与标注相结合的一体化方法。常用的方法如下: (一)最大正向匹配法 (MaximumMatchingMethod)通常简称为MM法。其基本思想为:假定分词词典中的最长词有i个汉字字符,则用被处理文档的当前字串中的前i个字作为匹配字段,查找字典。若字典中存在这样的一个i字词,则匹配成功,匹配字段被作为一个词切分出来。如果词典中找不到这样的一个i字词,则匹配失败,将匹配字段中的最后一个字去掉,对剩下的字串重新进行匹配处理……如此进行下去,直到匹配成功,即切分出一个词或剩余字串的长度为零为止。这样就完成了一轮匹配,然后取下一个i字字串进行匹配处理,直到文档被扫描完为止。

分词方法详解

《汉语分词的主要技术及其应用展望》 一、汉语自动分词的提出 词具有语音、语义和结构三大特征,其语义特征表现在必须具备一定的意义,表明客观现实中的某一事物的性质、特征、行为和关系等,没有意义的词是不存在的。词里包含有两种不同性质的意义:词汇意义和语法意义。词的结构特征表现在词在结构上是一个不可分割的整体,其意义不是它的几个构成成分(如果存在的话)的意义的简单总和。 人们在阅读时,大脑有一个模糊的分词过程,它是与视觉到声音的转换和语义理解交叉或同时进行的,并以语感的形式体现出来,由于文化修养和知识水平的差异,不同的人对词和非词,词和词组的预感差别很大。因而人工分词的同一性得不到保证。北京航空学院曾做过一个实验,三十余个具有高中文化水平的青年对五百字的一个语言材料人工分词,同一率只有50%左右。在大篇文字材料处理时,人工分词不仅速度慢,长时间单调枯燥工作也使错误切分次数大大增加。这些都表明人工分词不能满足汉字处理现代化的要求,但要对书面汉语实现计算机自动分词,并非易事,这与汉语特性有很大关系。与印欧语系相比,现代汉语至少在四个方面于分词不利:第一,汉语的词不分写,而且词无明确的形态标志,这给计算机进行汉语的词法分析带来一大障碍。其次,汉语是一种无形态变化的分析型语言,缺乏明显的句法形式标记,其语法主要靠虚词和不同的词序来实现。第三,汉语的形态不发达,增加了语言的表层结构对语义的依赖性,所以,汉语句子成分的语法作用强烈依赖于该成分的意义。第四,汉语构词具有极大的灵活性和自由性。只要词汇意义和语言习惯允许,就能组合起来,没有限制。如果在自动分词处理时,既不进行语法分析,也不进行语义理解,只是机械的匹配比较,那很容易实现,但必然会出现许多错误切分,而要提高分词精度,就必须进行语法分析和语义理解,于是就引发了一系列耐人寻味的问题。 汉语词自动切分是计算机中文信息处理的第一步,也是计算机科学界、语言文字学界以及信息管理学界所面临的挑战性难题,这一“瓶颈”的解决是计算机自然语言理解、人工智能、信息检索、机器翻译和自动文摘等领域突破的关键, 长期以来一直困扰着这一研究领域的许多专家学者。尽管汉语词自动切分研究已经取得了可喜的进展,但是在汉语词的规范、自动分词算法突破、切分歧义处理、自然语言理解和人工智能等诸多领域还存在着难以克服的阻碍,仍需要多个学科领域的专家学者们通力协作,才能获得新的突破。 二、现有的分词方法 为了克服汉语词计算机自动切分这一难题, 许多年来, 大量的学者都加入 了这一领域的研究, 使汉语自动分词取得了丰硕的研究成果。近年来, 语言学 界、人工智能领域和情报检索界的学者们, 在汉语自动分词与自动标引的研究 与实践上进行了大量的研究, 找到了许多解决汉语分词的方法,归纳起来有: 最大匹配法、逆向最大匹配法、逐词遍历法、设立切分标志法、最佳匹配法、 有穷多层次列举法、二次扫描法、高频优先分词法、基于期望的分词法、联想 ——回溯法、双向扫描法、邻接约束法、扩充转移网络分词法、语境相关法、

搜索引擎优化百度分词算法分析

搜索引擎优化百度分词算法分析查询处理以及分词技术 随着搜索经济的崛起,人们开始越加关注全球各大搜索引擎的性能、技术和日流量。作为企业,会根据搜索引擎的知名度以及日流量来选择是否要投放丿告等; 作为普通网民,会根据搜索引擎的性能和技术来选择自己喜欢的引擎查找资料;作为技术人员,会把有代表性的搜索引擎作为研究对象。搜索引擎经济的崛起,又一次向人们证明了网络所蕴藏的巨大商机。网络离开了搜索将只剩下空洞杂乱的数据,以及大量等待去费力挖掘的金矿。 但是,如何设计一个高效的搜索引擎?我们可以以百度所采取的技术手段来探讨如何设计一个实用的搜索引擎。搜索引擎涉及到许多技术点,比如查询处理,排序算法,页面抓取算法,CACH机制,ANTI-SPAM等等。这些技术细节,作为商业公司的搜索引擎服务提供商比如百度,GOOGL等是不会公之于众的。 我们可以将现有的搜索引擎看作一个黑盒,通过向黑盒提交输入,判断黑盒返回的输出大致判断黑盒里面不为人知的技术细节。 查询处理与分词是一个中文搜索引擎必不可少的工作,而百度作为一个典型的中文搜索引擎一直强调其"中文处理"方面具有其它搜索引擎所不具有的关键技术和优势。那么我们就来看看百度到底采用了哪些所谓的核心技术。 我们分两个部分来讲述:查询处理/中文分词。 一、查询处理 用户向搜索引擎提交查询,搜索引擎一般在接受到用户查询后要做一些处理,然后在索引数据库里面提取相关的信息。那么百度在接受到用户查询后做了些什么工作呢? 1、假设用户提交了不只一个查询串,比如"信息检索理论工具"。 那么搜索引擎首先做的是根据分隔符比如空格,标点符号,将查询串分割成若

干子查询串,比如上面的查询就会被解析为:信息检索,理论,工具三个子字符串;这个道理简单,我们接着往下看。 2、假设提交的查询有重复的内容,搜索引擎怎么处理呢?比如查询"理论工具理论",百度是将重复的字符串当作只出现过一次,也就是处理成等价的"理 论工具",而GOOGL显然是没有进行归并,而是将重复查询子串的权重增大进行处理。那么是如何得出这个结论的呢?我们可以将"理论工具"提交给百度,返回341,000篇文档,大致看看第一页的返回内容。 OK继续,我们提交查询"理论工具理论",在看看返回结果,仍然是那么多返回文档,当然这个不能说明太多问题,那看看第一页返回结果的排序,看出来了吗?顺序完全没有变化,而GOOGL E排序有些变动,这说明百度是将重复的查询归并成一个处理的,而且字符串之间的先后出现顺序基本不予考虑(GOOGL是考虑了这个顺序关系的)。 3、假设提交的中文查询包含英文单词,搜索引擎是怎么处理的?比如查询" 电影BT下载",百度的方法是将中文字符串中的英文当作一个整体保留,并以 此为断点将中文切分开,这样上述的查询就切为电影,BT,下载,不论中间的 英文是否一个字典里能查到的单词也好,还是随机的字符也好,都会当作一个整体来对待。至于为什么,你用查询"电影dfdfdf下载"看看结果就知道了。当然如果查询中包含数字,也是如此办理。 到目前为止,一切很简单,也很清楚,百度怎么处理用户查询的呢?归纳如下:首先根据分割符号将查询分开,然后看看是否有重复的字符串,如果有,就抛弃多余的,只保留一个,接着判断是否有英文或者数字,如果有的话,把英文或者数字当作一个整体保留并把前后的中文切开。 接着该干什么呢?该考虑分词的问题了。 二、中文分词 首先,讲讲百度的分词时机或者条件问题,是否是个中文字符串百度就拿来切一下呢?非也,要想被百度的分词程序荣幸的切割一下也是要讲条件的,哪能是个字符串就切割啊?你当百度是卖锯条的么?

分词算法

中文分词 一、概述 什么是中文分词 众所周知,英文是以词为单位的,词和词之间是靠空格隔开,而中文是以字为单位,句子中所有的字连起来才能描述一个意思。例如,英文句子I am a student,用中文则为:“我是一个学生”。计算机可以很简单通过空格知道student是一个单词,但是不能很容易明白“学”、“生”两个字合起来才表示一个词。把中文的汉字序列切分成有意义的词,就是中文分词,有些人也称为切词。我是一个学生,分词的结果是:我是一个学生。 中文分词技术 中文分词技术属于自然语言处理技术范畴,对于一句话,人可以通过自己的知识来明白哪些是词,哪些不是词,但如何让计算机也能理解?其处理过程就是分词算法。 现有的分词算法可分为三大类:基于字符串匹配的分词方法、基于理解的分词方法和基于统计的分词方法。 1、基于字符串匹配的分词方法 这种方法又叫做机械分词方法,它是按照一定的策略将待分析的汉字串与一个“充分大的”机器词典中的词条进行配,若在词典中找到某个字符串,则匹配成功(识别出一个词)。按照扫描方向的不同,串匹配分词方法可以分为正向匹配和逆向匹配;按照不同长度优先匹配的情况,可以分为最大(最长)匹配和最小(最短)匹配;按照是否与词性标注过程相结合,又可以分为单纯分词方法和分词与标注相结合的一体化方法。常用的几种机械分词方法如下: 1)正向最大匹配法(由左到右的方向); 2)逆向最大匹配法(由右到左的方向); 3)最少切分(使每一句中切出的词数最小)。 还可以将上述各种方法相互组合,例如,可以将正向最大匹配方法和逆向最大匹配方法结合起来构成双向匹配法。由于汉语单字成词的特点,正向最小匹配和逆向最小匹配一般很少使用。一般说来,逆向匹配的切分精度略高于正向匹配,遇到的歧义现象也较少。统计结果表明,单纯使用正向最大匹配的错误率为1/169,单纯使用逆向最大匹配的错误率为1/245。但这种精度还远远不能满足实际的需要。实际使用的分词系统,都是把机械分词作为一种初分手段,还需通过利用各种其它的语言信息来进一步提高切分的准确率。 一种方法是改进扫描方式,称为特征扫描或标志切分,优先在待分析字符串中识别和切分出一些带有明显特征的词,以这些词作为断点,可将原字符串分为较小的串再来进机

中文搜索引擎的自动分词算法

中文搜索引擎的自动分词算法 !"#$%&’#(#($)!*+$’(#,-.$/#,01,()0.01,&’&2#0’30&’2,4)+()0 蒋 微5 西南财经大学成都 67889:; <摘要=提出了基于关键词搜索的两种自动分词算法>均以双词及三词作为搜索的最小单位5或基本单位;> 一种以栈实现?一种不借助栈且动态匹配实现>通过此两种算法均可进行发布网站@网页前网名入数据库的关键词标识提取及实现匹配后有效性的确认?以提高中文搜索引擎的搜索准确率及获得由网名入数据库前后同步性决定的快速响应>< 关键词=中文搜索引擎?自动分词?栈?非栈?关键词搜索 !A 3B C !1B D E FG H I F J G K I L I L F MG N O F K L I P Q RS G R T UF MV T W E F K UR T G K X P L M OG K TO L Y T ML MI P L RG K I L X N T ?L ME P L X PI E FE F K U RF K I P K T T E F K U R G K T H R T U G R I P T Q L M L Q H Q H M L I 5F K S G R L X H M L I ;L MR T G K X P L M O ?F M T L R L Q J N T Q T M I T U S W H R T F Z R I G X V ?G M U I P T F I P T K L R M F I S H I S W I P T E G W F Z U W M G Q L X Q G I X P L M O [\F I PG N O F K L I P Q R X G MT ]I K G X I I P T V T W E F K U L U T M I L Z L X G I L F MZ K F Q G M T I E F K VM G Q T T M I T K L M O I P T U G I G S G R T S T Z F K T S K F G U X G R I M T I M F U ?Z K F M I J G O T ?G M U X F M Z L K Q I P T Y G N L U L I W G Z I T K Q G I X P L M O R F G R I F L Q J K F Y T I P T P L O PG X X H K G X W F Z ^P L M T R T X P G K G X I T K R T G K X P T M O L M OG M UG X P L T Y T _H L X VK T R J F M R T U T I T K Q L M T US WR W M X P K F M L R Q S T Z F K T G M UG Z I T K M T I E F K VM G Q T T M I T K L M OI P T U G I G S G R T [‘4a bc C d 3^P L M T R T X P G K G X I T K R T G K X PT M O L M O ?G H I F J G K I L I L F M ?R I G X V ?M F M R I G X V ?V T W E F K UR T G K X P 自动分词系统是为中文搜索做预期和基础性的工作>通过常用词库的支持?它能在一定程度上智能地根据用户需要搜索到相关网站@网页及内容>本文将以类^语言描述两种不同的分词算法> e 算法的支撑 e [e 操作对象 定义75双词;f 存在于词库中以两个字构成的常用词> 定义g 5三词;f 存在于词库中以三个字构成的常用词> 算法的操作对象?即基本单位为双词或三词>范围缩小的依据为f h 单字词应以直接匹配的方式实现i j 四字或五字构成的词可用直接匹配的方式实现?其中可分解成若干双词或三词的词也可用逻辑组合的方式实现搜索> e [k 基本词词性针对网名?l 自动分词m 的分词范围缩小在动词和名词上? 其余为非重要成分>e [n 词库 作为自动分词系统的基础和载体?词库是必然的>要求对汉语常用词作穷举式的逐一调整录入?并以名词和动词进行分类得到词库>词库是本文算法的前提> k 算法的实现 k [e 算法 k [e [e 算法框架 此算法从左至右?以双词为基准?向右扩展>若发 现同一个字或一个词包含在左右相邻的两常用词内?则经判断分析?筛选出合乎逻辑的关键词入关键词组? 防止了l 断章取义m 的可能>特点为实现了无回溯的确定性算法> 注意f 此算法以双词为研究起点?同时进行关键词为三个字的词即三词的提取>前两字不为词?三个字才 为词的情况由子程序X P G K o p T ]I qF K U 5X F M R I X P G K o ;解决> k [e [k 算法的实现 变量说明f R H Q rr 关键词计数器> s \ rr 作为当前基准的双词对象>V T W t u rr 关键词组>v D r 当前双词向右扩展一位所得为三词> \ r 当前双词的右两个字组成双词>w r 当前双词的右字向右扩展一位成双词> D r 当前双词的右三个字组成三词> o g 88g 8789收到?g 88g 8x g y 改回 oo 蒋微?女?7y z 7年生?y y 级在读本科生? 攻读方向f 信息工程?信息管理>{6g {5 总g z z ;中文搜索引擎的自动分词算法 g 88g 年

中文分词算法

1 最大匹配法(Forward Maximum Matching method, FMM法):选取包含6-8个汉字的符号串作为最大符号串,把最大符号串与词典中的单词条目相匹配,如果不能匹配,就削掉一个汉字继续匹配,直到在词典中找到相应的单词为止。匹配的方向是从右向左。 逆向最大匹配法(Backward Maximum Matching method, BMM法):匹配方向与MM法相反,是从左向右。实验表明:对于汉语来说,逆向最大匹配法比最大匹配法更有效。 给定串:我是中国人 从左往右最长匹配优先: 读入‘我’,一个字当然是一个词 再读入‘是’,查表找‘我是’,不在表中,则‘我’是一个独立的词,‘是’还要下一步判断 读入‘中’‘是中’肯定不在表内,那‘是’也是一个独立的词,‘中’还要下一步判断 读入‘果’,‘中国’在表内 再读入‘人’,’中国人‘也在表内, 此时全部读完,’中国人‘是一个次 结果就是:我是中国人 从右往左也类似 最近折腾毕业论文,搞得人没心情写blog了。于是觉得不如把毕业论文里的东西贴出来当blog算了。这里主要介绍了我自己的中文分词算法,我觉得它比现在开源代码比较多的中文匹配法要好多了。这里的内容没有任何背景知识啥的,毕竟论文里的背景知道我也是从网上粘贴的,呵呵!因此这篇文章的内容可能适合做搜索引擎的人。如果要了解中文分词算法在搜索引擎中的重要性,或者最大匹配法的思想与过程,请去网上搜吧,资料还是蛮多的。 1.1.1 最大匹配法分词的缺陷 尽管最大匹配法分词是常用的解决的方案,但是无疑它存在很多明显的缺陷,这些缺陷也限制了最大匹配法在大型搜索系统中的使用频率。最大匹配法的问题有以下几点: 一、长度限制 由于最大匹配法必须首先设定一个匹配词长的初始值,这个长度限制是最大匹配法在效率与词长之间的一种妥协。我们来看一下以下两种情况:

hanlp中文分词器解读

中文分词器解析hanlp分词器接口设计:

提供外部接口: 分词器封装为静态工具类,并提供了简单的接口

标准分词是最常用的分词器,基于HMM-Viterbi实现,开启了中国人名识别和音译人名识别,调用方法如下: HanLP.segment其实是对StandardTokenizer.segment的包装。 /** * 分词 * * @param text 文本 * @return切分后的单词 */ publicstatic Listsegment(String text) { return StandardTokenizer.segment(text.toCharArray()); } /** * 创建一个分词器
* 这是一个工厂方法
* 与直接new一个分词器相比,使用本方法的好处是,以后HanLP升级了,总能用上最合适的分词器 * @return一个分词器 */ publicstatic Segment newSegment() }

publicclass StandardTokenizer { /** * 预置分词器 */ publicstaticfinalSegment SEGMENT = HanLP.newSegment(); /** * 分词 * @param text 文本 * @return分词结果 */ publicstatic Listsegment(String text) { return SEGMENT.seg(text.toCharArray()); } /** * 分词 * @param text 文本 * @return分词结果 */ publicstatic Listsegment(char[]text) { return SEGMENT.seg(text); } /** * 切分为句子形式 * @param text 文本

中文分词方法

分词算法设计中的几个基本原则: 1、颗粒度越大越好:用于进行语义分析的文本分词,要求分词结果的颗粒度越大,即单词的字数越多,所能表示的含义越确切,如:“公安局长”可以分为“公安局长”、“公安局长”、“公安局长”都算对,但是要用于语义分析,则“公安局长”的分词结果最好(当然前提是所使用的词典中有这个词) 2、切分结果中非词典词越少越好,单字字典词数越少越好,这里的“非词典词”就是不包含在词典中的单字,而“单字字典词”指的是可以独立运用的单字,如“的”、“了”、“和”、“你”、“我”、“他”。例如:“技术和服务”,可以分为“技术和服务”以及“技术和服务”,但“务”字无法独立成词(即词典中没有),但“和”字可以单独成词(词典中要包含),因此“技术和服务”有1个非词典词,而“技术和服务”有0个非词典词,因此选用后者。 3、总体词数越少越好,在相同字数的情况下,总词数越少,说明语义单元越少,那么相对的单个语义单元的权重会越大,因此准确性会越高。 下面详细说说正向最大匹配法、逆向最大匹配法和双向最大匹配法具体是如何进行的: 先说说什么是最大匹配法:最大匹配是指以词典为依据,取词典中最长单词为第一个次取字数量的扫描串,在词典中进行扫描(为提升扫描效率,还可以跟据字数多少设计多个字典,然后根据字数分别从不同字典中进行扫描)。例如:词典中最长词为“中华人民共和国”共7个汉字,则最大匹配起始字数为7个汉字。然后逐字递减,在对应的词典中进行查找。 下面以“我们在野生动物园玩”详细说明一下这几种匹配方法: 1、正向最大匹配法: 正向即从前往后取词,从7->1,每次减一个字,直到词典命中或剩下1个单字。 第1次:“我们在野生动物”,扫描7字词典,无

英文分词的算法和原理

英文分词的算法和原理 根据文档相关性计算公式 TF-IDF:https://www.doczj.com/doc/6c17165090.html,/210.htm BM25:https://www.doczj.com/doc/6c17165090.html,/211.htm 分词质量对于基于词频的相关性计算是无比重要的 英文(西方语言)语言的基本单位就是单词,所以分词特别容易做,只需要3步:l 根据空格/符号/段落分隔,得到单词组 l 过滤,排除掉stop word l 提取词干 第一步:按空格/符号分词 用正则表达式很容易 pattern = r'''(?x) # set flag to allow verbose regexps ([A-Z]\.)+ # abbreviations, e.g. U.S.A. | \w+(-\w+)* # words with optional internal hyphens | \$?\d+(\.\d+)?%? # currency and percentages, e.g. $12.40, 82% | \.\.\. # ellipsis | [][.,;"'?():-_`] # these are separate tokens ''' re.findall(pattern,待分词文本) 第二步:排除stop word stopword就是类似a/an/and/are/then 的这类高频词,高频词会对基于词频的算分公式产生极大的干扰,所以需要过滤

第三步:提取词干 词干提取(Stemming) 这是西方语言特有的处理,比如说英文单词有单数复数的变形,-ing和-ed的变形,但是在计算相关性的时候,应该当做同一个单词。比如apple和apples,doing和done是同一个词,提取词干的目的就是要合并这些变态 Stemming有3大主流算法 Porter Stemming Lovins stemmer Lancaster Stemming Lucene 英文分词自带了3个stemming算法,分别是 EnglishMinimalStemmer 著名的Porter Stemming KStemmer 词干提取算法并不复杂,要么是一堆规则,要么用映射表,编程容易,但是必须是这种语言的专家,了解构词法才行啊 https://www.doczj.com/doc/6c17165090.html,/demo/stem/ 是一个在线试验词干提取算法的网站 Lemmatisation Lemmatisation是和词干提取(Stemming) 齐名的一个语言学名词,中文可以叫做词形还原,就是通过查询字典,把"drove" 还原到"drive" 而stemming会把单词变短,"apples","apple"处理之后都变成了"appl" wikipedia关于词形还原的简介 European languages lemmatizer 一个c语言的lib 做计算机语言学研究才会涉及到lemmatization,我个人觉得做搜索完全可以不考虑,Stemming已经可以解决大问题了 参考

相关主题
文本预览
相关文档 最新文档