文档库 最新最全的文档下载
当前位置:文档库 › 中文分词入门之最大匹配法

中文分词入门之最大匹配法

中文分词入门之最大匹配法
中文分词入门之最大匹配法

中文分词入门之最大匹配法

发表于2009年01月12号由52nlp

中文分词在中文信息处理中是最最基础的,无论机器翻译亦或信息检索还是其他相关应用,如果涉及中文,都离不开中文分词,因此中文分词具有极高的地位。中文分词入门最简单应该是最大匹配法了,当年师兄布置给我的第一个学习任务就是实现最大匹配法的分词算法(正向、逆向)。记得当时对自己参考学习最有帮助的是北大詹卫东老师“中文信息处理基础”的课件和源程序,不过他实现的是mfc程序,词表存储在数据库里。自己实现时用纯c++实现,利用hash_map 存储词表。这里我介绍一下相关的知识和一个简单的程序示例,部分参考自詹老师的讲义。

正向最大匹配法算法如下所示:

(注:以上最大匹配算法图来自于詹老师讲义)

逆向匹配法思想与正向一样,只是从右向左切分,这里举一个例子:

输入例句:S1=”计算语言学课程有意思” ;

定义:最大词长MaxLen = 5;S2= ” “;分隔符= “/”;

假设存在词表:…,计算语言学,课程,意思,…;

最大逆向匹配分词算法过程如下:

(1)S2=”";S1不为空,从S1右边取出候选子串W=”课程有意思”;

(2)查词表,W不在词表中,将W最左边一个字去掉,得到W=”程有意思”;

(3)查词表,W不在词表中,将W最左边一个字去掉,得到W=”有意思”;

(4)查词表,W不在词表中,将W最左边一个字去掉,得到W=”意思”

(5)查词表,“意思”在词表中,将W加入到S2中,S2=” 意思/”,并将W从S1中去掉,此时S1=”计算语言学课程有”;

(6)S1不为空,于是从S1左边取出候选子串W=”言学课程有”;

(7)查词表,W不在词表中,将W最左边一个字去掉,得到W=”学课程有”;

(8)查词表,W不在词表中,将W最左边一个字去掉,得到W=”课程有”;

(9)查词表,W不在词表中,将W最左边一个字去掉,得到W=”程有”;

(10)查词表,W不在词表中,将W最左边一个字去掉,得到W=”有”,这W是单字,将W 加入到S2中,S2=“ /有/意思”,并将W从S1中去掉,此时S1=”计算语言学课程”;

(11)S1不为空,于是从S1左边取出候选子串W=”语言学课程”;

(12)查词表,W不在词表中,将W最左边一个字去掉,得到W=”言学课程”;

(13)查词表,W不在词表中,将W最左边一个字去掉,得到W=”学课程”;

(14)查词表,W不在词表中,将W最左边一个字去掉,得到W=”课程”;

(15)查词表,“意思”在词表中,将W加入到S2中,S2=“课程/ 有/ 意思/”,并将W从S1中去掉,此时S1=”计算语言学”;

(16)S1不为空,于是从S1左边取出候选子串W=”计算语言学”;

(17)查词表,“计算语言学”在词表中,将W加入到S2中,S2=“计算语言学/ 课程/ 有/ 意思/”,并将W从S1中去掉,此时S1=”";

(18)S1为空,输出S2作为分词结果,分词过程结束。

相应程序示例:

准备文件:建立一个词表文件wordlexicon,格式如下

计算语言学

课程

意思

输入文件:test,格式如下

计算语言学课程有意思

编译后执行如下:SegWord.exe test

输出分词结果文件:SegmentResult.txt

源代码如下:

// Dictionary.h

#include

#include

#include

#include

#include

using namespace std;

using namespace stdext;

class CDictionary

{

public:

CDictionary(); //将词典文件读入并构造为一个哈希词典

~CDictionary();

int FindWord(string w); //在哈希词典中查找词

private:

string strtmp; //读取词典的每一行

string word; //保存每个词

hash_map wordhash; // 用于读取词典后的哈希

hash_map::iterator worditer; //

typedef pair sipair;

};

//将词典文件读入并构造为一个哈希词典

CDictionary::CDictionary()

