《基于相似度分析的拼写校正器》

基于相似度分析的拼写校正器

吴炜 1   周闻钧2   王力生1

1同济大学计算机系,2同济大学软件学院, 上海市四平路1239号,200092

wweric2000@163.comzhou_wenjun@21cn.comlishwang@online.sh.cn

 

  要:本文将相似度分析应用于英文拼写校正器中。用户在使用搜索引擎进行信息查询时,往往会因输入拼写错误的单词,而使查询结果不够精确。本文尝试采用相似度分析的方法来校正拼写错误。采用两个单词间的元操作次数[1]作为相似度标准,最后把相似度最大的三个单词返回给用户。通过实验发现,使用本文介绍的方法可达到一个相当高的校正精度。

关键词:拼写校正;相似度;Levenshtein Distance;聚类

 

Abstract: This Paper applies the analysis of Similarity to correct the spelling errors of English words. When people use the search engines, because of the spelling mistakes of query words it is usual that they can not get the information that they need eagerly. This paper attempt to use the similarity of words to correct the spelling errors. The number of Elementary Operations[1](i.e. single replacements, insertions and deletions) is considered the similarity. Eventually, it will return 3 recommending correct words to users. Through a series of tests, it shows that the corrector perform wonderfully.

引言

搜索引擎是Web用户使用最频繁的工具,但现在主流的搜索引擎主要通过关键词来检索信息,这就使用户输入的关键词的正确性成了决定检索结果精确性的唯一因素。Internet上绝大部分的信息都是以英文形式发布,这对非英文国家的用户来说,当查询英文信息时,发生单词拼写错误的可能性很大。

本文尝试通过分析单词之间的相似度确定用户输入的单词的正确形式。这里使用字符串距离作为相似度的标准,即两个字符串之间的元操作次数。目前,拼写检查器一般是通过单词匹配来检索正确的单词,这样往往造成把属于同一词根的单词因为时态不同而认为是两个完全不同的单词。本文通过相似度来聚类属于同一词根的单词,只要适当地调整相似度的最小阀值就可以把属于同一词根而因时态变化造成的“异形”词聚类在同一类,然后在同一类中按相似性从大到小排列,返回前三个单词作为候选单词供用户参考。

接下去的文章布局是这样的,第1部分是有关相似度聚类的常用方法;第2部分是介绍本文用来计算字符距离的Levenshtein Distance[4]算法;第3部分有关拼写校正器的原理和结构,以及一些改进功能;第4部分还给出了基于这个校正器的一些实验结果以及一些问题;最后部分是总结。

1       基于相似度的聚类分析

聚类的目的是将数据对象分组成为多个类或簇,使得同一个簇中的对象之间具有较高的相似度,而不同簇中的对象差别较大。

选择一个好的相似度标准是一个棘手的问题。本文中把字符串间的元操作次数[1]作为相似度标准,相似度越高则两个字符串越相似。这里当然还存在一个设定阀值的问题。比如不考虑相似度值小于0.5的字符串。但这个阀值不应该是静态的,而应该根据字符串长度动态设定。当字符串长度较大时,可以适当地调高阀值;而字符串长度较小的时候,可以把阀值调低一点。因为一个字符在不同长度的字符串中的起到的作用是不同的。比如一个10个字符长的字符串,其中发生一个字符错误,其影响显然没有一个仅为4个字符长的字符串中发生一个字符错误的影响大。

要计算字符串之间的相似度,首先要计算字符串之间的距离。下面介绍几种常用的距离的计算方法,也是聚类分析中对标量相似度计算的常用方法[5]:

1)最常用的距离度量方法是欧几里德距离,它的定义如下:

其中 是两个p维的数据对象。在字符串比较中可以把一个字符串看成是一个p维的数据对象,其中p为字符串字符个数。

2)另一个著名的度量方法是曼哈坦距离,其定义如下:

3)明考斯基距离是欧几里德距离和曼哈坦距离的概化,它的定义如下:

其中q是一个正整数。当q=1时,它表示曼哈坦距离,当q=2时表示欧几里德距离。

    4)Levenshtein Distance是根据源字符串与目标字符串之间的元操作次数来度量字符串间的距离的,本文选择使用该算法来计算字符串距离。因为LevenShtein Distance可以比较不同长度的字符串之间的距离,而前三种方法只能比较相同长度的字符串。第2 部分将会对Levenshtein Distance做简要介绍。

2       Levenshtein Distance

Levenshtein Distance是以俄国科学家Vladimir Levenshtein命名的,他在1965年设计了计算Levenshtein Distance的这个算法。Levenshtein Distance还应用在语音识别、DNA分析等领域。

Levenshtein Distance定义为源字符串转变成目标字符串所需的元操作次数[1]。元操作次数定义为一个字符串转变成另一个字符串所需的基本操作次数。比如,move 转变成movie的元操作次数是1,也就是move与movie之间的Levenshtein Distance是1。因为要在move中增加字符i才可以变成movie。基本操作:包括增加1个字符、删除1个字符和替换1个字符三种操作。Levenshtein Distance越大,说明两个字符串之间的差别越大。

