Chuang Ye

soundex算法的实现

2019-04-10 python
Word count: 563 | Reading time: 2min

soundex算法

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

算法基本思路

1.保留第一个字母,去掉第一个字母之后的所有的a, e, i, o, u, y, h, w;

1
2
3
word=word.lower() #转换为小写
word1=word[1:] #获取第一个字母后的切片
word1 = re.sub('[aeiouyhw]','',word1) #去除元音字母

2.将英文字按以下规则替换(除第一个字符外)

1
2
3
4
5
6
b f p v -> 1
c g j k q s x z -> 2
d t -> 3
l -> 4
m n -> 5
r -> 6

3.对于相邻的重复的数字只保留一个,即相邻的两个被替换为同一个数字的字母只保留一个;

4.保留第一个字母后的三位数字,若不足三位则以0补足。

1
2
3
4
5
6
7
8
9
#去除重复
for i in range(1,len(result)):
if i<=3:
result1+=result[i]
if len(result)-1<3:
time=3-(len(result)-1)
#补0
for i in range(0,time):
result1+='0'

Python的实现

完整代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
import re
def soundex(word):
word=word.lower()
result=word[0]
word1=word[1:]
word1 = re.sub('[aeiouyhw]','',word1)
for char in word1:
if char=='b' or char=='f' or char=='p'or char=='v':
result+='1'
elif char=='c' or char=='g' or char=='j' or char=='k' or char=='q' or char=='s' or char=='x' or char=='z':
result+='2'
elif char=='d' or char=='t':
result+='3'
elif char=='l':
result+='4'
elif char=='m' or char=='n':
result+='5'
elif char=='r':
result+='6'
print('first_changed_without_control:',result)
result1=result[0]
for i in range(1,len(result)):
if i<=3:
result1+=result[i]
if len(result)-1<3:
time=3-(len(result)-1)
for i in range(0,time):
result1+='0'
print('second_changed_with_control: ',result1)


if __name__ == '__main__':
#乱打的测试
soundex('kdsadasnh')
soundex('dsaddas')
#正常测试
soundex('Knuth')
soundex('Kant')
soundex('Jarovski')

结果

1
2
3
4
5
6
7
8
9
10
first_changed_without_control: k32325
second_changed_with_control: k323
first_changed_without_control: d2332
second_changed_with_control: d233
first_changed_without_control: k53
second_changed_with_control: k530
first_changed_without_control: k53
second_changed_with_control: k530
first_changed_without_control: j6122
second_changed_with_control: j612

< PreviousPost
ubuntu14.4下netease-cloud-music的安装与卸载
NextPost >
便捷存放