{

ifstream infile(“wordlexicon”); // 打开词典

if (!infile.is_open()) // 打开词典失败则退出程序

{

cerr << "Unable to open input file: " << "wordlexicon"

<< " -- bailing out!" << endl;

exit(-1);

}

while (getline(infile, strtmp, 'n')) // 读入词典的每一行并将其添加入哈希中{

istringstream istr(strtmp);

istr >> word; //读入每行第一个词

wordhash.insert(sipair(word, 1)); //插入到哈希中

}

}

CDictionary::~CDictionary()

{

}

//在哈希词典中查找词,若找到,则返回,否则返回

int CDictionary::FindWord(string w)

{

if (wordhash.find(w) != wordhash.end())

{

return 1;

}

else

{

return 0;

}

}

// 主程序main.cpp

#include “Dictionary.h”

# define MaxWordLength 10 // 最大词长为个字节(即个汉字)

# define Separator “/ ” // 词界标记

CDictionary WordDic; //初始化一个词典

//对字符串用最大匹配法(正向或逆向)处理

string SegmentSentence(string s1)

{

string s2 = “”; //用s2存放分词结果

while(!s1.empty())

{

int len =(int) s1.length(); // 取输入串长度

if (len > MaxWordLength) // 如果输入串长度大于最大词长

{

len = MaxWordLength; // 只在最大词长范围内进行处理

}

//string w = s1.substr(0, len); // (正向用)将输入串左边等于最大词长长度串取出作为候选词string w = s1.substr(s1.length() – len, len); //逆向用

int n = WordDic.FindWord(w); // 在词典中查找相应的词

while(len > 2 && n == 0) // 如果不是词

{

len -= 2; // 从候选词右边减掉一个汉字,将剩下的部分作为候选词

//w = w.substr(0, len); //正向用

w = s1.substr(s1.length() – len, len); //逆向用

n = WordDic.FindWord(w);

}

//s2 += w + Separator; // (正向用)将匹配得到的词连同词界标记加到输出串末尾

w = w + Separator; // (逆向用)

s2 = w + s2 ; // (逆向用)

//s1 = s1.substr(w.length(), s1.length()); //(正向用)从s1-w处开始

s1 = s1.substr(0, s1.length() – len); // (逆向用)

}

return s2;

}

//对句子进行最大匹配法处理,包含对特殊字符的处理

string SegmentSentenceMM (string s1)

{

string s2 = “”; //用s2存放分词结果

int i;

int dd;

while(!s1.empty() )

{

unsigned char ch = (unsigned char)s1[0];

if (ch < 128) // 处理西文字符

{

i = 1;

dd = (int)s1.length();

while (i < dd && ((unsigned char)s1[i] < 128) && (s1[i] != 10) && (s1[i] != 13)) // s1[i]不能是换行符或回车符

{

i++;

}

if ((ch != 32) && (ch != 10) && (ch != 13)) // 如果不是西文空格或换行或回车符

{

s2 += s1.substr(0,i) + Separator;

}

else

{

//if (ch == 10 || ch == 13) // 如果是换行或回车符,将它拷贝给s2输出

if (ch == 10 || ch == 13 || ch == 32) //谢谢读者mces89的指正

{

s2 += s1.substr(0, i);

}

}

s1 = s1.substr(i,dd);

continue;

}

else

{

if (ch < 176) // 中文标点等非汉字字符

{

i = 0;

dd = (int)s1.length();

while(i < dd && ((unsigned char)s1[i] < 176) && ((unsigned char)s1[i] >= 161)

&& (!((unsigned char)s1[i] == 161 && ((unsigned char)s1[i+1] >= 162 && (unsigned char)s1[i+1] <= 168)))

&& (!((unsigned char)s1[i] == 161 && ((unsigned char)s1[i+1] >= 171 && (unsigned char)s1[i+1] <= 191)))

&& (!((unsigned char)s1[i] == 163 && ((unsigned char)s1[i+1] == 172 || (unsigned char)s1[i+1] == 161)

|| (unsigned char)s1[i+1] == 168 || (unsigned char)s1[i+1] == 169 || (unsigned char)s1[i+1] == 186 || (unsigned char)s1[i+1] == 187 || (unsigned char)s1[i+1] == 191)))

{

i = i + 2; // 假定没有半个汉字

}

if (i == 0)

{

i = i + 2;

}

if (!(ch == 161 && (unsigned char)s1[1] == 161)) // 不处理中文空格

{

s2+=s1.substr(0, i) + Separator; // 其他的非汉字双字节字符可能连续输出

}

s1 = s1.substr(i, dd);

continue;

}

}

// 以下处理汉字串

i = 2;

dd = (int)s1.length();

while(i < dd && (unsigned char)s1[i] >= 176)

{

i += 2;

}

s2 += SegmentSentence(s1.substr(0, i));

s1 = s1.substr(i,dd);

}

return s2;

}