LevenShtein Distance计算字符串距离具有其它方法不具备的以下优点:

1)      可以计算不同长度的字符串之间距离,而欧几里德距离、曼哈坦距离和明考斯基距离只能计算相同长度的字符串之间距离;

2)      元操作更加真实地反映了人为引起的拼写错误;

LevenShtein Distance算法也有计算开销大的缺点,这主要是由矩阵计算引起的。

计算Levenshtein Distance的算法如下[4]:

步骤

说明

1

n为s的字符个数.
设m为t的字符个数.
If n = 0, return m and exit.
If m = 0, return n and exit.
建立一个0..m行、0..n列的矩阵.

2

初始化第一行为 0..n.
初始化第一列为 0..m.

3

检查s中的每个字符(i from1 to n).

4

检查t中的每个字符(j from 1 to m).

5

如果s[i] 等于t[j], 则cost 为0.
如果s[i] 不等于t[j], 则cost 为1.

6

矩阵中的单元d[i,j]等于下列三者中的最小者:
a. 同列上一个单元的值加1: d[i-1,j] + 1.
b. 同行前一个单元的值加1: d[i,j-1] + 1.
c. 正左上方单元的值加cost: d[i-1,j-1] + cost.

7

迭代执行完第3, 4, 5, 6步骤以后, s与t的距离就是d[n,m].

3       基于相似度分析的拼写校正器

本文设计的拼写校正器是以相似度分析为核心。相似度计算的核心是LevenShtein Distance,本文采用以下的相似度计算公式,

 [2]

其中edit-distance采用LevenShtein Distance算法,wn()是单词的字符个数。

校正器先对用户输入的原始数据进行数据预处理,预处理包括去掉输入串中的Stop Words[2]。比如去掉a、an、the、this等Stop Words,而提取出输入串中的主单词(the Primary Word[1])。因为一般来说Stop Words对查询来说没有意思,查询主要是根据主单词来检索信息。预处理后是确定单词匹配范围,本文是根据字符串(预处理后)长度来确定匹配范围的。这主要原因是为了减少计算开销,因为一个原本是10个字符长的字串,没有必要与小于6个字符长的字串做匹配,但匹配范围上下波动几个字符这要根据人为错误的发生概率来决定。比如说一般拼写错误不会超过2个字符的差错,则对一个10字符长的字串只要对字符长度为8-12中的单词进行匹配就可以了。确定好匹配范围以后就可以开始计算源单词与目标单词之间的相似度了,最后根据相似度大小从大到小排列,取最大的三个单词为候选单词返回给用户,供用户参考选择。具体流程见图-1。程序中对不同长度的单词设定的相似度阀值是动态调整的,长度越大,阀值越大,只有相似度大于等于阀值的单词才有可能成为候选单词,最后从这些单词中取出相似度最大的三个作为候选单词。

-1 校正器流程

   词库的组织对校正器的计算也至关重要。本文选择了大学四级单词(《金山词霸2002》)作为校正器的词库。由于匹配范围是根据字符长度来定,词库组织成按不同字符长度的单词来分类,并每类存放在相应的词库文件中。

校正器是在Microsoft最新的ASP.NET平台上进行开发的,使用C#语言编写。程序界面见图-2

-2 拼写校正器

校正器可以嵌入在搜索引擎中,作为搜索引擎的预处理程序。校正器界面正中央是输入框和搜索按钮,这跟常见的搜索引擎界面差不多;输入框下面是搜索引擎选择栏,包括了一些常用的搜索引擎;输入框上面是提示栏,给出候选单词供用户参考;界面左上方的数字是三个候选单词的相似度。如果用户输入的单词跟词库中的单词完全匹配校正器就认为是正确的单词,而直接进行搜索。若不能完全匹配则会给出最多三个候选正确单词供用户选择,点击相应的单词即可直接搜索。

4         校正器精度测试

为了得到校正器精确的校正精度,本文对校正器做了一系列测试。一个是针对单错误情况下的校正测试,另一个是针对双错误情况下的校正测试。测试选择了最常用的6个字符长的单词,一共130个单词(《金山词霸2002》中四级单词表节选),错误类型跟元操作类型一样,插入字符、删除字符和替换字符。第一个实验的原始数据是发生1个错误的单词,第二个实验的数据是发生2个错误的单词。为了测试校正器精度,我们设计了一个错误产生器,对这130个正确单词进行插入、删除和替换字符操作,产生出相应的错误单词。错误类型都是程序随即产生,这跟人为的错误应该会有一定的差距。产生的错误单词也表明,有些错误是人为很难犯的拼写错误。但即使这样苛刻的条件,校正器仍旧表现得十分出色。

在单错误情况下,校正器表现得相当出色。130个错误单词,校正器正确校正了其中的128个。其中121个是第一候选(见图表-1说明)6个是第二候选,1个是第三候选,精确率为98.5%。而错误校正的2个错误单词由于恰好是另2个正确单词,校正器就误认为是正确单词了,没有真正误判的情况,可见针对单字符错误校正器的精度是相当高的。详细结果见图表-1


