精华内容
下载资源
问答
  • 中文分词技术(中文分词原理) 一、 为什么要进行中文分词? 词最小的能够独立活动的有意义的语言成分,英文单词之间以空格作为自然分界符的,而汉语以字为基本的书写单位,词语之间没有明显的...

    中文分词技术(中文分词原理)

    一、       为什么要进行中文分词?

    词是最小的能够独立活动的有意义的语言成分,英文单词之间是以空格作为自然分界符的,而汉语是以字为基本的书写单位,词语之间没有明显的区分标记,因此,中文词语分析是中文信息处理的基础与关键。

    Lucene中对中文的处理是基于自动切分的单字切分,或者二元切分。除此之外,还有最大切分(包括向前、向后、以及前后相结合)、最少切分、全切分等等。

    二、       中文分词技术的分类

    我们讨论的分词算法可分为三大类:基于字典、词库匹配的分词方法;基于词频度统计的分词方法和基于知识理解的分词方法。

    第一类方法应用词典匹配、汉语词法或其它汉语语言知识进行分词,如:最大匹配法、最小分词方法等。这类方法简单、分词效率较高,但汉语语言现象复杂丰富,词典的完备性、规则的一致性等问题使其难以适应开放的大规模文本的分词处理。第二类基于统计的分词方法则基于字和词的统计信息,如把相邻字间的信息、词频及相应的共现信息等应用于分词,由于这些信息是通过调查真实语料而取得的,因而基于统计的分词方法具有较好的实用性。

    下面简要介绍几种常用方法:

    1).逐词遍历法。

    逐词遍历法将词典中的所有词按由长到短的顺序在文章中逐字搜索,直至文章结束。也就是说,不管文章有多短,词典有多大,都要将词典遍历一遍。这种方法效率比较低,大一点的系统一般都不使用。

    2).基于字典、词库匹配的分词方法(机械分词法)

    这种方法按照一定策略将待分析的汉字串与一个“充分大的”机器词典中的词条进行匹配,若在词典中找到某个字符串,则匹配成功。识别出一个词,根据扫描方向的不同分为正向匹配和逆向匹配。根据不同长度优先匹配的情况,分为最大(最长)匹配和最小(最短)匹配。根据与词性标注过程是否相结合,又可以分为单纯分词方法和分词与标注相结合的一体化方法。常用的方法如下:

    (一)最大正向匹配法 (MaximumMatchingMethod)通常简称为MM法。其基本思想为:假定分词词典中的最长词有i个汉字字符,则用被处理文档的当前字串中的前i个字作为匹配字段,查找字典。若字典中存在这样的一个i字词,则匹配成功,匹配字段被作为一个词切分出来。如果词典中找不到这样的一个i字词,则匹配失败,将匹配字段中的最后一个字去掉,对剩下的字串重新进行匹配处理……  如此进行下去,直到匹配成功,即切分出一个词或剩余字串的长度为零为止。这样就完成了一轮匹配,然后取下一个i字字串进行匹配处理,直到文档被扫描完为止。

    其算法描述如下:

    (1)初始化当前位置计数器,置为0

    (2)从当前计数器开始,取前2i个字符作为匹配字段,直到文档结束;

    (3)如果匹配字段长度不为0,则查找词典中与之等长的作匹配处理。

    如果匹配成功,

    则,

    a)把这个匹配字段作为一个词切分出来,放入分词统计表中;

    b)把当前位置计数器的值加上匹配字段的长度;

    c)跳转到步骤2);

    否则

    a) 如果匹配字段的最后一个字符为汉字字符,

    ①把匹配字段的最后一个字去掉;

    ②匹配字段长度减2

    否则

    ①把匹配字段的最后一个字节去掉;

    ②匹配字段长度减1

    b)跳转至步骤3);

    否则

    a)如果匹配字段的最后一个字符为汉字字符,

       当前位置计数器的值加2

    否则当前位置计数器的值加1

    b)跳转到步骤2)

    (二)逆向最大匹配法 (ReverseMaximumMatcingMethod)通常简称为RMM法。RMM法的基本原理与MM法相同 ,不同的是分词切分的方向与MM法相反,而且使用的分词辞典也不同。逆向最大匹配法从被处理文档的末端开始匹配扫描,每次取最末端的2i个字符(i字字串)作为匹配字段,若匹配失败,则去掉匹配字段最前面的一个字,继续匹配。相应地,它使用的分词词典是逆序词典,其中的每个词条都将按逆序方式存放。在实际处理时,先将文档进行倒排处理,生成逆序文档。然后,根据逆序词典,对逆序文档用正向最大匹配法处理即可。

    由于汉语中偏正结构较多,若从后向前匹配,可以适当提高精确度。所以,逆向最大匹配法比正向最大匹配法的误差要小。统计结果表明 ,单纯使用正向最大匹配的错误率为 1/16 9,单纯使用逆向最大匹配的错误率为 1/245。例如切分字段“硕士研究生产”,正向最大匹配法的结果会是“硕士研究生 / 产”,而逆向最大匹配法利用逆向扫描,可得到正确的分词结果“硕士 / 研究 / 生产”。

    当然,最大匹配算法是一种基于分词词典的机械分词法,不能根据文档上下文的语义特征来切分词语,对词典的依赖性较大,所以在实际使用时,难免会造成一些分词错误,为了提高系统分词的准确度,可以采用正向最大匹配法和逆向最大匹配法相结合的分词方案(即双向匹配法,见(四)。)

    (三)最少切分法:使每一句中切出的词数最小。

    (四)双向匹配法:将正向最大匹配法与逆向最大匹配法组合。先根据标点对文档进行粗切分,把文档分解成若干个句子,然后再对这些句子用正向最大匹配法和逆向最大匹配法进行扫描切分。如果两种分词方法得到的匹配结果相同,则认为分词正确,否则,按最小集处理。

    3). 全切分和基于词的频度统计的分词方法

    基于词的频度统计的分词方法是一种全切分方法。在讨论这个方法之前我们先要明白有关全切分的相关内容。

    全切分

    全切分要求获得输入序列的所有可接受的切分形式,而部分切分只取得一种或几种可接受的切分形式,由于部分切分忽略了可能的其他切分形式,所以建立在部分切分基础上的分词方法不管采取何种歧义纠正策略,都可能会遗漏正确的切分,造成分词错误或失败。而建立在全切分基础上的分词方法,由于全切分取得了所有可能的切分形式,因而从根本上避免了可能切分形式的遗漏,克服了部分切分方法的缺陷。

    全切分算法能取得所有可能的切分形式,它的句子覆盖率和分词覆盖率均为100%,但全切分分词并没有在文本处理中广泛地采用,原因有以下几点:

    1)全切分算法只是能获得正确分词的前提,因为全切分不具有歧义检测功能,最终分词结果的正确性和完全性依赖于独立的歧义处理方法,如果评测有误,也会造成错误的结果。

    2)全切分的切分结果个数随句子长度的增长呈指数增长,一方面将导致庞大的无用数据充斥于存储数据库;另一方面当句长达到一定长度后,由于切分形式过多,造成分词效率严重下降。

    基于词的频度统计的分词方法:

    这是一种全切分方法。它不依靠词典,而是将文章中任意两个字同时出现的频率进行统计,次数越高的就可能是一个词。它首先切分出与词表匹配的所有可能的词,运用统计语言模型和决策算法决定最优的切分结果。它的优点在于可以发现所有的切分歧义并且容易将新词提取出来。

    4).基于知识理解的分词方法。

    该方法主要基于句法、语法分析,并结合语义分析,通过对上下文内容所提供信息的分析对词进行定界,它通常包括三个部分:分词子系统、句法语义子系统、总控部分。在总控部分的协调下,分词子系统可以获得有关词、句子等的句法和语义信息来对分词歧义进行判断。这类方法试图让机器具有人类的理解能力,需要使用大量的语言知识和信息。由于汉语语言知识的笼统、复杂性,难以将各种语言信息组织成机器可直接读取的形式。因此目前基于知识的分词系统还处在试验阶段。

    5).一种新的分词方法

    并行分词方法:这种分词方法借助于一个含有分词词库的管道进行 ,比较匹配过程是分步进行的 ,每一步可以对进入管道中的词同时与词库中相应的词进行比较 ,由于同时有多个词进行比较匹配 ,因而分词速度可以大幅度提高。这种方法涉及到多级内码理论和管道的词典数据结构。(详细算法可以参考吴胜远的《并行分词方法的研究》。)

    常用中文分词包

     

    1. 庖丁解牛分词包,适用于与Lucene整合。http://www.oschina.net/p/paoding

        庖丁中文分词库是一个使用Java开发的,可结合到Lucene应用中的,为互联网、企业内部网使用的中文搜索引擎分词组件。

        Paoding填补了国内中文分词方面开源组件的空白,致力于此并希翼成为互联网网站首选的中文分词开源组件。 Paoding中文分词追求分词的高效率和用户良好体验。

        Paoding's Knives 中文分词具有极 高效率 和 高扩展性 。引入隐喻,采用完全的面向对象设计,构思先进。

        高效率:在PIII 1G内存个人机器上,1秒 可准确分词 100万 汉字。

        采用基于 不限制个数的词典文件对文章进行有效切分,使能够将对词汇分类定义。

        能够对未知的词汇进行合理解析

     

    2. LingPipe,开源自然语言处理的Java开源工具包。http:/alias-i.com/lingpipe/

        功能非常强大,最重要的是文档超级详细,每个模型甚至连参考论文都列出来了,不仅使用方便,也非常适合模型的学习。

        主题分类(Top Classification)、命名实体识别(Named Entity Recognition)、词性标注(Part-of Speech Tagging)、句题检测(Sentence Detection)、查询拼写检查(Query Spell Checking)、兴趣短语检测(Interseting Phrase Detection)、聚类(Clustering)、字符语言建模(Character Language Modeling)、医学文献下载/解析/索引(MEDLINE Download, Parsing and Indexing)、数据库文本挖掘(Database Text Mining)、中文分词(Chinese Word Segmentation)、情感分析(Sentiment Analysis)、语言辨别(Language Identification)等

     

    3. JE分词包

    4. LibMMSeg http://www.oschina.net/p/libmmseg

        采用C++开发,同时支持Linux平台和Windows平台,切分速度大约在300K/sPM-1.2G),截至当前版本(0.7.1)。

        LibMMSeg没有为速度仔细优化过,进一步的提升切分速度应仍有空间。

    5. IKAnalyzer http://www.oschina.net/p/ikanalyzer

        IKAnalyzer基于lucene2.0版本API开发,实现了以词典分词为基础的正反向全切分算法,是LuceneAnalyzer接口的实现。

        该算法适合与互联网用户的搜索习惯和企业知识库检索,用户可以用句子中涵盖的中文词汇搜索,如用"人民"搜索含"人民币"的文章,这是大部分用户的搜索思维;

        不适合用于知识挖掘和网络爬虫技术,全切分法容易造成知识歧义,因为在语义学上"人民""人民币"是完全搭不上关系的。

    6. PHPCWS http://www.oschina.net/p/phpcws

        PHPCWS 是一款开源的PHP中文分词扩展,目前仅支持Linux/Unix系统。

     

        PHPCWS 先使用“ICTCLAS 3.0 共享版中文分词算法”的API进行初次分词处理,再使用自行编写的“逆向最大匹配算法”对分词和进行词语合并处理,并增加标点符号过滤功能,得出分词结果。

     

        ICTCLASInstitute of Computing Technology, Chinese Lexical Analysis System)是中国科学院计算技术研究所在多年研究工作积累的基础上,基于多层隐马模型研制出的汉语词法分析系统,主要功能包括中文分词;词性标注;命名实体识别;新词识别;同时支持用户词典。ICTCLAS经过五年精心打造,内核升级6次,目前已经升级到了ICTCLAS3.0,分词精度 98.45%,各种词典数据压缩后不到3MICTCLAS在国内973专家组组织的评测中活动获得了第一名,在第一届国际中文处理研究机构SigHan 组织的评测中都获得了多项第一名,是当前世界上最好的汉语词法分析器。

     

        ICTCLAS 3.0 商业版是收费的,而免费提供的 ICTCLAS 3.0 共享版不开源,词库是根据人民日报一个月的语料得出的,很多词语不存在。所以本人对ICTCLAS分词后的结果,再采用逆向最大匹配算法,根据自己补充的一个9万条词语的自定义词库(与ICTCLAS词库中的词语不重复),对ICTCLAS分词结果进行合并处理,输出最终分词结果。

     

        由于 ICTCLAS 3.0 共享版只支持GBK编码,因此,如果是UTF-8编码的字符串,可以先用PHPiconv函数转换成GBK编码,再用phpcws_split函数进行分词处理,最后转换回UTF-8编码。

     

     

    7、KTDictSeg 一个C#.net做的简单快速准确的开源中文分词组件(这个分词算法效果也不错)
    http://www.cnblogs.com/eaglet/archive/2007/05/24/758833.html

    代码下载:http://download.csdn.net/source/521857

    展开全文
  • 中文分词技术

    2015-12-21 23:23:34
    一、 为什么要进行中文分词? 词最小的能够独立活动的有意义的语言成分,英文单词之间以空格作为自然分界符的,而汉语以字为基本的书写单位,词语之间没有明显的区分标记,因此,中文词语分析中文信息...

    一、       为什么要进行中文分词?

    词是最小的能够独立活动的有意义的语言成分,英文单词之间是以空格作为自然分界符的,而汉语是以字为基本的书写单位,词语之间没有明显的区分标记,因此,中文词语分析是中文信息处理的基础与关键。

    Lucene中对中文的处理是基于自动切分的单字切分,或者二元切分。除此之外,还有最大切分(包括向前、向后、以及前后相结合)、最少切分、全切分等等。

    二、       中文分词技术的分类

    我们讨论的分词算法可分为三大类:基于字典、词库匹配的分词方法;基于词频度统计的分词方法和基于知识理解的分词方法。

    第一类方法应用词典匹配、汉语词法或其它汉语语言知识进行分词,如:最大匹配法、最小分词方法等。这类方法简单、分词效率较高,但汉语语言现象复杂丰富,词典的完备性、规则的一致性等问题使其难以适应开放的大规模文本的分词处理。第二类基于统计的分词方法则基于字和词的统计信息,如把相邻字间的信息、词频及相应的共现信息等应用于分词,由于这些信息是通过调查真实语料而取得的,因而基于统计的分词方法具有较好的实用性。

    下面简要介绍几种常用方法:

    1).逐词遍历法。

    逐词遍历法将词典中的所有词按由长到短的顺序在文章中逐字搜索,直至文章结束。也就是说,不管文章有多短,词典有多大,都要将词典遍历一遍。这种方法效率比较低,大一点的系统一般都不使用。

    2).基于字典、词库匹配的分词方法(机械分词法)

    这种方法按照一定策略将待分析的汉字串与一个“充分大的”机器词典中的词条进行匹配,若在词典中找到某个字符串,则匹配成功。识别出一个词,根据扫描方向的不同分为正向匹配和逆向匹配。根据不同长度优先匹配的情况,分为最大(最长)匹配和最小(最短)匹配。根据与词性标注过程是否相结合,又可以分为单纯分词方法和分词与标注相结合的一体化方法。常用的方法如下:

    (一)最大正向匹配法 (MaximumMatchingMethod)通常简称为MM法。其基本思想为:假定分词词典中的最长词有i个汉字字符,则用被处理文档的当前字串中的前i个字作为匹配字段,查找字典。若字典中存在这样的一个i字词,则匹配成功,匹配字段被作为一个词切分出来。如果词典中找不到这样的一个i字词,则匹配失败,将匹配字段中的最后一个字去掉,对剩下的字串重新进行匹配处理……  如此进行下去,直到匹配成功,即切分出一个词或剩余字串的长度为零为止。这样就完成了一轮匹配,然后取下一个i字字串进行匹配处理,直到文档被扫描完为止。

    其算法描述如下:

    (1)初始化当前位置计数器,置为0

    (2)从当前计数器开始,取前2i个字符作为匹配字段,直到文档结束;

    (3)如果匹配字段长度不为0,则查找词典中与之等长的作匹配处理。

    如果匹配成功,

    则,

    a)把这个匹配字段作为一个词切分出来,放入分词统计表中;

    b)把当前位置计数器的值加上匹配字段的长度;

    c)跳转到步骤2);

    否则

    a) 如果匹配字段的最后一个字符为汉字字符,

    ①把匹配字段的最后一个字去掉;

    ②匹配字段长度减2

    否则

    ①把匹配字段的最后一个字节去掉;

    ②匹配字段长度减1

    b)跳转至步骤3);

    否则

    a)如果匹配字段的最后一个字符为汉字字符,

       当前位置计数器的值加2

    否则当前位置计数器的值加1

    b)跳转到步骤2)

    (二)逆向最大匹配法 (ReverseMaximumMatcingMethod)通常简称为RMM法。RMM法的基本原理与MM法相同 ,不同的是分词切分的方向与MM法相反,而且使用的分词辞典也不同。逆向最大匹配法从被处理文档的末端开始匹配扫描,每次取最末端的2i个字符(i字字串)作为匹配字段,若匹配失败,则去掉匹配字段最前面的一个字,继续匹配。相应地,它使用的分词词典是逆序词典,其中的每个词条都将按逆序方式存放。在实际处理时,先将文档进行倒排处理,生成逆序文档。然后,根据逆序词典,对逆序文档用正向最大匹配法处理即可。

    由于汉语中偏正结构较多,若从后向前匹配,可以适当提高精确度。所以,逆向最大匹配法比正向最大匹配法的误差要小。统计结果表明 ,单纯使用正向最大匹配的错误率为 1/16 9,单纯使用逆向最大匹配的错误率为 1/245。例如切分字段“硕士研究生产”,正向最大匹配法的结果会是“硕士研究生 / 产”,而逆向最大匹配法利用逆向扫描,可得到正确的分词结果“硕士 / 研究 / 生产”。

    当然,最大匹配算法是一种基于分词词典的机械分词法,不能根据文档上下文的语义特征来切分词语,对词典的依赖性较大,所以在实际使用时,难免会造成一些分词错误,为了提高系统分词的准确度,可以采用正向最大匹配法和逆向最大匹配法相结合的分词方案(即双向匹配法,见(四)。)

    (三)最少切分法:使每一句中切出的词数最小。

    (四)双向匹配法:将正向最大匹配法与逆向最大匹配法组合。先根据标点对文档进行粗切分,把文档分解成若干个句子,然后再对这些句子用正向最大匹配法和逆向最大匹配法进行扫描切分。如果两种分词方法得到的匹配结果相同,则认为分词正确,否则,按最小集处理。

    3). 全切分和基于词的频度统计的分词方法

    基于词的频度统计的分词方法是一种全切分方法。在讨论这个方法之前我们先要明白有关全切分的相关内容。

    全切分

    全切分要求获得输入序列的所有可接受的切分形式,而部分切分只取得一种或几种可接受的切分形式,由于部分切分忽略了可能的其他切分形式,所以建立在部分切分基础上的分词方法不管采取何种歧义纠正策略,都可能会遗漏正确的切分,造成分词错误或失败。而建立在全切分基础上的分词方法,由于全切分取得了所有可能的切分形式,因而从根本上避免了可能切分形式的遗漏,克服了部分切分方法的缺陷。

    全切分算法能取得所有可能的切分形式,它的句子覆盖率和分词覆盖率均为100%,但全切分分词并没有在文本处理中广泛地采用,原因有以下几点:

    1)全切分算法只是能获得正确分词的前提,因为全切分不具有歧义检测功能,最终分词结果的正确性和完全性依赖于独立的歧义处理方法,如果评测有误,也会造成错误的结果。

    2)全切分的切分结果个数随句子长度的增长呈指数增长,一方面将导致庞大的无用数据充斥于存储数据库;另一方面当句长达到一定长度后,由于切分形式过多,造成分词效率严重下降。

    基于词的频度统计的分词方法:

    这是一种全切分方法。它不依靠词典,而是将文章中任意两个字同时出现的频率进行统计,次数越高的就可能是一个词。它首先切分出与词表匹配的所有可能的词,运用统计语言模型和决策算法决定最优的切分结果。它的优点在于可以发现所有的切分歧义并且容易将新词提取出来。

    4).基于知识理解的分词方法。

    该方法主要基于句法、语法分析,并结合语义分析,通过对上下文内容所提供信息的分析对词进行定界,它通常包括三个部分:分词子系统、句法语义子系统、总控部分。在总控部分的协调下,分词子系统可以获得有关词、句子等的句法和语义信息来对分词歧义进行判断。这类方法试图让机器具有人类的理解能力,需要使用大量的语言知识和信息。由于汉语语言知识的笼统、复杂性,难以将各种语言信息组织成机器可直接读取的形式。因此目前基于知识的分词系统还处在试验阶段。

    5).一种新的分词方法

    并行分词方法:这种分词方法借助于一个含有分词词库的管道进行 ,比较匹配过程是分步进行的 ,每一步可以对进入管道中的词同时与词库中相应的词进行比较 ,由于同时有多个词进行比较匹配 ,因而分词速度可以大幅度提高。这种方法涉及到多级内码理论和管道的词典数据结构。(详细算法可以参考吴胜远的《并行分词方法的研究》。)

    常用中文分词包

     

    1. 庖丁解牛分词包,适用于与Lucene整合。http://www.oschina.net/p/paoding

        庖丁中文分词库是一个使用Java开发的,可结合到Lucene应用中的,为互联网、企业内部网使用的中文搜索引擎分词组件。

        Paoding填补了国内中文分词方面开源组件的空白,致力于此并希翼成为互联网网站首选的中文分词开源组件。 Paoding中文分词追求分词的高效率和用户良好体验。

        Paoding's Knives 中文分词具有极 高效率 和 高扩展性 。引入隐喻,采用完全的面向对象设计,构思先进。

        高效率:在PIII 1G内存个人机器上,1秒 可准确分词 100万 汉字。

        采用基于 不限制个数的词典文件对文章进行有效切分,使能够将对词汇分类定义。

        能够对未知的词汇进行合理解析

     

    2. LingPipe,开源自然语言处理的Java开源工具包。http:/alias-i.com/lingpipe/

        功能非常强大,最重要的是文档超级详细,每个模型甚至连参考论文都列出来了,不仅使用方便,也非常适合模型的学习。

        主题分类(Top Classification)、命名实体识别(Named Entity Recognition)、词性标注(Part-of Speech Tagging)、句题检测(Sentence Detection)、查询拼写检查(Query Spell Checking)、兴趣短语检测(Interseting Phrase Detection)、聚类(Clustering)、字符语言建模(Character Language Modeling)、医学文献下载/解析/索引(MEDLINE Download, Parsing and Indexing)、数据库文本挖掘(Database Text Mining)、中文分词(Chinese Word Segmentation)、情感分析(Sentiment Analysis)、语言辨别(Language Identification)等

     

    3. JE分词包

    4. LibMMSeg http://www.oschina.net/p/libmmseg

        采用C++开发,同时支持Linux平台和Windows平台,切分速度大约在300K/sPM-1.2G),截至当前版本(0.7.1)。

        LibMMSeg没有为速度仔细优化过,进一步的提升切分速度应仍有空间。

    5. IKAnalyzer http://www.oschina.net/p/ikanalyzer

        IKAnalyzer基于lucene2.0版本API开发,实现了以词典分词为基础的正反向全切分算法,是LuceneAnalyzer接口的实现。

        该算法适合与互联网用户的搜索习惯和企业知识库检索,用户可以用句子中涵盖的中文词汇搜索,如用"人民"搜索含"人民币"的文章,这是大部分用户的搜索思维;

        不适合用于知识挖掘和网络爬虫技术,全切分法容易造成知识歧义,因为在语义学上"人民""人民币"是完全搭不上关系的。

    6. PHPCWS http://www.oschina.net/p/phpcws

        PHPCWS 是一款开源的PHP中文分词扩展,目前仅支持Linux/Unix系统。

     

        PHPCWS 先使用“ICTCLAS 3.0 共享版中文分词算法”的API进行初次分词处理,再使用自行编写的“逆向最大匹配算法”对分词和进行词语合并处理,并增加标点符号过滤功能,得出分词结果。

     

        ICTCLASInstitute of Computing Technology, Chinese Lexical Analysis System)是中国科学院计算技术研究所在多年研究工作积累的基础上,基于多层隐马模型研制出的汉语词法分析系统,主要功能包括中文分词;词性标注;命名实体识别;新词识别;同时支持用户词典。ICTCLAS经过五年精心打造,内核升级6次,目前已经升级到了ICTCLAS3.0,分词精度 98.45%,各种词典数据压缩后不到3MICTCLAS在国内973专家组组织的评测中活动获得了第一名,在第一届国际中文处理研究机构SigHan 组织的评测中都获得了多项第一名,是当前世界上最好的汉语词法分析器。

     

        ICTCLAS 3.0 商业版是收费的,而免费提供的 ICTCLAS 3.0 共享版不开源,词库是根据人民日报一个月的语料得出的,很多词语不存在。所以本人对ICTCLAS分词后的结果,再采用逆向最大匹配算法,根据自己补充的一个9万条词语的自定义词库(与ICTCLAS词库中的词语不重复),对ICTCLAS分词结果进行合并处理,输出最终分词结果。

     

        由于 ICTCLAS 3.0 共享版只支持GBK编码,因此,如果是UTF-8编码的字符串,可以先用PHPiconv函数转换成GBK编码,再用phpcws_split函数进行分词处理,最后转换回UTF-8编码。

    展开全文
  • NLP——中文分词技术

    2020-07-12 21:35:48
    “词是什么”(词的抽象定义)和“什么是词”(词的具体界定),这两个基本问题迄今为止也未能有一个权威、明确的表述,更无法拿出令大众认同的词表来。主要难点在于汉语结构与印欧体系语种差异甚大,对词的构成边界...

    一.中文分词简介

    “词”这个概念一直是汉语语言学界纠缠不清而又绕不开的问题。“词是什么”(词的抽象定义)和“什么是词”(词的具体界定),这两个基本问题迄今为止也未能有一个权威、明确的表述,更无法拿出令大众认同的词表来。主要难点在于汉语结构与印欧体系语种差异甚大,对词的构成边界方面很难进行界定。比如,在英语中,单词本身就是“词”的表达,一篇英文文章就是“单词”加分隔符(空格)来表示的,而在汉语中,词以字为基本单位的,但是一篇文章的语义表达却仍然是以词来划分的。因此,在处理中文文本时,需要进行分词处理,将句子转化为词的表示。这个切词处理过程就是中文分词,它通过计算机自动识别出句子的词,在词间加入边界标记符,分隔出各个词汇。
    整个过程看似简单,然而实践起来却很复杂,主要的困难在于分词歧义。以NLP分词的经典语句举例,“结婚的和尚未结婚的”,应该分词为“结婚/的/和/尚未/结婚/的”,还是“结婚/的/和尚/未/结婚/的”?这个由人来判定都是问题,机器就更难处理了。
    此外,像未登录词、分词粒度粗细等都是影响分词效果的重要因素。
    自中文自动分词被提出以来,历经将近30年的探索,提出了很多方法,可主要归纳为“规则分词”“统计分词”和“混合分词(规则+统计)”这三个主要流派:

    • 规则分词是最早兴起的方法,主要是通过人工设立词库,按照一定方式进行匹配切分,其实现简单高效,但对新词很难进行处理。
    • 随后统计机器学习技术的兴起,应用于分词任务上后,就有了统计分词,能够较好应对新词发现等特殊场景。
    • 然而实践中,单纯的统计分词也有缺陷,那就是太过于依赖语料的质量,因此实践中多是采用这两种方法的结合,即混合分词。

    二.规则分词

    基于规则的分词是一种机械分词方法,主要是通过维护词典,在切分语句时,将语句的每个字符串与词表中的词进行逐一匹配,找到则切分,否则不予切分。按照匹配切分的方式,主要有正向最大匹配法、逆向最大匹配法以及双向最大匹配法三种方法。

    1.正向最大匹配法

    正向最大匹配(Maximum Match Method,MM法)的基本思想为:假定分词词典中的最长词有i个汉字字符,则用被处理文档的当前字串中的前i个字作为匹配字段,查找字典。若字典中存在这样的一个i字词,则匹配成功,匹配字段被作为一个词切分出来。如果词典中找不到这样的一个i字词,则匹配失败,将匹配字段中的最后一个字去掉,对剩下的字串重新进行匹配处理。
    如此进行下去,直到匹配成功,即切分出一个词或剩余字串的长度为零为止。这样就完成了一轮匹配,然后取下一个i字字串进行匹配处理,直到文档被扫描完为止。

    其算法描述如下:

    1. 从左向右取待切分汉语句的m个字符作为匹配字段,m为机器词典中最长词条的字符数。
    2. 查找机器词典并进行匹配。若匹配成功,则将这个匹配字段作为一个词切分出来。若匹配不成功,则将这个匹配字段的最后一个字去掉,剩下的字符串作为新的匹配字段,进行再次匹配,重复以上过程,直到切分出所有词为止。

    比如我们现在有个词典,最长词的长度为5,词典中存在“南京市长”和“长江大桥”两个词。
    现采用正向最大匹配对句子“南京市长江大桥”进行分词,那么首先从句子中取出前五个字“南京市长江”,发现词典中没有该词,于是缩小长度,取前4个字“南京市长”,词典中存在该词,于是该词被确认切分。再将剩下的“江大桥”按照同样方式切分,得到“江”“大桥”,最终分为“南京市长”“江”“大桥”3个词。显然,这种结果还不是我们想要的。

    2.逆向最大匹配法

    逆向最大匹配(Reverse Maximum Match Method,RMM法)的基本原理与MM法相同,不同的是分词切分的方向与MM法相反。逆向最大匹配法从被处理文档的末端开始匹配扫描,每次取最末端的i个字符(i为词典中最长词数)作为匹配字段,若匹配失败,则去掉匹配字段最前面的一个字,继续匹配。相应地,它使用的分词词典是逆序词典,其中的每个词条都将按逆序方式存放。
    在实际处理时,先将文档进行倒排处理,生成逆序文档。然后,根据逆序词典,对逆序文档用正向最大匹配法处理即可。
    由于汉语中偏正结构较多,若从后向前匹配,可以适当提高精确度。所以,逆向最大匹配法比正向最大匹配法的误差要小。统计结果表明,单纯使用正向最大匹配的错误率为1/169,单纯使用逆向最大匹配的错误率为1/245。
    比如之前的“南京市长江大桥”,按照逆向最大匹配,最终得到“南京市”“长江大桥”。当然,如此切分并不代表完全正确,可能有个叫“江大桥”的“南京市长”也说不定。

    #!/usr/bin/env python3
    # encoding: utf-8
    '''
    @file: IMM.py
    @time: 2020/7/12 0012 16:46
    @author: Jack
    @contact: jack18588951684@163.com
    '''
    
    
    ## 逆向最大匹配
    class IMM(object):
        def __init__(self, dic_path):
            self.dictionary = set()
            self.maxium = 0
            ## 读取词典
            with open(dic_path, 'r', encoding='utf-8') as f:
                for line in f:
                    line = line.strip()
                    if not line:
                        continue
                    self.dictionary.add(line)
                    self.maxium = len(line)
    
        def cut(self, text):
            result = []
            index = len(text)
            while index > 0:
                word = None
                for size in range(self.maxium, 0, -1):
                    if index - size < 0:
                        continue
                    piece = text[(index - size):index]
                    if piece in self.dictionary:
                        word = piece
                        result.append(word)
                        index -= size
                        break
                if word is None:
                    index -= 1
            return result[::-1]
    
    
    def main():
        text = "南京市长江大桥"
        tokenizer = IMM('imm_dic.txt')
        print(tokenizer.cut(text))
    
    
    if __name__ == '__main__':
        main()
    
    
    imm_dic.txt
    
    南京市
    南京市长
    长江大桥
    
    
    ['南京市', '长江大桥']
    

    3.双向最大匹配法

    双向最大匹配法(Bi-directction Matching method)是将正向最大匹配法得到的分词结果和逆向最大匹配法得到的结果进行比较,然后按照最大匹配原则,选取词数切分最少的作为结果。
    据SunM.S.和Benjamin K.T.(1995)的研究表明,中文中90.0%左右的句子,正向最大匹配法和逆向最大匹配法完全重合且正确,只有大概9.0%的句子两种切分方法得到的结果不一样,但其中必有一个是正确的(歧义检测成功),只有不到1.0%的句子,使用正向最大匹配法和逆向最大匹配法的切分虽重合却是错的,或者正向最大匹配法和逆向最大匹配法切分不同但两个都不对(歧义检测失败)。这正是双向最大匹配法在实用中文信息处理系统中得以广泛使用的原因。
    前面举例的“南京市长江大桥”,采用该方法,中间产生“南京市/长江/大桥”和“南京市/长江大桥”两种结果,最终选取词数较少的“南京市/长江大桥”这一结果。

    三.统计分词

    基于规则的分词,一般都较为简单高效,但是词典的维护是一个很庞大的工程。在网络发达的今天,网络新词层出不穷,很难通过词典覆盖到所有词。随着大规模语料库的建立,统计机器学习方法的研究和发展,基于统计的中文分词算法渐渐成为主流。
    其主要思想是把每个词看做是由词的最小单位的各个字组成的,如果相连的字在不同的文本中出现的次数越多,就证明这相连的字很可能就是一个词。因此我们就可以利用字与字相邻出现的频率来反应成词的可靠度,统计语料中相邻共现的各个字的组合的频度,当组合频度高于某一个临界值时,我们便可认为此字组可能会构成一个词语。
    基于统计的分词,一般要做如下两步操作:

    1. 建立统计语言模型
    2. 对句子进行单词划分,然后对划分结果进行概率计算,获得概率最大的分词方式。这里就用到了统计学习算法,如隐含马尔可夫(HMM)、条件随机场(CRF)等。

    1.语言模型

    语言模型在信息检索、机器翻译、语音识别中承担着重要的任务。用概率论的专业术语描述语言模型就是:为长度为m的字符串确定其概率分布P(w1,w2,……,wm),其中w1到wm依次表示文本中 的各个词语。一般采用链式法则计算其概率值:
    在这里插入图片描述
    观察式3.1可知,当文本过长时,公式右部从第三项起的每一项计算难度都很大。为解决该问题,有人提出n元模型(n-gram model)降低该计算难度。所谓n元模型就是在估算条件概率时,忽略距离大于等于n的上文词的影响,因此P(w1,w2,……,wm)的计算可简化为:
    在这里插入图片描述

    当n=1时称为一元模型(unigram model),此时整个句子的概率可表示为:P(w1,w2,……,wm)=P(w1)P(w2)……P(wn)。在一元语言模型中,整个句子的概率等于各个词概率的乘积。言下之意就是各个词之间都是相互独立的,这无疑是完全损失了句中的词序信息,所以一元模型的效果并不理想。
    当n=2时称为二元模型(bigram model),式3.2变为P(w1,w2,……,wm)=P(wi|wi-1)。当n=3时称为三元模型(trigram model),式3.2变为P(w1,w2,……,wm)=P(wi|wi-2,wi-1)。显然当n>=2时,该模型是可以保留一定的词序信息的,而且n越大,保留的词序信息越丰富,但计算成本也呈指数级增长。

    2.HMM模型

    隐马尔可夫模型(HMM)是将分词作为字符串中的序列标注任务来实现的。其基本思路是:每个字在构造一个特定的词语时都占据着一个确定的构词位置(即词位),现规定每个字最多只有四个构词位置:即B(词首)、M(词中)、E(词尾)和S(单独成词),那么下面句子1)的分词结果就可以直接表示成如2)所示的逐字标注形式:
    1)中文/分词/是/.文本处理/不可或缺/的/一步/!
    2) 中/B文E分/B词/E是/S文/B本/M处/M理/E不/B可/M或/M缺/E的/S一/B步/E!/S
    用数学抽象表示如下:用λ=λ1λ2λn\lambda = \lambda1\lambda2……\lambda n代表输入的句子,n为句子长度,λi\lambda i表示字,o=o1o2……on代表输出的标签,那么理想的输出即为:
    在这里插入图片描述
    在分词任务上,o即为B、M、E、S这四种标记,λ\lambda为诸如“中”“文”等句子中的每个字(包括标点等非中文字符)。
    需要注意的是,P(oλ)P(o|\lambda)是关于2n个变量的条件概率,且不固定。因此,几乎无法对P(oλ)P(o|\lambda)进行精确计算。这里引入观测独立性假设,即每个字的输出仅仅与当前字有关,于是就能得到下式:

    在这里插入图片描述
    事实上,P(okλk)P(ok|\lambda k)的计算要容易很多。通过观测独立性假设,目标问题得到极大简化。然而该方法完全没有考虑上下文,且会出现不合理 的情况。比如按照之前设定的B、M、E和S标记,正常来说B后面只能是M或者E,然而基于观测独立性假设,我们很可能得到诸如BBB、BEM等的输出,显然是不合理的。
    HMM就是用来解决该问题的一种方法。在上面的公式中,我们一直期望求解的是P(oλ)P(o|\lambda),通过贝叶斯公式能够得到:
    在这里插入图片描述
    λ\lambda为给定的输入,因此P(λ)P(\lambda)计算为常数,可以忽略,因此最大化P(oλ)P(o|\lambda)等价于最大化P(oλ)P(o)P(o|\lambda)P(o)
    针对P(oλ)P(o)P(o|\lambda)P(o)作马尔可夫假设,得到:
    在这里插入图片描述
    同时,对P(o)有:
    在这里插入图片描述
    这里HMM做了另外一个假设——齐次马尔可夫假设,每个输出仅仅与上一个输出有关,那么:
    在这里插入图片描述
    于是:
    在这里插入图片描述
    在HMM中,将P(λkok)P(\lambda k|ok)称为发射概率,P(okok1)P(ok|ok-1)称为转移概率。通过设置某些P(okok1)=0P(ok|ok-1)=0,可以排除类似BBB、EM等不合理的组合。
    事实上,式3.9的马尔可夫假设就是一个二元语言模型,当将齐次马尔可夫假设改为每个输出与前两个有关时,就变成了三元语言模型。当然在实际分词应用中还是多采用二元语言模型,因为相比三元模型,其计算复杂度要小很多。
    在HMM中,求解maxP(λo)P(o)maxP(\lambda|o)P(o)的最常用方法是Veterbi算法。它是一种动态规划方法,核心思想是:如果最终的最优路径经过某个oi,那么从初始节点到oi-1点的路径必然也是一个最优路径——因为每一个节点oi只会影响前后两个P(oi1oi)P(oi-1|oi)P(oioi+1)P(oi|oi+1)
    根据这个思想,可以通过递推的方法,在考虑每个oi时只需要求出所有经过各oi-1的候选点的最优路径,然后再与当前的oi结合比较。这样每步只需要算不超过l^2次,就可以逐步找出最优路径。Veterbi算法的效率是O(n*l2),l是候选数目最多的节点oi的候选数目,它正比于n,这是非常高效率的。HMM的状态转移图如图3-1所示:
    在这里插入图片描述
    HMM的Python实现代码:

    #!/usr/bin/env python3
    # encoding: utf-8
    '''
    @file: HMM.py
    @time: 2020/7/12 0012 20:00
    @author: Jack
    @contact: jack18588951684@163.com
    '''
    
    
    class HMM(object):
        def __init__(self):
            import os
            ## 存取算法中间结果,不用每次都训练模型
            self.model_file = 'data/hmm_model.pkl'
            ## 状态值集合
            self.state_list = ['B', 'M', 'E', 'S']
            ## 参数加载,用于判断是否需要重新加载model_file
            self.load_para = False
    
        def try_load_model(self, trained):
            if trained:
                import pickle
                with open(self.model_file, 'rb') as f:
                    self.A_dic = pickle.load(f)
                    self.B_dic = pickle.load(f)
                    self.Pi_dic = pickle.load(f)
                    self.load_para = True
            else:
                # 状态转移概率(状态——>状态的条件概率)
                self.A_dic = {}
                # 发射概率(状态——>词语的条件概率)
                self.B_dic = {}
                # 状态的初始概率
                self.Pi_dic = {}
                self.load_para = False
    
        def train(self, path):
            # 重置几个概率矩阵
            self.try_load_model(False)
            # 统计状态出现次数,求p(o)
            Count_dic = {}
    
            # 初始化参数
            def init_parameters():
                for state in self.state_list:
                    self.A_dic[state] = {s: 0.0 for s in self.state_list}
                    self.Pi_dic[state] = 0.0
                    self.B_dic[state] = {}
                    Count_dic = 0
    
            def makeLabel(text):
                out_text = []
                if len(text) == 1:
                    out_text.append('S')
                else:
                    out_text += ['B'] + ['M'] * (len(text) - 2) + ['E']
                return out_text
    
            init_parameters()
            line_num = -1
            # 观察者集合,主要是字以及标点等
            words = set()
            with open(path, encoding='utf-8') as f:
                for line in f:
                    line_num += 1
    
                    line = line.strip()
                    if not line:
                        continue
                    word_list = [i for i in line if i != '']
                    words |= set(word_list)  # 更新字的集合
                    linelist = line.split()
    
                    line_state = []
                    for w in linelist:
                        line_state.extend(makeLabel(w))
    
                    assert len(word_list) == len(line_state)
    
                    for k, v in enumerate(line_state):
                        Count_dic[V] += 1
                        if k == 0:
                            self.Pi_dic[v] += 1  # 每个句子的第一个字的状态,用于计算初始状态
                        else:
                            self.A_dic[line_state[k - 1][v]] += 1  # 计算转移概率
                            self.B_dic[line_state[k][word_list[k]]] = \
                                self.B_dic[line_state[k]].get(word_list[k], 0) + 1.0
    
                self.Pi_dic = {k: v * 1.0 / line_num for k, v in self.Pi_dic.items()}
                self.A_dic = {k: {k1: v1 / Count_dic[k] for k1, v1 in v.items()} for
                              k, v in self.A_dic.items()}
    
                # 加1平滑
                self.B_dic = {k: {k1: (v1 + 1) / Count_dic[k] for k1, v1 in v.items()}
                              for k, v in self.B_dic.items()}  # 序列化
                import pickle
                with open(self.model_file, 'wb') as f:
                    pickle.dump(self.A_dic, f)
                    pickle.dump(self.B_dic, f)
                    pickle.dump(self.Pi_dic, f)
                return self
    
        def viterbi(self, text, states, start_p, trans_p, emit_p):
            V = [{}]
            path = {}
            for y in states:
                V[0][y] = start_p[y] * emit_p[y].get(text[0], 0)
                path[y] = [y]
            for t in range(1, len(text)):
                V.append({})
                newpath = {}
    
                # 检验训练的发射概率矩阵中是否有该字
                neverSeen = text[t] not in emit_p['S'].keys() and text[t] not in emit_p['M'].keys() and text[t] not in \
                            emit_p['E'].keys() and text[t] not in emit_p['B'].keys()
                for y in states:
                    emitP = emit_p[y].get(text[t], 0) if not neverSeen else 1.0
    
                    (prob, state) = max(
                        [(V[t - 1][y0] * trans_p[y0].get(y, 0) * emitP, y0) for y0 in states if V[t - 1][y0] > 0]
                    )
                    V[t][y] = prob
                    newpath[y] = path[state] + [y]
    
                    path = newpath
    
            if emit_p['M'].get(text[-1], 0) > emit_p['S'].get(text[-1], 0):
                (prob, state) = max([(V[len(text) - 1][y], y) for y in ('E', 'M')])
            else:
                (prob, state) = max([(V[len(text) - 1][y], y) for y in states])
    
            return (prob, path[state])
    
        def cut(self, text):
            import os
            if not self.load_para:
                self.try_load_model(os.path.exists(self.model_file))
                prob, pos_list = self.viterbi(text, self.state_list, self.Pi_dic, self.A_dic, self.B_dic)
                begin, next = 0, 0
                for i, char in enumerate(text):
                    pos = pos_list[i]
                    if pos == 'B':
                        begin = i
                    elif pos == 'E':
                        yield text[begin:i + 1]
                        next = i + 1
                    elif pos == 'S':
                        yield char
                        next = i + 1
                if next < len(text):
                    yield text[next:]
    
    
    hmm = HMM()
    hmm.train('data/trainCorpus.txt_utf8')
    text = '这是一个非常棒的方案!'
    res = hmm.cut(text)
    print(text)
    print(str(list(res)))
    
    

    3.其他统计分词算法

    条件随机场(CRF)也是一种基于马尔可夫思想的统计模型。在隐马尔可夫中,有个很经典的假设,那就是每个状态只与它前面的状态有关。这样的假设显然是有偏差的,于是学者们提出了条件随机场算法,使得每个状态不止与他前面的状态有关,还与它后面的状态有关。
    神经网络分词算法是深度学习方法在NLP上的应用。通常采用CNN、LSTM等深度学习网络自动发现一些模式和特征,然后结合CRF、softmax等分类算法进行分词预测。这一类称为基于深度学习的分词方法。
    对比机械分词法,这些统计分词方法不需耗费人力维护词典,能较好地处理歧义和未登录词,是目前分词中非常主流的方法。但其分词的效果很依赖训练语料的质量,且计算量相较于机械分词要大得多。

    四.混合分词

    事实上,目前不管是基于规则的算法、还是基于HMM、CRF或者deep learning等的方法,其分词效果在具体任务中,其实差距并没有那么明显。在实际工程应用中,多是基于一种分词算法,然后用其他分词算法加以辅助。
    最常用的方式就是先基于词典的方式进行分词,然后再用统计分词方法进行辅助。如此,能在保证词典分词准确率的基础上,对未登录词和歧义词有较好的识别。

    展开全文
  • 中文分词技术总结

    千次阅读 2010-02-08 12:45:00
    中文分词技术总结 一、什么是中文分词 众所周知,英文以词为单位的,词和词之间靠空格隔开,而中文以字为单位,句子中所有的字连起来才能描述一个意思。例如,英文句子“I am a student”,用中文则为:“我...

    中文分词技术总结

    一、什么是中文分词

    众所周知,英文是以词为单位的,词和词之间是靠空格隔开,而中文是以字为单位,句子中所有的字连起来才能描述一个意思。例如,英文句子“I am a student”,用中文则为:“我是一个学生”。计算机可以很简单通过空格知道“student”是一个单词,但是不能很容易明白「学」、「生」两个字合起来才表示一个词。把中文的汉字序列切分成有意义的词,就是中文分词,有些人也称为切词。“我是一个学生”,分词的结果是:“我 是 一个 学生”。

    中文分词是其他中文信息处理的基础,搜索引擎只是中文分词的一个应用。其他的比如机器翻译(MT)、语音合成、自动分类、自动摘要、自动校对等等,都需要用到分词。

    目前研究中文分词的大多是科研院校,清华、北大、中科院、北京语言学院、东北大学、IBM研究院、微软中国研究院等都有自己的研究队伍,而真正专业研究中文分词的商业公司除了海量科技以外,几乎没有了。

    Google的中文分词技术采用的是美国一家名叫 Basis Technology(http://www.basistech.com)的公司提供的中文分词技术,百度使用的是自己公司开发的分词技术,中搜使用的是国内海量科技(http://www.hylanda.com)提供的分词技术。业界评论海量科技的分词技术目前被认为是国内最好的中文分词技术,其分词准确度超过99%,由此也使得中搜在搜索结果中搜索结果的错误率很低。
    (以上内容摘录自附录1)

    二、计算所汉语词法分析系统 ICTCLAS

    中国科学院计算技术研究所在多年研究基础上,耗时一年研制出了基于多层隐马模型的汉语词法分析系统 ICTCLAS(Institute of Computing Technology, Chinese Lexical Analysis System),该系统的功能有:中文分词;词性标注;未登录词识别。分词正确率高达97.58%(最近的973专家组评测结果),基于角色标注的未登录词识别能取得高于90%召回率,其中中国人名的识别召回率接近98%,分词和词性标注处理速度为31.5KB/s。ICTCLAS 和计算所其他14项免费发布的成果被中外媒体广泛地报道,国内很多免费的中文分词模块都或多或少的参考过ICTCLAS的代码。

    下载页面: http://www.nlp.org.cn/project/project.php?proj_id=6

    由于 ICTCLAS 是由 C 语言写成的,现在主流的开发工具用起来不太方便,于是有一些热心的程序员把 ICTCLAS 改为 Java 和 C# 等其他语言。

    (1)fenci,Java 的 ICTCLAS,下载页面: http://www.xml.org.cn/printpage.asp?BoardID=2&id=11502

    (2)AutoSplit,另一个 Java 的 ICTCLAS,已经找不到下载页面,点击本地下载

    (3)小叮咚中文分词,曾经有下载页面,现在找不到了。据作者介绍,从 ICTCLAS 中改进,有 Java,C# 和 C++ 三个版本,介绍页面: http://www.donews.net/accesine

    三、海量智能分词研究版

    海量智能计算技术研究中心为了使中文信息处理领域的研究者们能够共同分享海量智能中心的研究成果,共同提高中文信息处理水平,特此发布《海量智能分词研究版》,供专家、学者和爱好者进行研究。

    下载页面: http://www.hylanda.com/cgi-bin/download/download.asp?id=8

    四、其他

    (1)CSW中文智能分词组件

    运行环境:Windows NT、2000、XP 或更高,可以在 ASP,VB 等微软的开发语言中调用。

    简介: CSW中文智能分词DLL组件,可将一段文本自动的按常规汉语词组进行拆分,并以指定方式进行分隔,且可对其拆分后的词组进行语义、词频标注。其广范应用于各行各业的信息资料检索、分析。

    下载页面: http://www.vgoogle.net/

    (2) C# 写的中文分词组件

    据作者介绍,一个 DLL 文件,可以做中英文分词组件。完全C#托管代码编写,独立开发。

    下载页面: http://www.rainsts.net/article.asp?id=48

    附录:
    1. Winter;中文搜索引擎技术揭密:中文分词;http://www.e800.com.cn/articles/98/1091788186451.html

    展开全文
  • 搜索引擎中文分词技术 由于很多朋友要求写一篇搜索引擎分词技术的文章,特别关于百度分词的。今天就发发给大家 我10月9号在SEOWHY周四答疑群给讲解的分词技术今天给大家帖出来供大家学习一下。 分词技术 : ...
  • 众所周知,英文以词为单位的,词和词之间靠空格隔开,而中文以字为单位,句子中所有的字连起来才能...把中文的汉字序列切分成有意义的词,就是中文分词,有些人也称为切词。我一个学生,分词的结果:我
  • 一、 为什么要进行中文分词? 词最小的能够独立活动的有意义的语言成分,英文单词之间以空格作为自然分界符的,而汉语以字为基本的书写单位,词语之间没有明显的区分标记,因此,中文词语分析中文信息处理...
  • 当然,我们在进行数据挖掘、精准推荐和自然语言处理工作中也会经常用到中文分词技术。 一、为什么要进行中文分词? 词最小的能够独立活动的有意义的语言成分,英文单词之间以空格作为自然分界符的,而汉语以...

空空如也

空空如也

1 2 3 4 5 ... 10
收藏数 182
精华内容 72
关键字:

中文分词技术是什么