int main(int argc, char *argv[])

{

string strtmp; //用于保存从语料库中读入的每一行

string line; //用于输出每一行的结果

ifstream infile(argv[1]); // 打开输入文件

if (!infile.is_open()) // 打开输入文件失败则退出程序

{

cerr << "Unable to open input file: " << argv[1]

<< " -- bailing out!" << endl;

exit(-1);

}

ofstream outfile1("SegmentResult.txt"); //确定输出文件

if (!outfile1.is_open())

{

cerr << "Unable to open file:SegmentResult.txt"

<< "--bailing out!" << endl;

exit(-1);

}

while (getline(infile, strtmp, 'n')) //读入语料库中的每一行并用最大匹配法处理{

line = strtmp;

line = SegmentSentenceMM(line); // 调用分词函数进行分词处理

outfile1 << line << endl; // 将分词结果写入目标文件

}

return 0;

}

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

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

中文分词切词超详细分析

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

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

当汉语语料库文本分词规范草案

973当代汉语文本语料库分词、词性标注加工规范 (草案) 山西大学从1988年开始进行汉语语料库的深加工研究,首先是对原始语料进行切分和词性标注,1992年制定了《信息处理用现代汉语文本分词规范》。经过多年研究和修改,2000年又制定出《现代汉语语料库文本分词规范》和《现代汉语语料库文本词性体系》。这次承担973任务后制定出本规范。本规范主要吸收了语言学家的研究成果,并兼顾各家的词性分类体系,是一套从信息处理的实际要求出发的当代汉语文本加工规范。本加工规范适用于汉语信息处理领域,具有开放性和灵活性,以便适用于不同的中文信息处理系统。 《973当代汉语文本语料库分词、词性标注加工规范》是根据以下资料提出的。 1.《信息处理用现代汉语分词规范》,中国国家标准GB13715,1992年 2.《信息处理用现代汉语词类标记规范》,中华人民共和国教育部、国家语言文字工作委员会2003年发布 3.《现代汉语语料库文本分词规范》(Ver 3.0),1998年 北京语言文化大学语言信息处理研究所清华大学计算机科学与技术系4.《现代汉语语料库加工规范——词语切分与词性标注》,1999年 北京大学计算语言学研究所 5.《信息处理用现代汉语词类标记规范》,2002年, 教育部语言文字应用研究所计算语言学研究室 6.《现代汉语语料库文本分词规范说明》,2000年 山西大学计算机科学系山西大学计算机应用研究所 7.《資讯处理用中文分词标准》,1996年,台湾计算语言学学会 一、分词总则 1.词语的切分规范尽可能同中国国家标准GB13715《信息处理用现代汉语分词规范》(以下简称为“分词规范”)保持一致。本规范规定了对现代汉语真实文本(语料库)进行分词的原则及规则。追求分词后语料的一致性(consistency)是本规范的目标之一。 2.本规范中的“分词单位”主要是词,也包括了一部分结合紧密、使用稳定的词组以及在某些特殊情况下可能出现在切分序列中的孤立的语素或非语素字。本文中仍用“词”来称谓“分词单位”。 3.分词中充分考虑形式与意义的统一。形式上要看一个结构体的组成成分能否单用,结构体能否扩展,组成成分的结构关系,以及结构体的音节结构;意义上要看结构体的整体意义是否具有组合性。 4. 本规范规定的分词原则及规则,既要适应语言信息处理与语料库语言学研究的需要,又力求与传统的语言学研究成果保持一致;既要适合计算机自动处理,又要便于人工校对。 5.分词时遵循从大到小的原则逐层顺序切分。一时难以判定是否切分的结构体,暂不切分。 二、词性标注总则 信息处理用现代汉语词性标注主要原则有三个: (1)语法功能原则。语法功能是词类划分的主要依据。词的意义不作为划分词类的主要依据,

百度中文分词技巧

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

结合中文分词的贝叶斯文本分类