图表-
1 单错误校正结果。其中第一(二/三)候选指正确单词位于三个候选单词中的第一(/)位,属于正确校正;其中长度原因指错误单词的长度与原始单词的长度相差2个字符,从而正确单词没有被包括在匹配范围之内,所以没有被正确校正;单词原因指错误单词恰好变成另一个正确单词;其余候选未列出的是误判。长度原因、单词原因误判这三者属于错误校正

 

在双错误情况下,校正器的校正精度没有如单错误情况高。130个错误单词,校正器正确校正了94个。其中75个是第一候选,14个是第二候选,5个是第三候选,精确率为72.3 %。而错误校正中长度原因占了绝大部分,真正误判的有6个。详细结果见图表-2。产生这个结果的主要原因是校正器只对长度相差一个字符的单词进行匹配,比如实验中原始是6个字符长的字串,校正器只对57之间的单词进行匹配。但由于错误是随即产生的,如果2个错误都是插入字符或删除字符,则错误单词与正确单词的长度相差为2,正确单词就不会包括在匹配范围之内,所以校正器也就不能列出正确单词了。增大匹配范围可以提高精度,但同时会增加计算开销。要找到匹配范围与开销的最佳比例,这也是有待讨论的问题。

图表-2 双错误校正结果。解释同图表-1

4.1一些问题的讨论

通过相似度分析来校正拼写错误还存在一些问题需要讨论。作者认为在计算得到三个候选单词以后,仍旧需要对这三个单词进行再加工。上面的实验结果表明,很多候选单词中的相似度都是一样的,但不表明这些单词与原始单词之间的差别也是一样的。这其实是距离计算方法引起的。比如说test与rest之间的LevenShtein距离是1,但test与tent之间的LevenShtein距离也是1,但由于test与rest是首字母不同,其对相似度的影响要更大,从而test与tent更加相似。这其实就是距离计算方法和相似度计算方法的选择问题。距离计算方法应尽量能真实地体现两个字串之间的差异性,相似度计算应精确地区分出两个字串之间的细微差别。其实可以给LevenShtein Distance加上出错权,即不同长度的字串的不同位置字符出错,其权值应该是不同的。字串长度越小、越靠左的字符出错,其出错权值越大,这是下阶段有待研究的地方。其次是相似度阀值设定问题,到底相似度大于几的时候两个字串之间才有可比性。不同长度的单词其阀值应该动态调整,也要根据经验来调整。提高校正精确性是校正器的目标,如果校正器能跟搜索引擎的查询聚类(Query Clustering[2])结合起来理论上可以显著提高校正精度。因为每个Web用户都会有自己的特定兴趣,他往往访问与他兴趣度相关的页面。根据其以往的查询关键词,对其做兴趣度聚类,可以分析出他的兴趣方向,这在校正单词的时候可以作为确定单词范围的重要依据,这样就可以大大提高校正的精确性。这其实已经加入了语义的成分,根据其兴趣度来猜测其输入单词的语义,从而来确定其要输入的单词,真正意义上实现了智能校正。作者认为这是将来拼写校正器发展的方向,也是作者下阶段努力的目标。

5         结论

拼写校正器是搜索引擎的重要组成部分,本文通过相似度分析来匹配寻找与原始单词最接近的正确单词。通过实验发现,这个方法的精确性还是令人满意的。由于实验产生的错误是程序随机产生的,有些错误是不符合人为习惯的,实际精度理论上还可以更高。该校正器由于纯粹使用单词字母来匹配,没有利用语义的信息,精确性还有提高的空间,这也是校正器有待改进的地方。如何结合查询聚类(Query Clustering)来智能地校正拼写错误,将是我们需要进一步研究的内容。

 

参考文献:

[1]  Vladimir Cherkassky, Nikolaos Vassilas and Gregory L.Brodt. CONVERTIONAL AND ASSOCIATIVE MEMORY-BASED SPELLING CHECKERS. IEEE, 1990

[2]  Ji-Rong Wen and Hong-Jiang Zhang. Query Clustering in the Web Content. INFORMATION RETRIVIAL AND CLUSTERING. 2002 Kluwer Academic Publishers.

[3]  M.-W.Du and S.C. Chang. An Approach to Designing Very Fast Approximate String Matching Algorithms. IEEE TRANSACTIONS ON KNOWLEDGE AND DATA ENGINEERING, VOL 6. NO 4, AUGUST 1994

[4] Michael Gilleland. Levenshtein Distance, in Three Flavors. http://www.merriampark.com/ld.htm

[5]  Jiawei Han, Micheline Kamber, 数据挖掘概念与技术,机械工业出版社,2001年

作者介绍:

吴炜 ,男,硕士研究生,研究方向:数据仓库、数据挖掘、Web挖掘;

周闻钧,男,讲师,研究方向:数据仓库、海量数据挖掘、Web挖掘;

王力生,男,副教授,硕士生导师,研究方向:数据挖掘、商业智能(BI)、嵌入式系统。

第一作者联系方式:

上海市四平路1239号同济大学0338信箱。邮编:200092

Email:wweric2000@163.com      

电话:021-65975130



原文下载 《基于相似度分析的拼写校正器》

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值