Coreseek算法分析

Coreseek算法分析

本文对coreseek代码中涉及到的一部分算法进行说明,以便在阅读代码的时候,能更容易理解相关的代码。本文所整理的只是其中的部分算法,后面将在逐渐深入理解的基础上,进一步添加。

一.Soundex 算法

1. 算法原理

Soundex是一种语音算法,利用英文字的读音计算近似值,值由四个字符构成,第一个字符为英文字母,后三个为数字。在拼音文字中有时会有会念但不能拼出正确字的情形,可用Soundex做类似模糊匹配的效果。例如KnuthKant二个字符串,它们的Soundex值都是 K530

大部分的数据库服务器都有 Soundex 函数。Soundex 算法有几个差别不大的变化版本。更详细的说明参考Donald Knuth大师的名著:电脑程序设计的艺术 (The Art Of Computer Programming) 第三卷排序和搜寻。

 

1         名字的第一个字母不变。

2         根据特定的对照表,将剩下的字母转换为数字:

u       a e h i o u w y -> 0

u       b f p v -> 1

u       c g j k q s x z -> 2

u       d t -> 3

u       l -> 4

u       m n -> 5

u       r -> 6

 

3         去除连续重复。

4         去除所有 9

5         如果结果都少于四个字符 (第一个字母加上后面的三位字符),就以零补齐。

6         如果结果超过四个字符,丢弃掉四位之后的字符。

 

KnuthKant为例:

 

   Knuth -> K5030 -> K53 -> K530

   Kant  -> K053  -> K53 -> K530

 

 

 

 

 

2.算法实现

Sphinxsoundex.cpp文件中的void stem_soundex ( BYTE * pWord )函数实现。

void stem_soundex ( BYTE * pWord )

{

// 字母转化规则用数组表示,后面直接根据数组进行映射转化

       static BYTE dLetter2Code [ 27 ] = "01230120022455012623010202";

 

       // check if the word only contains lowercase English letters

       BYTE * p = pWord;

// 进行非英语字母的过滤

       while ( *p>='a' && *p<='z' )

              p++;

       if ( *p )

              return;

 

       // do soundex

       p = pWord+1;

       BYTE * pOut = pWord+1;

       while ( *p )

       {

// 对每一个字符,根据映射关系进行转化,得到转化以后的编码值。

              BYTE c = dLetter2Code [ (*p)-'a' ];

              if ( c!='0' && pOut[-1]!=c )

                     *pOut++ = c;

              p++;

       }

// 0的操作

       while ( pOut-pWord<4 && pOut<p )

              *pOut++ = '0';

 

       *pOut++ = '/0';

}

 

二.Metaphone算法

1. 算法原理

Metaphone是一种基于发音的算法,跟传统的soundex算法相比,metaphone是产生可变长度的输出作为编码值,而soundex是产生固定长度的输出。发音相似的词语产生相同的输出。

Metaphone算法是为了客服soundex算法的一些缺点而发展出来的,它使用了大量的英语发音规则作为算法的依据。后来逐渐有一些算法的变种出现,比如double metaphone算法和Metaphone 3算法。

Metaphone编码算法采用16个常数符号:0BFHJKLMNPRSTWXY。用'0'表示 "th" 'X' 表示"sh" "ch", 其他的符号用来表示他们各自在英语中的发音。元音AEIOU也被用来编码,但值在一个编码的开头使用。下面是这个编码的编码规则。

1.       Drop duplicate adjacent letters, except for C.

2.       If the word begins with 'KN', 'GN', 'PN', 'AE', 'WR', drop the first letter.

3.       Drop 'B' if after 'M' and if it is at the end of the word.

4.       'C' transforms to 'X' if followed by 'IA' or 'H' (unless in latter case, it is part of '-SCH-', in which case it transforms to 'K'). 'C' transforms to 'S' if followed by 'I', 'E', or 'Y'. Otherwise, 'C' transforms to 'K'.

5.       'D' transforms to 'J' if followed by 'GE', 'GY', or 'GI'. Otherwise, 'D' transforms to 'T'.

6.       Drop 'G' if followed by 'H' and 'H' is not at the end or before a vowel. Drop 'G' if followed by 'N' or 'NED' and is at the end.

7.       'G' transforms to 'J' if before 'I', 'E', or 'Y', and it is not in 'GG'. Otherwise, 'G' transforms to 'K'. Reduce 'GG' to 'G'.

8.       Drop 'H' if after vowel and not before a vowel.

9.       'CK' transforms to 'K'.

10.   'PH' transforms to 'F'.

11.   'Q' transforms to 'K'.

12.   'S' transforms to 'X' if followed by 'H', 'IO', or 'IA'.

13.   'T' transforms to 'X' if followed by 'IA' or 'IO'. 'TH' transforms to '0'. Drop 'T' if followed by 'CH'.

14.   'V' transforms to 'F'.

15.   'WH' transforms to 'W' if at the beginning. Drop 'W' if not followed by a vowel.

16.   'X' transforms to 'S' if at the beginning. Otherwise, 'X' transforms to 'KS'.

17.   Drop 'Y' if not followed by a vowel.

18.   'Z' transforms to 'S'.

19.   Drop all vowels unless it is the beginning.

2. 算法实现

sphinxmetaphone.cpp文件中的void stem_dmetaphone ( BYTE * pWord, bool bUTF8 )函数中实现。

因为算法比较简单,跟soundex类似,主要是规则的转化,所以不再一一说明。

 

 

 

 

. MMSEG 中文分词算法

1. MMSeg算法原理

要理解mmseg算法,首先来理解一下chunk,它是MMSeg分词算法中一个关键的概念。Chunk中包含依据上下文分出的一组词和相关的属性,包括长度(Length)、平均长度(Average Length)、标准差的平方(Variance)和自由语素度(Degree Of Morphemic Freedom)。下面列出了这4个属性:

属性

含义

长度(Length)

chuck中各个词的长度之和

平均长度(Average Length)

长度(Length)/词数

标准差的平方(Variance)

同数学中的定义

自由语素度(Degree Of Morphemic Freedom)

各单字词词频的对数之和

 


Chunk
中的4个属性只有在需要该属性的值时才进行计算,而且只计算一次。

其次来理解一下规则(Rule),它是MMSeg分词算法中的又一个关键的概念。实际上我们可以将规则理解为一个过滤器(Filter),过滤掉不符合要求的chunkMMSeg分词算法中涉及了4个规则:

·         规则1:取最大匹配的chunk (Rule 1: Maximum matching)

·         规则2:取平均词长最大的chunk (Rule 2: Largest average word length)

·         规则3:取词长标准差最小的chunk (Rule 3: Smallest variance of word lengths)

·         规则4:取单字词自由语素度之和最大的chunk (Rule 4: Largest sum of degree of morphemic freedom of one-character words)

4个规则符合汉语成词的基本习惯。

再来理解一下匹配方式复杂最大匹配(Complex maximum matching)

复杂最大匹配先使用规则1来过滤chunks,如果过滤后的结果多于或等于2,则使用规则2继续过滤,否则终止过滤过程。如果使用规则2得到的过滤结果多于或等于2,则使用规则3继续过滤,否则终止过滤过程。如果使用规则3得到的过滤结果多于或等于2,则使用规则4继续过滤,否则终止过滤过程。如果使用规则 4得到的过滤结果多于或等于2,则抛出一个表示歧义的异常,否则终止过滤过程。

最后通过一个例句--“研究生命起源"来简述一下复杂最大匹配的分词过程。MMSeg分词算法会得到7chunk,分别为:

编号

评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值