结合中文分词的贝叶斯文本分类 https://www.wendangku.net/doc/864712749.html,/showarticle.aspx?id=247 来源:[] 作者:[] 日期:[2009-7-27] 魏晓宁1,2,朱巧明1,梁惺彦2 (1.苏州大学,江苏苏州215021;2.南通大学,江苏南通226007) 摘要:文本分类是组织大规模文档数据的基础和核心。朴素贝叶斯文本分类方法是种简单且有效的文本分类算法,但是属性间强独立性的假设在现实中并不成立,借鉴概率论中的多项式模型,结合中文分词过程,引入特征词条权重,给出了改进Bayes方法。并由实验验证和应用本方法,文本分类的效率得到了提高。 1. Using Bayesian in Text Classification with Participle-method WEI Xiao-ning1,2,ZHU Qiao-ming1,LIANG Xing-yan2 (1.Suzhou University,Suzhou 215006,China;2.Nantong University,Nantong 226007,China) Abstract:Text classification is the base and core of processing large amount of document data.Native Bayes text classifier is a simple and effective text classification method.Text classification is the key technology in organizing and processing large amount of document data.The practical Bayes algorithm is an useful technique which has an assumption of strong independence of different properties.Based on the polynomial model,a way in feature abstraction considering word-weight and participle-method is introduced. At last the experiments show that efficiency of text classification is improved. 1.0引言 文档分类是组织大规模文档数据的基础和核心,利用计算机进行自动文档分类是自然语言处理和人工智能领域中一项具有重要应用价值的课题。现有的分类方法主要是基于统计理论和机器学习方法的,比较著名的文档分类方法有Bayes、KNN、LLSF、Nnet、Boosting及SVM等。 贝叶斯分类器是基于贝叶斯学习方法的分类器,其原理虽然较简单,但是其在实际应用中很成功。贝叶斯模型中的朴素贝叶斯算法有一个很重要的假设,就是属性间的条件独立[1][2],而现实中属性之间这种独立性很难存在。因此,本文提出了一种改进型的基于朴素贝叶斯网络的分类方法,针对于文本特征,结合信息增益于文本分类过程,实验表明文本分类的准确率在一定程度上有所提高。

中科院中文分词系统调研报告

自然语言处理调研报告(课程论文、课程设计) 题目:最大正向匹配中文分词系统 作者:陈炳宏吕荣昌靳蒲 王聪祯孙长智 所在学院:信息科学与工程学院 专业年级:信息安全14-1 指导教师:努尔布力 职称:副教授 2016年10月29日

目录 一、研究背景、目的及意义 (3) 二、研究内容和目标 (4) 三、算法实现 (5) 四、源代码 (7) 1.seg.java 主函数 (7) 2. dict.txt 程序调用的字典 (10) 3.实验案例 (11) 五、小结 (12)

一、研究背景、目的及意义 中文分词一直都是中文自然语言处理领域的基础研究。目前,网络上流行的很多中文分词软件都可以在付出较少的代价的同时,具备较高的正确率。而且不少中文分词软件支持Lucene扩展。但不过如何实现,目前而言的分词系统绝大多数都是基于中文词典的匹配算法。 在这里我想介绍一下中文分词的一个最基础算法:最大匹配算法(Maximum Matching,以下简称MM算法) 。MM算法有两种:一种正向最大匹配,一种逆向最大匹配。

二、研究内容和目标 1、了解、熟悉中科院中文分词系统。 2、设计程序实现正向最大匹配算法。 3、利用正向最大匹配算法输入例句进行分词,输出分词后的结果。

三、算法实现 图一:算法实现 正向最大匹配算法:从左到右将待分词文本中的几个连续字符与词表匹配,如果匹配上,则切分出一个词。但这里有一个问题:要做到最大匹配,并不是第一次匹配到就可以切分的。 算法示例: 待分词文本: content[]={"中","华","民","族","从","此","站","起","来","了","。"} 词表: dict[]={"中华", "中华民族" , "从此","站起来"} (1) 从content[1]开始,当扫描到content[2]的时候,发现"中华"已经在

中文自动分词技术

