Soundex算法
阅读《SQL必知必会》第 8 课 使用函数处理数据,提到Soundex(),语音筛选,看看算法
算法介绍
Soundex是一种语音算法,利用英文字的读音计算近似值,值由四个字符构成,第一个字符为英文字母,后三个为数字。在拼音文字中有时会有会念但不能拼出正确字的情形,可用Soundex做类似模糊匹配的效果。
算法简要说明
第一步:保留第一个字母,去掉第一个字母之后的所有的a, e, i, o, u, y, h, w;还有种说法为将上述字母归位0,后续将0去除。
第二步:将英文字按以下规则替换(除第一个字符外):
b f p v -> 1
c g j k q s x z -> 2
d t -> 3
l -> 4
m n -> 5
r -> 6
第三步:对于相邻的重复的数字只保留一个,即相邻的两个被替换为同一个数字的字母只保留一个;
第四步:保留第一个字母后的三位数字,若不足三位则以0补足。
代码实现(JAVA版)
import java.util.ArrayList;
import java.util.List;
public class Soundex {
private static final long serialVersion = 1L;
public static final char[] MAP = {
//A B C D E F G H I J K L M
'0','1','2','3','0','1','2','0','0','2','2','4','5',
//N O P Q R S T U V W X Y Z
'5','0','1','2','6','2','3','0','1','0','2','0','2'
};
public static String soundex(String s) {
String t = s.toUpperCase();//将其转换为大写(实现英文字母的统一)
StringBuffer sbu = new StringBuffer(); //StringBuffer更加安全
char c;
char prev = '?', PrevOutput = '?';//符号字符
/*主循环,找出映射的字符(最多4个)
* 算法仅能处理 ASCII 码,不要用Character.isLetter()
* */
for(int i = 0; i < t.length() && sbu.length() < 4 && (c = t.charAt(i)) != ','; i++) {
//判断字母是否为大写,且是否为符号字符
if(c >= 'A' && c <= 'Z' && c!= prev) {
prev = c;
//沿用首字符,依次进行排序,不是首字符的按照 Soundex 码
if(i == 0) {
sbu.append(c);
}else {
char m = MAP[c - 'A'];
/*
if(false) {
System.out.println(c + "---->" + m);
}*/
//去除重复的英文字母
if(m != '0' && m != PrevOutput) {
sbu.append(m);
PrevOutput = m;
}
}
}
}
//不能转换的返回null
if(sbu.length() == 0) {
return null;
}
//如果长度不够4就添加0
for(int i = sbu.length(); i < 4; i++) {
sbu.append('0');
}
return sbu.toString();
}}
引用更多
[JAVA代码参考]https://blog.csdn.net/qq_36761831/article/details/82226544
[PYTHON更多]https://www.codeleading.com/article/5880848418/