Soundex算法

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/

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值