中文自动分词技术是以“词”为基础,但汉语书面语不是像西方文字那样有天然的分隔符(空格),而是在语句中以汉字为单位,词与词之间没有明显的界限。因此,对于一段汉字,人可以通过自己的知识来明白哪些是词,哪些不是词,但如何让计算机也能理解?其处理过程词,就要应用到中文自动分词技术。下面依次介绍三种中文自动分词算法:基于词典的机械匹配的分词方法、基于统计的分词方法和基于人工智能的分词方法。 1、基于词典的机械匹配的分词方法: 该算法的思想是,事先建立词库,让它它是按照一定的策略将待分析的汉字串与一个充分大的词典中的词条进行匹配,若在词典中找到该字符串,则识别出一个词。按照扫描方向的不同,串匹配分词的方法可以分为正向匹配和逆向匹配;按照不同长度优先匹配的情况,又可以分为最大匹配和最小匹配。按这种分类方法,可以产生正向最大匹配、逆向最大匹配,甚至是将他们结合起来形成双向匹配。由于汉字是单字成词的,所以很少使用最小匹配法。一般来说,逆向匹配的切分精度略高于正向匹配,这可能和汉语习惯将词的重心放在后面的缘故。可见,这里的“机械”是因为该算法仅仅依靠分词词表进行匹配分词 a)、正向减字最大匹配法(MM) 这种方法的基本思想是:对于每一个汉字串s,先从正向取出maxLength 个字,拿这几个字到字典中查找,如果字典中有此字,则说明该字串是一个词,放入该T的分词表中,并从s中切除这几个字,然后继续此操作;如果在字典中找不到,说明这个字串不是一个词,将字串最右边的那个字删除,继续与字典比较,直到该字串为一个词或者是单独一个字时结束。 b)、逆向减字最大匹配法(RMM ) 与正向减字最大匹配法相比,这种方法就是从逆向开始遍历。过程与正向减字最大匹配法基本相同,可以对文本和字典先做些处理,把他们都倒过来排列,然后使用正向减字最大匹法。 机械匹配算法简洁、易于实现.其中,最大匹配法体现了长词优先的原则,在实际工程中应用最为广泛。机械匹配算法实现比较简单,但其局限也是很明显的:效率和准确性受到词库

关于百度中文分词系统研究

关于百度中文分词系统研究

所谓分词就是把字与字连在一起的汉语句子分成若干个相互独立、完整、正确的单词。词是最小的、能独立活动的、有意义的语言成分。计算机的所有语言知识都来自机器词典(给出词的各项信息) 、句法规则(以词类的各种组合方式来描述词的聚合现象) 以及有关词和句子的语义、语境、语用知识库。中文信息处理系统只要涉及句法、语义(如检索、翻译、文摘、校对等应用) ,就需要以词为基本单位。当汉字由句转化为词之后,才能使得句法分析、语句理解、自动文摘、自动分类和机器翻译等文本处理具有可行性。可以说,分词是机器语言学的基础。 分词准确性对搜索引擎来说十分重要,但如果分词速度太慢,即使准确性再高,对于搜索引擎来说也是不可用的,因为搜索引擎需要处理数以亿计的网页, 如果分词耗用的时间过长,会严重影响搜索引擎内容更新的速度。因此对于搜索引擎来说,分词的准确性和速度,二者都需要达到很高的要求。 分词算法的三种主要类型 现有的分词算法可分为三大类:基于字符串匹配的分词方法、基于理解的分词方法和基于统计的分词方法。 》基于字符串匹配的分词方法。 这种方法又叫做机械分词方法,它是按照一定的策略将待分析的汉字串与一个“充分大的”机器词典中的词条进行匹配,若在词典中找到某个字符串,则匹配成功 (识别出一个词) 。按照扫描方向的不同,串匹配分词方法可以分为正向匹配和逆向匹配;按照不同长度优先匹配的情况,可以分为最大(最长) 匹配 和最小(最短) 匹配;按照是否与词性标注过程相结合,又可以分为单纯分词方 法和分词与标注相结合的一体化方法。常用的几种机械分词方法如下: 1) 正向最大匹配法(由左到右的方向) 。 通常简称为MM(Maximum Matching Method) 法。其基本思想为:设D 为词典,MAX 表示D 中的最大词长,STR 为待切分的字串。MM 法是每次从STR 中取长度为MAX 的子串与D 中的词进行匹配。若成功,则该子串为词,指针后移MAX 个汉字后继续匹配,否则子串逐次减一进行匹配。 2) 逆向最大匹配法(由右到左的方向) 。 通常简称为RMM ( Reverse Maximum MatchingMethod) 法。RMM 法的基本原理与MM 法相同,不同的是分词的扫描方向,它是从右至左取子串进行匹配。 3) 最少切分法(使每一句中切出的词数最小) 。 还可以将上述各种方法相互组合,例如,可以将正向最大匹配方法和逆向 最大匹配方法结合起来构成双向匹配法。由于汉语单字成词的特点,正向最小匹配和逆向最小匹配一般很少使用。一般说来,逆向匹配的切分精度略高于正向匹配,遇到的歧义现象也较少。统计结果表明,单纯使用正向最大匹配的错误率为1/169 ,单纯使用逆向最大匹配的错误率为1/ 245 。但这种精度还远远不能满足实际的需要。实际使用的分词系统,都是把机械分词作为一种初分手段,还需通过利用各种其它的语言信息来进一步提高切分的准确率。一种方法是改进

