浅析常用分词算法的比较与设想

与基于理解的分词算法和基于统计的分词算法相比,基于文本匹配的算法更加通用。基于文本匹配的算法又称之为“机械分词算法”,他是它是按照一定的策略将待分析的汉字串与一个“充分大的”机器词典中的词条进行配,若在词典中找到某个字符串,则匹配成功,可识别出一个词。按照扫描方向的不同,文本匹配分词方法可以分为正向匹配和逆向匹配两种;按照不同长度优先匹配的情况,可以分为最大(最长)匹配和最小(最短)匹配;按照是否与词性标注过程相结合,又可以分为单纯分词方法和分词与标注相结合的一体化方法。

  常用的几种机械分词方法如下:

  1) 正向最大匹配法(由左到右的方向)

  2) 逆向最大匹配法(由右到左的方向)

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

  其他的还有将上述各种方法相互组合形成的分词算法,例如,可以将正向最大匹配方法和逆向最大匹配方法结合起来构成双向匹配法。由于汉语单字成词的特点,正向最小匹配和逆向最小匹配一般很少使用。本文中着重讨论正向最大匹配法和逆向最大匹配法。

  由于机械分词算法的准确性取决于算法的准确性与词库完备性两个方面。在本文中设想词库充分大,包含需要的词语。

  一般说来,逆向匹配的切分精度略高于正向匹配,遇到的歧义现象也较少。统计结果表明,单纯使用正向最大匹配的错误率为1/169,单纯使用逆向最大匹配的错误率为1/245。但这种精度还远远不能满足实际的需要。实际使用的分词系统,都是把机械分词作为一种初分手段,还需通过利用各种其它的语言信息来进一步提高切分的准确率。

  我们先看两句中文:

  1) 长春市长春节致辞

  2) 长春市长春药店

  我们假使词库中包含如下词语“长春”,“长春市”,“市长”,“春节”,“致辞”,“春药”,“药店”,“春药店”等。

  用正向最大匹配法得到的结果是:

  长春市/长春/节/致辞(分成4个词,其中“节”未匹配到,语义错误)

  长春市/长春/药店(分成3个词,都匹配到,语义正确)

  用逆向最大匹配法得到的结果是:

  长春/市长/春节/致辞(分成4个词,都匹配到,语义正确)

  长春/市长/春药店(分成3个词,都匹配到,语义错误)

  从此,我们可以看到正向最大匹配法和逆向最大匹配法的利弊所在:都能够正确解释部分中文,同时都有一些无法区分。

  是否可以考虑将这两种匹配法结合起来,各取所长呢?答案是肯定的。

  首先,我们对同一个词用正向最大匹配法和逆向最大匹配法分别切词,再将结果进行比较。如切分“长春市长春节致辞”,因为正向最大匹配法有一个词语无法匹配,故选择使用逆向最大匹配法作为结果。

  其次,我们可以引入词频的概念,及每一个词语都会根据其在汉语中出现的概率获得一个词频值。我们对“长春市长春药店”进行两种方法的分词,但是因为逆向最大匹配法得到的“春药店”的词频相比于其他词语的词频要低很多。我们可以认为这种分词方法得到的结果不通用,取正向最大匹配法得结果。

  当然,还可以将其他的一些方法(如扫描标志法,词性检查法等)与这两种匹配法相结合,以获得更好更准确的分词效果。

(0)

