本文目录
- 基于规则的分词系统和基于统计的分词系统各有哪些优缺点
- 什么是自动分词系统搜索引擎是如何实现的
- 如何使用中科院分词系统Java版
- 什么是现代汉语通用分词系统gpws
- 什么是百度分词百度分词技术又是什么
- 中文分词的技术难点
- lpir/ictclas2014分词系统怎么使用
基于规则的分词系统和基于统计的分词系统各有哪些优缺点
众所周知,英文是以词为单位的,词和词之间是靠空格隔开,而中文是以字为单位,句子中所有的字连起来才能描述一个意思。例如,英文句子I am a student,用中文则为:“我是一个学生”。计算机可以很简单通过空格知道student是一个单词,但是不能很容易明白“学”、“生”两个字合起来才表示一个词。把中文的汉字序列切分成有意义的词,就是中文分词,有些人也称为切词。我是一个学生,分词的结果是:我 是 一个 学生。中文分词技术属于自然语言处理技术范畴,对于一句话,人可以通过自己的知识来明白哪些是词,哪些不是词,但如何让计算机也能理解?其处理过程就是分词算法。 现有的分词算法可分为三大类:基于字符串匹配的分词方法、基于理解的分词方法和基于统计的分词方法。 1、基于字符串匹配的分词方法 这种方法又叫做机械分词方法,它是按照一定的策略将待分析的汉字串与一个“充分大的”机器词典中的词条进行配,若在词典中找到某个字符串,则匹配成功(识别出一个词)。按照扫描方向的不同,串匹配分词方法可以分为正向匹配和逆向匹配;按照不同长度优先匹配的情况,可以分为最大(最长)匹配和最小(最短)匹配;按照是否与词性标注过程相结合,又可以分为单纯分词方法和分词与标注相结合的一体化方法。常用的几种机械分词方法如下: 1)正向最大匹配法(由左到右的方向); 2)逆向最大匹配法(由右到左的方向); 3)最少切分(使每一句中切出的词数最小)。 还可以将上述各种方法相互组合,例如,可以将正向最大匹配方法和逆向最大匹配方法结合起来构成双向匹配法。由于汉语单字成词的特点,正向最小匹配和逆向最小匹配一般很少使用。一般说来,逆向匹配的切分精度略高于正向匹配,遇到的歧义现象也较少。统计结果表明,单纯使用正向最大匹配的错误率为1/169,单纯使用逆向最大匹配的错误率为1/245。但这种精度还远远不能满足实际的需要。实际使用的分词系统,都是把机械分词作为一种初分手段,还需通过利用各种其它的语言信息来进一步提高切分的准确率。 一种方法是改进扫描方式,称为特征扫描或标志切分,优先在待分析字符串中识别和切分出一些带有明显特征的词,以这些词作为断点,可将原字符串分为较小的串再来进机械分词,从而减少匹配的错误率。另一种方法是将分词和词类标注结合起来,利用丰富的词类信息对分词决策提供帮助,并且在标注过程中又反过来对分词结果进行检验、调整,从而极大地提高切分的准确率。 对于机械分词方法,可以建立一个一般的模型,在这方面有专业的学术论文,这里不做详细论述。 2、基于理解的分词方法 这种分词方法是通过让计算机模拟人对句子的理解,达到识别词的效果。其基本思想就是在分词的同时进行句法、语义分析,利用句法信息和语义信息来处理歧义现象。它通常包括三个部分:分词子系统、句法语义子系统、总控部分。在总控部分的协调下,分词子系统可以获得有关词、句子等的句法和语义信息来对分词歧义进行判断,即它模拟了人对句子的理解过程。这种分词方法需要使用大量的语言知识和信息。由于汉语语言知识的笼统、复杂性,难以将各种语言信息组织成机器可直接读取的形式,因此目前基于理解的分词系统还处在试验阶段。 3、基于统计的分词方法 从形式上看,词是稳定的字的组合,因此在上下文中,相邻的字同时出现的次数越多,就越有可能构成一个词。因此字与字相邻共现的频率或概率能够较好的反映成词的可信度。可以对语料中相邻共现的各个字的组合的频度进行统计,计算它们的互现信息。定义两个字的互现信息,计算两个汉字X、Y的相邻共现概率。互现信息体现了汉字之间结合关系的紧密程度。当紧密程度高于某一个阈值时,便可认为此字组可能构成了一个词。这种方法只需对语料中的字组频度进行统计,不需要切分词典,因而又叫做无词典分词法或统计取词方法。但这种方法也有一定的局限性,会经常抽出一些共现频度高、但并不是词的常用字组,例如“这一”、“之一”、“有的”、“我的”、“许多的”等,并且对常用词的识别精度差,时空开销大。实际应用的统计分词系统都要使用一部基本的分词词典(常用词词典)进行串匹配分词,同时使用统计方法识别一些新的词,即将串频统计和串匹配结合起来,既发挥匹配分词切分速度快、效率高的特点,又利用了无词典分词结合上下文识别生词、自动消除歧义的优点。 到底哪种分词算法的准确度更高,目前并无定论。对于任何一个成熟的分词系统来说,不可能单独依靠某一种算法来实现,都需要综合不同的算法。笔者了解,海量科技的分词算法就采用“复方分词法”,所谓复方,相当于用中药中的复方概念,即用不同的药才综合起来去医治疾病,同样,对于中文词的识别,需要多种算法来处理不同的问题。
什么是自动分词系统搜索引擎是如何实现的
紧接着上一讲,搜索引擎索引网页库建立之后,我们需要对索引网页库预处理,其中又分为两大类:网页分析和建立倒排文件索引。而搜索引擎的自动分词系统就是进行网页分析的前提。 首先,中文和英文不同的是,英文单词之间有空格,而中文都是连贯在一起来操作的,在形式上,无法做出区分。所以中文文本在进行网页分析之前,需要将文本切分为多个词或者字。在目前检索中,主要可以分为按字检索和按词检索,其中按词检索,拥有更快的速度和较高的准确性。 自动分词系统算法介绍 分词系统基本方法:基于字符串匹配的分词方法和基于统计的分词方法。 1)基于字符串匹配:也称为机械分词,按照几个既定的策略,将等待分析的字符串和一个容量足够大的词典中的词条进行匹配,若在词典中找到同样的一个字符串,那么匹配成功。 字符串匹配分词,按照扫描方向,可以分为:正向匹配和逆向匹配;按照不同长度有限匹配,可以分为:最大匹配和最小匹配;按照是否与词性标注相结合,可以分为:单纯分词方法和分词与标注相结合的一体化方法;常用的机械分词方法:正向最大匹配,逆向最大匹配,最小切分(就是在每一句中切除的词量最少,而不是单个词字节最少) (盐城SEO联想:使用正向最大匹配,逆向最大匹配,和我们SEO中经常用到的关键词靠前,则排名越有利,是否存在关联) 同时,在机械分词法中,存在这样一个模型:ASM(d,a,m); d:匹配方向,+表示正向,-表示逆向; a:每次匹配失败后增加或减少字串长度(字符串),“+”就是增加一个,“-”就是减少一个; m:最大或最小匹配标志,+为最大匹配,-为最小匹配。 对于,中文汉字来说,ASM(+,=,+)是最为实用的方法。 2)基于统计的分词方法介绍: 在表现形式上,词是多个字的稳定组合,所以说,在文章中,相邻的字同时出现的次数越多,那么越有可能是一个词,因此,字和字相邻出现的的频率可以大概的反应出词的可信率。 通过公式:M(x,y)=log( P(x,y) / p(x)p(y) )来计算他们的互现信息,该互现信息体现了汉字之间结合的紧密程度,当M(x,y)的值大于某一阈值时,便可以确定这是一个词。 因为,只需要对字组频率进行计算,不需要使用词典,所以叫做无词典分词方法,或者说统计分词方法。 缺点:经常会抽出一些高频,但不是词的常用词组,如:“我们”“共同”“有的”等。 所以在正常使用中,统计分词法,都会使用一部基本的分词词典(常用词词典),通过字符串分词系统,识别出常用词组,同时通过统计分词系统,识别出新词,生词,两者结合,即发挥出字符串匹配分词系统的速度快,效率高,又可以利用统计分词系统识别生词,自动消除歧义的优点。
如何使用中科院分词系统Java版
1、官网下载最新版本分词器 注:听学长说这个分词器有时间限制,所以一段时间之后需要重新下载。 2、将下载的ICTCLAS50_Windows_32_JNI.rar解压,其中有API,Demo,Doc,Sample四个文件夹; API文件夹中的东西就是我们需要使用的。
什么是现代汉语通用分词系统gpws
“现代汉语通用分词系统”,是国家自然科学基金项目,被列为国家“863”计划项目,由北京语言文化大学宋柔教授主持完成。该系统在保持并提高分词准确性和效率的同时,还能支持不同的应用目标、不同的专业领域、不同的华语地区对于分词的不同需求,使分词系统的通用性有了较大提高。
什么是百度分词百度分词技术又是什么
首先查询专用词典(人名,部分地名等),将专有名称切出,剩下的部分采取双向匹配分词策略。如果两者切分结果相同,说明没有歧义,直接输出分词结果如果不一致,则输出最短路径的那个结果如果长度相同。则选择单字词少的那一组切分结果。如果单字也相同,则选择正向分词结果。如果说百度有优势的话,唯一的优势就是那个很大的专用词典。这个专用词典登录了人名(比如大长今)。称谓(比如老太太)。部分地名(比如阿联酋等)。 从语料库里面不断识别出词典未登录词。逐渐扩充这个专门词典。Spelling Checker(百度词典)拼写检查错误提示(以及拼音提示功能),拼写检查错误提示是搜索引擎都具备的一个功能。也就是说用户提交查询给搜索引擎,搜索引擎检查看是否用户输入的拼写有错误。对于中文用户来说一般造成的错误是输入法造成的错误。那么我们就来分析看看百度是怎么实现这一功能的。 我们分析拼写检查系统关注以下几个问题:(1)系统如何判断用户的输入是有可能发生错误的查询?那么百度有又是如何做到这些的?百度判断用户输入是否错误的标准,我觉得应该是查字典,如果发现字典里面不包含这个词汇,那么很有可能是个错误的输入。此时启动错误提示功能,这个很好判断,因为如果是一个正常词汇的话,百度一般不会有错误提示。而你故意输入一个词典不可能包含的所谓词汇此时百度一般会提示你正确的检索词汇。百度又是怎么提示正确词汇的呢?很明显是通过拼音的方式,在百度输入查询“紫材”。百度提供的提示词汇为: “紫菜”,是同音字。所以百度必然维持着一个同音词词典。里面保留着同音词信息比如可能包含着下面这条词条: “ zi cai 紫材”,另外还有一个标注拼音程序,现在能够看到的基本流程是:用户输入“紫材”,查词典。发现没有这个词汇,启动标注拼音程序。将“紫材”标注为拼音“zhi cai”。然后查找同音词词典,发现同音词“紫菜”,那么提示用户可能的正确拼写。但是还有一些遗留的小问题。比如是否将词表里面所有同音词都作为用户的提示信息?比如某个拼音有10个同音词,是否都输出呢?大家觉得百度会都输出吗?百度并没有将所有同音词都输出,而是选择一定筛选标准。选择其中几个输出,怎么证明这一点?我们看看拼音“liu li”的同音词。搜狗拼音输入法提示同音词汇有“六里 刘历 琉璃 流利 刘丽”等N个。这里是故意输入一个词典不包含的词汇,这样百度的拼写检查才开始工作。百度提示您要找的是不是: “流氓”。我们改换输入“遛邙”。看百度的查询呈现,就没有提示您要找的是不是“流氓”了。看看我两次输入的字有什么区别,这说明什么?说明不是所有同音词都给提示,而是选择性的做呈现提示。那么选择的标准是什么?大家再回头看看,第一次和第二次输入的“遛氓与遛邙”是有绝对的区别的。第一次输入的“遛氓”的“氓”字是流氓的氓字,所以百度做了提示您要找的是不是“流氓”了。去百度,就是有一点对的,一个字是对的,百度也会给你个流氓另外一个小问题:同音词词典是否包含一字词? 包含2字词,3字词,那么是否包含4字词以及更长的词条?这里一字词好回答,不用测试也能知道肯定不包含,因为你输入一个字,谁知道是否是错误的呢?反正只要是汉字就能在词表里面找到,所以没有判断依据。二字词是包含的,上面有例子三字词也包含吗?下面我们查询 “中城药”百度错误提示:“中成药”修改查询为“重城药”。那么我们看看4字词汇百度怎么处理?百度是不是还是会给我们提示呢,输入:静华烟云输入 静话烟云输入 京花阎晕 那么更长的词汇百度是否也提示?我们现在输入: “落花世界有风军”, 这个查询是什么意思,估计读过古诗的都知道。看看百度的提示这说明什么?说明同音词词典包含不同长度的同音词信息。另外也说明了百度的核心中文处理技术,也就是那个词典还真挺大的。还有一个比较重要的问题。如果汉字是多音字那么怎么处理?百度比较偷懒。它根本就没有对多音字做处理。我们来看看百度的一个标注拼音的错误。在看这个错误前先看看对于多音字百度是怎么提示错误的。百度提示“局长”!!“俱长”的拼音有几种拼法,大家说说?两种“ju zhang / ju chang”可见如果是多音字则几种情况都提示。现在我们来看看错误的情况,我们输入查询“距长”,看看结果百度提示为“局长”当然好解释,因为是同音字。但是为什么会被提示“局长”呢?这说明百度的同音字词典有错误,说明在“ju chang”这个词条里面包含“局长”这个错误的同音词。让我们顺藤摸瓜。这个错误又说明什么问题呢?说明百度的同音词典是自动生成的。而且没有人工校对。还说明在自动生成同音词典的过程中,百度不是根据对一篇文章标注拼音然后,在抽取词汇和对应的拼音信息获得的。而是完全按照某个词典的词条来标注音节的,以对于多音字造成的错误无法识别出来,如果是对篇章进行拼音标注,可能就不会出现这种很容易发现的错误标注。当然还有另外一种解释,就是“局长”是故意被百度提示出来可能的正确提示词汇。因为考虑到南方人“zh”和 “ch”等前后鼻音分不清么。我们继续测试到底是何种情况是百度有错误还是这是百度的先进的算法?我们输入查询“悬赏”,故意将之错误输入为“悬桑”。没有错误提示。说明确实没有考虑这种情况,鼻音没有考虑。根据以上推导, 我们可以得出如下结论:百度是将分词词典里面每个词条利用拼音标注程序标注成拼音,然后形成同音词词典。所以两个词典是同样大的而且这个词典也随着分词词典的增长而在不断增长。至于标注过程中多音字百度没有考虑,如果是多音字就标注成多个发音组合,通过这种方式形成同音词词典。这样的同音词词典显然包含着很多错误。最后一个问题:百度对于英文进行拼写检查么?让我们试试看,输入查询“china”,大家告诉我,什么情况专注中文搜索的百度还能搜索到英文真是意外的惊喜。变换一下查询“chini”。那么拼音搜索和中文检查错误是否采用同一套同音词词典呢,让我们来实验一下,搜索”rongji”,最后让我们总结归纳一下百度的拼写检查系统:就是百度的后台作业:(1)前面我们说过,百度分词使用的词典至少包含两个词典一个是普通词典,另外一个是专用词典(专名等),最后让我们总结归纳一下百度的拼写检查系统:百度利用拼音标注程序依次扫描所有词典中的每个词条,然后标注拼音,如果是多音字则把多个音都标上,比如”长大”,会被标注为”zhang da/chang da”两个词条.(2)通过标注完的词条,建立同音词词典,比如上面的”长大”,会有两个词条: zhang daà长大chang daà长大。(3)利用用户查询LOG频率信息给予每个中文词条一个权重;LOG大家知道是什么吗?函数(4)同音词词典建立完成了,当然随着分词词典的逐步扩大,同音词词典也跟着同步扩大;拼写检查:(1)用户输入查询,如果是多个子字符串,不作拼写检查;(2)对于用户查询,先查分词词典,如果发现有这个单词词条,不作拼写检查;(3)如果发现词典里面不包含用户查询,启动拼写检查系统:首先利用拼音标注程序对用户输入进行拼音标注(4)对于标注好的拼音在同音词词典里面扫描,如果没有发现则不作任何提示;(5)如果发现有词条,则按照顺序输出权重比较大的几个提示结果;拼音提示:(1)对于用户输入的拼音在同音词词典里面扫描,如果没有发现则不作任何提示;(2)如果发现有词条,则按照顺序输出权重比较大的几个提示结果。对百度分词算法的进一步分析,上面说过,经过分析得出百度的分词系统采用双向最大匹配分词,但是后来发现推理过程中存在一个漏洞,而且推导出来的百度分词算法步骤还是过于繁琐。所以进一步进行分析,看看是否前面的推导有错误。那么以前的分析有什么漏洞呢?我们推导百度分词有反向最大匹配的依据是百度将“北京华烟云”分词为“北/京华烟云”,从这里看好像采用了反向最大匹配。因为正向最大匹配的结果应该是“北京/华/烟云”,但是由此就推论说百度采用了双向最大匹配还是太仓促了。前面我们也讲过,百度有两个词典,一个普通词典,一个专有词典。而且是专有词典的词汇先切分,然后将剩余片断交给普通词典去切分。以上面的“北京华烟云”之所以被切分成“北/京华烟云”,另外一个可能是“京华烟云”这个词汇是在专有词典里面存储的。所以先分析,这样得出“京华烟云”剩下“北”,没什么好切分的,所以就呈现出来了。这里只是假设,那么是否确实“京华烟云”在专有词典呢?我们再看一个例子“山东北京华烟云”,如果“京华烟云”在普通词典,如果是反向切分,那么结果应该是,如果是正向切分应该是,无论如何都分不出。这说明什么?说明“京华烟云”是在那个专有词典所以先切分出“京华烟云”,然后剩下的“山东北”交由普通词典切分,明显是正向最大匹配的结果呈现。当然按照我们在前面讲的算法推导“山东北”的切分也会得出的结论。但是明显比正向最大匹配多几个判断步骤,既然效果一样,另外一个更加简洁的方法也能说得通,那当然选择简便的方法了。所以初步判断百度采取的是正向最大匹配。我们继续测试采用何种分词算法,为了减少专有词典首先分词造成的影响,那么查询里面不能出现相对特殊的词汇我们查询“天才能量级”,看看这里应该没有专有词典出现过的词汇,百度切分为天才 /能量/ 级 看来是正向最大匹配的结果。另外,如果所有查询词汇都出现在专有词典,那么采取的是何种方法?这样首先就得保证词汇都出现在专有词典,这么保证这一点呢?我们构造查询“山东京城”,百度切分为“山东/京城”,说明“东京”是在普通词典的。构造查询“陈晓东京华烟云”,通过前面分析可以看出两个词汇都在专有词典里面,百度切分为陈晓东 /京华烟云 ,说明对于专有词典词汇也是采取正向最大匹配或者双向最大匹配。那么使用反向最大匹配了吗?构造查询例子“陈晓东方不败”。首先我们肯定“陈晓东”和“东方不败”都是在专有词典出现的,如果是正向切分陈晓东 /方/ 不败 那么应该是或者如果是反向切分则是陈晓/东方不败可以看出百度的切分是或者,说明采用的是正向最大匹配。通过分析,百度的词典不包含“不败”这个单词。所以实际上百度的切分很明显这和我们以前推导的算法是有矛盾的,所以以前的分析算法确实有问题,所以结论是百度采取的是正向最大匹配算法重新归纳一下百度的分词系统:首先用专有词典采用最大正向匹配分词,切分出部分结果,剩余没有切分交给普通词典,同样采取正向最大匹配分词,最后输出结果。另外,GOOGLE也是采用正向最大匹配分词算法,不过好像没有那个专用词典,所以很多专名都被切碎了
中文分词的技术难点
有了成熟的分词算法,是否就能容易的解决中文分词的问题呢?事实远非如此。中文是一种十分复杂的语言,让计算机理解中文语言更是困难。在中文分词过程中,有两大难题一直没有完全突破。 歧义是指同样的一句话,可能有两种或者更多的切分方法。主要的歧义有两种:交集型歧义和组合型歧义,例如:表面的,因为“表面”和“面的”都是词,那么这个短语就可以分成“表面 的”和“表 面的”。这种称为交集型歧义(交叉歧义)。像这种交集型歧义十分常见,前面举的“和服”的例子,其实就是因为交集型歧义引起的错误。“化妆和服装”可以分成“化妆 和 服装”或者“化妆 和服 装”。由于没有人的知识去理解,计算机很难知道到底哪个方案正确。交集型歧义相对组合型歧义来说是还算比较容易处理,组合型歧义就必须根据整个句子来判断了。例如,在句子“这个门把手坏了”中,“把手”是个词,但在句子“请把手拿开”中,“把手”就不是一个词;在句子“将军任命了一名中将”中,“中将”是个词,但在句子“产量三年中将增长两倍”中,“中将”就不再是词。这些词计算机又如何去识别?如果交集型歧义和组合型歧义计算机都能解决的话,在歧义中还有一个难题,是真歧义。真歧义意思是给出一句话,由人去判断也不知道哪个应该是词,哪个应该不是词。例如:“乒乓球拍卖完了”,可以切分成“乒乓 球拍 卖 完 了”、也可切分成“乒乓球 拍卖 完 了”,如果没有上下文其他的句子,恐怕谁也不知道“拍卖”在这里算不算一个词。 命名实体(人名、地名)、新词,专业术语称为未登录词。也就是那些在分词词典中没有收录,但又确实能称为词的那些词。最典型的是人名,人可以很容易理解。句子“王军虎去广州了”中,“王军虎”是个词,因为是一个人的名字,但要是让计算机去识别就困难了。如果把“王军虎”做为一个词收录到字典中去,全世界有那么多名字,而且每时每刻都有新增的人名,收录这些人名本身就是一项既不划算又巨大的工程。即使这项工作可以完成,还是会存在问题,例如:在句子“王军虎头虎脑的”中,“王军虎”还能不能算词?除了人名以外,还有机构名、地名、产品名、商标名、简称、省略语等都是很难处理的问题,而且这些又正好是人们经常使用的词,因此对于搜索引擎来说,分词系统中的新词识别十分重要。新词识别准确率已经成为评价一个分词系统好坏的重要标志之一。
lpir/ictclas2014分词系统怎么使用
使用方法,首先到网上下载ICTCLAS,因为我是windows下的C++实现, 下载ICTCLAS2011_Windows_32_c,解压,里面有很好的Demo,Doc,copy API目录下的所有文件(夹)到你所在的工程,在你的源文件加上 #include “ICTCLAS50.h“ #pragma comment(lib, “ICTCLAS50.lib“) //ICTCLAS50.lib库加入到工程中 // //your code here,可参考Demo里面的代码 // 即可。 大概的函数C++函数接口都在Doc文件下的文档中: bool ICTCLAS_Init(const char* pszInitDir=NULL);初始化函数 返回值 如果初始化成功返回true, 否则返回false. 如初始化不成功,请查看ictclas.log文件了解详细错误原因. 参数 pszInitDir:初始化路径,应包含配置文件(Configure.xml)和词典目录(Data目录)以及授权文件(user.lic). 如果这些文件及目录在系统运行当前目录下,此参数可以为null。 bool ICTCLAS_Exit( );退出,释放内存 返回值 成功返回true;否则返回false。 unsigned int ICTCLAS_ImportUserDict(const char *sFilename,eCodeType eCT) //导入用户自定义词典 返回值 导入成功的词的个数 参数 sFilename: 用户定义词典文件 eCT:编码格式 int ICTCLAS_ParagraphProcess(const char *sParagraph,int nPaLen,eCodeType eCt,int bPOStagged,char* sResult);//对一段文字进行分词 返回值 返回结果缓冲区的指针(sResult)以及结果的长度R 参数 sParagraph: 原始文字段 nPaLen: 文字段的长度 eCodeType: 文字段的编码格式 bPOStagged: 需不需要根据标注集做标记 0 = 做标记 ; 1 = 不标记; 默认为1. sResult: 输出结果 t_pstRstVec ICTCLAS_ParagraphProcessA(const char *sParagraph,int PaLen,eCodeType eCodeType,int bPOStagged,int &nRstCnt); //处理文字段 返回值 结果vector的指针,系统调用,用户无法分配以及释放 struct stResult{ int start; //start position int length; //length #ifdef POS_TAGGER int iPOS; //POS char sPOS[POS_SIZE];//word type #endif int word_ID; //word_ID int word_type; //Is the word of the user’s dictionary?(0-no,1-yes) int weight;// word weight };