百度_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字字串进行匹配处理,直到文档被扫描完为止。

搜索引擎的现状和发展趋势

搜索引擎的现状和发展趋势

期末课程论文 论文标题:搜索引擎的现状与发展趋势课程名称:信息检索技术 课程编号:1220500 学生姓名:潘飞达 学生学号:1100310120 所在学院:计算机科学与工程学院 学习专业:计算机科学与技术 课程教师:王冲

2013年7月 1 日【摘要】 搜索引擎包括图片搜索引擎、全文索引、目录索引等,其发展历史可分为五个阶段,目前企业搜索引擎和网站运营搜索引擎运用范围较广。在搜索引擎的未来发展中,呈现出个性化,多元化,智能化,移动化,社区化等多个趋势。 【关键词】 发展过程、发展趋势、检索技巧、个性化、智能化 1 搜索引擎简介 搜索引擎是指根据一定的策略、运用特定的计算机程序从互联网上搜集信息,在对信息进行组织和处理后,为用户提供检索服务,将用户检索相关的信息展示给用户的系统。搜索引擎包括全文索引、目录索引、元搜索引擎、垂直搜索引擎、集合式搜索引擎、门户搜索引擎与免费链接列表等。百度和谷歌等是搜索引擎的代表。 其工作作原理分为抓取网页,处理网页和提供检索服务。抓取每个独立的搜索引擎都有自己的网页抓取程序,它顺着网页中的超链接,连续地抓取网页。由于互联网中超链接的应用很普遍,理论上,从一定范围的网页出发,就能搜集到绝大多数的网页。搜索引擎抓到网页后,还要做大量的预处理工作,才能提供检索服务。其中,最重要的就是提取关键词,建立索引文件。 搜索引擎是根据用户的查询请求,按照一定算法从索引数据中查找信息返回给用户。为了保证用户查找信息的精度和新鲜度,搜索引擎需要建立并维护一个庞大的索引数据库。一般的搜索引擎由网络机器人程序、索引与搜索程序、索引数据库等部分组成。

中文文本预处理

1中文文本预处理 1.1分词软件调用(中科院分词系统) 1.1.1软件下载:https://www.wendangku.net/doc/864712749.html,/ 1.1.2软件包目录&介绍 | Readme.txt-------------------------->介绍 | +---bin | +---DocExtractor----------->文档篇章语义抽取系统 | | DocExtractor.bat-->批处理,可以针对指定的文件夹进行语义抽取 | | DocExtractor.dll-->支撑的动态链接库,基于分词基础上 | | DocExtractorSample.exe-->应用程序 | | | \---ICTCLAS2015----------->分词系统 | ICTCLAS-tools.exe-->分词的支撑工具,可用于测试,本处主要用来做用户词典导入 | importuserdict.bat-->可将用户词典自动导入到系统内 | NLPIR.dll-->Win32下的支撑动态链接库,其他环境的库,可以访问lib对应环境的库文件 | NLPIR.lib | NLPIR_WinDemo.exe-->Win32下的演示程序,在Win8 32位下编译而成,部分环境可能不支持,或者显示异常 | userdic.txt-->用户词典,用户可以自行编辑 | +---Data-->系统核心词库 | \---English-->英文处理的支持知识库,如果不需要英文处理的功能,可以不加载本库。 | +---doc-->相关文档支持 | ICTPOS3.0.doc-->我们的词性标注集说明 | NLPIR-ICTCLAS2015分词系统开发手册.pdf-->开发使用手册 | +---include-->系统头文件 | NLPIR.h | +---lib-->不同环境下的支撑库,每一种库,同时支持C/C++/C#/Java库。其他小众化的环境支持,请联系我们 | +---linux32-->Linux 32bit操作系统下的支持库 | | libNLPIR.so | | | +---linux64-->Linux 64bit操作系统下的支持库 | | libNLPIR.so | | Readme.txt | |

词位标注汉语分词技术详解