相关推荐

  • 浅析常用分词算法的比较与设想

    与基于理解的分词算法和基于统计的分词算法相比,基于文本匹配的算法更加通用.基于文本匹配的算法又称之为"机械分词算法",他是它是按照一定的策略将待分析的汉字串与一个"充分大的"机器词典中的词条进行配,若在词典中找到某个字符串,则匹配成功,可识别出一个词.按照扫描方向的不同,文本匹配分词方法可以分为正向匹配和逆向匹配两种:按照不同长度优先匹配的情况,可以分为最大(最长)匹配和最小(最短)匹配:按照是否与词性标注过程相结合,又可以分为单纯分词方法和分词与标注相结合的一体化

  • Java实现的最大匹配分词算法详解

    本文实例讲述了Java实现的最大匹配分词算法.分享给大家供大家参考,具体如下: 全文检索有两个重要的过程: 1分词 2倒排索引 我们先看分词算法 目前对中文分词有两个方向,其中一个是利用概率的思想对文章分词. 也就是如果两个字,一起出现的频率很高的话,我们可以假设这两个字是一个词.这里可以用一个公式衡量:M(A,B)=P(AB)/P(A)P(B),其中 A表示一个字,B表示一个字,P(AB)表示AB相邻出现的概率,P(A)表示A在这篇文章中的频度,P(B)表示B在这篇文章中的频度.用概率分词的好

  • Java常用排序算法及性能测试集合

    现在再回过头理解,结合自己的体会, 选用最佳的方式描述这些算法,以方便理解它们的工作原理和程序设计技巧.本文适合做java面试准备的材料阅读. 先附上一个测试报告: Array length: 20000bubbleSort : 766 msbubbleSortAdvanced : 662 msbubbleSortAdvanced2 : 647 msselectSort : 252 msinsertSort : 218 msinsertSortAdvanced : 127 msinsertSor

  • js实现常用排序算法

    本文为大家分享了js实现常用排序算法,具体内容如下 1.冒泡排序 var bubbleSort = function (arr) { var flag = true; var len = arr.length; for (var i = 0; i < len - 1; i++) { flag = true; for (var j = 0; j < len - 1 - i; j++) { if (arr[j] > arr[j + 1]) { var temp = arr[j+1]; arr

  • PHP常用排序算法实例小结【基本排序,冒泡排序,快速排序,插入排序】

    php三种基础算法:冒泡,插入和快速排序法 $array = array(2,3,5,6,9,8,1); //冒泡排序思想,前后元素比较 function sort_bulldle($array){ $num = count($array); for($i=0; $i<$num; $i++){ $tmp = $array[$i]; for ($j=$i-1; $j>=0; $j--) { if ($tmp < $array[$j]) { $arr[$j+1] = $arr[$j]; $a

  • php 一元分词算法

    复制代码 代码如下: /** * 一元分词算法 * UTF8编码下一个字符如果首字符ASCII码不大于192则只占1个字节 * 如果首字符ASCII码大于192小于224则占用2个字节,否则占用3个字节 * 一元分词需要在mysql的my.ini文件中增加 ft_min_word_len=1 * 可以使用mysql查询语句 show variables like '%ft%' 查看mysql全文搜索相关设置 * * @access global * @param string $str * @p

  • 视觉直观感受若干常用排序算法

    直观感受几种常用排序算法,具体内容如下 1 快速排序 介绍: 快速排序是由东尼·霍尔所发展的一种排序算法.在平均状况下,排序 n 个项目要Ο(n log n)次比较.在最坏状况下则需要Ο(n2)次比较,但这种状况并不常见.事实上,快速排序通常明显比其他Ο(n log n) 算法更快,因为它的内部循环(inner loop)可以在大部分的架构上很有效率地被实现出来,且在大部分真实世界的数据,可以决定设计的选择,减少所需时间的二次方项之可能性. 步骤: 从数列中挑出一个元素,称为 "基准"

  • 百度分词算法详解第1/2页

    本文通过搜索结果归纳分析+切词通用算法分析的方式对百度预处理阶段的查询处理和中文分词两项技术进行了阐述.总结,如果你对数据结构.算法有一定了解的话,理解起来会相对容易些:个人感觉,得出正向最大匹配算法不够准确,无论是专用词典还是普通词典里的词,都是有不同权重的,这根搜索频率应该有一定关系,基于这点,在出现多个专用词典里的词时,是需要采用双向最大匹配算法来检测到底哪一个专有词汇应该先被切出来,当然,这是个人猜想,有待考究. 理解分词技术对SEO工作具有极大意义,可以从科学的角度来分析关键词,并构想

  • 常用Hash算法(C语言的简单实现)

    如下所示: #include "GeneralHashFunctions.h" unsigned int RSHash(char* str, unsigned int len) { unsigned int b = 378551; unsigned int a = 63689; unsigned int hash = 0; unsigned int i = 0; for(i = 0; i < len; str++, i++) { hash = hash * a + (*str);

  • Java常用HASH算法总结【经典实例】

    本文实例讲述了Java常用HASH算法.分享给大家供大家参考,具体如下: /** * Hash算法大全<br> * 推荐使用FNV1算法 * @algorithm None * @author Goodzzp 2006-11-20 * @lastEdit Goodzzp 2006-11-20 * @editDetail Create */ public class HashAlgorithms { /**//** * 加法hash * @param key 字符串 * @param prime

随机推荐