[收稿日期]2010-06-26 [基金项目]河南省教育厅高等学校青年骨干教师项目(2009G GJS -108)。 [作者简介]于江德(1971-),男,博士,副教授,主要从事自然语言处理、信息抽取、文本数据挖掘等。①可以从以下地址下载:http ://cr fpp .so ur cefo rg e .net [汉语词法·甲骨文] 汉语词法分析是中文信息处理的首要任务,主要包括分词、词性标注、命名实体识别三项子任务,它是句法分析与语义分析的基础,其性能将直接影响到中文信息处理的后续应用。安阳师范学院计算机与信息工程学院依托河南省高等学校“甲骨文信息处理”重点实验室培育基地,“中文信息处理”校级重点实验室“计算语言学”校级研究所等平台。对汉语词法分析中的这三项子任务、甲骨文进行了较深入的研究,取得了部分研究成果,现借学报这个平台展示给各位同仁,敬请各位专家学者指正。 词位标注汉语分词技术详解 于江德,王希杰 (安阳师范学院计算机与信息工程学院,河南安阳455002) [摘 要]近年来基于字的词位标注的方法极大地提高了汉语分词的性能,该方法将汉语分词转化为字的词位标注问题,借助于优秀的序列标注模型,基于字的词位标注汉语分词方法逐渐成为分词的主要技术路线。本文简要介绍了词位标注汉语分词的基本思想,探析了基于条件随机场实现词位标注汉语分词的机理,并对采用四词位标注集,使用CRF ++0.53工具包实现字串序列词位标注进行了详解。最后在Bakeo ff2006的评测语料上进行了封闭测试。 [关键词]汉语分词;条件随机场;词位标注;特征模板 [中图分类号]T P391 [文献标识码]A [文章编号]1671-5330(2010)05-0001-05 在中文信息处理领域,词是最小的能够独立运用的有意义的语言单位。但汉语书写时却以字为基本的书写单位,词语之间不存在明显的分隔标记,因此,中文信息处理领域的一项基础性研究课题是如何将汉语的字串切分为合理的词语序列,即汉语分词。它不仅是句法分析、语义分析、篇章理解等深层中文信息处理的基础,也是机器翻译、自动问答系统、信息检索和信息抽取等应用的关键环节[1,2]。 近年来,尤其是2003年7月首届国际中文分词评测活动Bakeo ff 开展以来,汉语分词技术取得了可喜的进步,该领域的研究取得了令人振奋 的成果[3,4]。其中,基于字的词位标注汉语分词技术(也称为基于字标注的汉语分词或由字构词)得到了广泛关注,在可比的评测中性能领先的系统几乎无一例外都应用了类似的标注思想[3,5]。基于字的词位标注汉语分词将分词看作序列数据的标注问题,使用序列数据标注模型实现,例如,可采用条件随机场(Co nditional Random Fields ,简称CRFs )实现。CRFs 是Lafferty 等[6]于2001年提出的一种用于序列数据标注的条件概率模型。本文简要介绍了词位标注汉语分词的基本思想,探析了基于条件随机场实现词位标注汉语分词的机理,并对采用B 、M 、E 、S 四词位标注集,使 1 2010年 安阳师范学院学报

分词技术研究报告

分词技术研究报告(1) 2008-9-13 7:28:22 技术报告报告人:杨超一、研究内容目前,国内的每个行业、领域都在飞速发展,这中间产生了大量的中文信息资源,为了能够及时准确的获取最新的信息,中文搜索引擎是必然的产物。中文搜索引擎与西文搜索引擎在实现的机制和原理上大致雷同,但由于汉语本身的特点,必须引入对于中文语言的处理技术,而汉语自动分词技术就是其中很关键的部分。汉语自动分词到底对搜索引擎有多大影响?对于搜索引擎来说,最重要的并不是找到所有结果,最重要的是把最相关的结果排在最前面,这也称为相关度排序。中文分词的准确与否,常常直接影响到对搜索结果的相关度排序。分词准确性对搜索引擎来说十分重要,但如果分词速度太慢,即使准确性再高,对于搜索引擎来说也是不可用的,因为搜索引擎需要处理数以亿计的网页,如果分词耗用的时间过长,会严重影响搜索引擎内容更新的速度。因此对于搜索引擎来说,分词的准确性和速度,二者都需要达到很高的要求。研究汉语自动分词算法,对中文搜索引擎的发展具有至关重要的意义。快速准确的汉语自动分词是高效中文搜索引擎的必要前提。本课题研究中文搜索引擎中汉语自动分词系统的设计与实现,从目前中文搜索引擎的发展现状出发,引出中文搜索引擎的关键技术汉语自动分词系统 的设计。首先研究和比较了几种典型的汉语自动分词词典机制,指出各词典机制的优缺点,然后分析和比较了几种主要的汉语自动分词方法,阐述了各种分词方法的技术特点。针对课题的具体应用领域,提出改进词典的数据结构,根据汉语中二字词较多的特点,通过快速判断二字词来优化速度;分析中文搜索引擎下歧义处理和未登陆词处理的技术,提出了适合本课题的自动分词算法,并给出该系统的具体实

中文分词入门之最大匹配法

中文分词入门之最大匹配法 发表于2009年01月12号由52nlp 中文分词在中文信息处理中是最最基础的,无论机器翻译亦或信息检索还是其他相关应用,如果涉及中文,都离不开中文分词,因此中文分词具有极高的地位。中文分词入门最简单应该是最大匹配法了,当年师兄布置给我的第一个学习任务就是实现最大匹配法的分词算法(正向、逆向)。记得当时对自己参考学习最有帮助的是北大詹卫东老师“中文信息处理基础”的课件和源程序,不过他实现的是mfc程序,词表存储在数据库里。自己实现时用纯c++实现,利用hash_map 存储词表。这里我介绍一下相关的知识和一个简单的程序示例,部分参考自詹老师的讲义。 正向最大匹配法算法如下所示: (注:以上最大匹配算法图来自于詹老师讲义) 逆向匹配法思想与正向一样,只是从右向左切分,这里举一个例子: 输入例句:S1=”计算语言学课程有意思” ; 定义:最大词长MaxLen = 5;S2= ” “;分隔符= “/”;

假设存在词表:…,计算语言学,课程,意思,…; 最大逆向匹配分词算法过程如下: (1)S2=”";S1不为空,从S1右边取出候选子串W=”课程有意思”; (2)查词表,W不在词表中,将W最左边一个字去掉,得到W=”程有意思”; (3)查词表,W不在词表中,将W最左边一个字去掉,得到W=”有意思”; (4)查词表,W不在词表中,将W最左边一个字去掉,得到W=”意思” (5)查词表,“意思”在词表中,将W加入到S2中,S2=” 意思/”,并将W从S1中去掉,此时S1=”计算语言学课程有”; (6)S1不为空,于是从S1左边取出候选子串W=”言学课程有”; (7)查词表,W不在词表中,将W最左边一个字去掉,得到W=”学课程有”; (8)查词表,W不在词表中,将W最左边一个字去掉,得到W=”课程有”; (9)查词表,W不在词表中,将W最左边一个字去掉,得到W=”程有”; (10)查词表,W不在词表中,将W最左边一个字去掉,得到W=”有”,这W是单字,将W 加入到S2中,S2=“ /有/意思”,并将W从S1中去掉,此时S1=”计算语言学课程”; (11)S1不为空,于是从S1左边取出候选子串W=”语言学课程”; (12)查词表,W不在词表中,将W最左边一个字去掉,得到W=”言学课程”; (13)查词表,W不在词表中,将W最左边一个字去掉,得到W=”学课程”; (14)查词表,W不在词表中,将W最左边一个字去掉,得到W=”课程”; (15)查词表,“意思”在词表中,将W加入到S2中,S2=“课程/ 有/ 意思/”,并将W从S1中去掉,此时S1=”计算语言学”; (16)S1不为空,于是从S1左边取出候选子串W=”计算语言学”; (17)查词表,“计算语言学”在词表中,将W加入到S2中,S2=“计算语言学/ 课程/ 有/ 意思/”,并将W从S1中去掉,此时S1=”"; (18)S1为空,输出S2作为分词结果,分词过程结束。 相应程序示例: 准备文件:建立一个词表文件wordlexicon,格式如下 计算语言学 课程 意思 输入文件:test,格式如下 计算语言学课程有意思 编译后执行如下:SegWord.exe test 输出分词结果文件:SegmentResult.txt 源代码如下: // Dictionary.h #include #include #include #include #include using namespace std; using namespace stdext;

中文分词方法

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

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

基于二级Hash的快速最长匹配分词算法 殷鹏程,谭献海 西南交通大学,四川成都(610031) E-mail:ypc_swjtu@https://www.wendangku.net/doc/864712749.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 汉语词的特点

相关文档