拼音相似度比较

简介

本java demo能将中文转换为拼音,并比较拼音相似度;进而可以在一组候选词中,找到读音与搜索词最为接近的词组。

该工具能够有效解决同音词、相似发音词、发音不标准等特殊情况下的语音识别。
例如,在通讯录场景下,如果用户需要识别的正确联系人是“张三”,但语音识别接口返回的结果可能是“张山”;此时则可以将用户的联系人列表和“张山”作为输入,通过本工具查找出与“张山”最匹配的结果,有效提高结果的准确率。具体可参考下方的示例。

示例说明

本工具的输入包括一组候选词和一个搜索词,输出是每个候选词与搜索词的距离(差异值)。注意:距离越短,相似度越高。

示例
输入1: 一组候选词,如:"张三", "张散", "张丹", "张成", "李四", "李奎"
输入2: 一个搜索词, 如:“张山”
输出:每个候选词与搜索词的距离(如下)

[{word=张三, score=2}, {word=张散, score=3}, {word=张丹, score=4}, {word=张成, score=7}, {word=李四, score=18}, {word=李奎, score=20}]

该结果表示 “张山”与“张三” 发音最为相近,则“张三”是最有可能的正确词汇。

局限性举例

以下case将不能很好地适用于本算法,请使用的时候先行评估。

1.区分s和sh,可能相似

输入1 输入2 输出
sao3 shao3 2
sao3 pao3 2
sao3 dao3 2
sao3 hao3 2
输入1 输入2 输出
shi1 zhi1 2
shi1 chi1 2
shi1 si1 2
shi1 sha1 2

2.区分en和eng

输入1 输入2 输出
shen1 sheng1 2
shen1 zhen1 2
shen1 she1 2
输入1 输入2 输出
meng2 men2 2
meng2 ming2 2
meng2 mang2 2

3.区分i和ie

输入1 输入2 输出
xi1 pi1 2
xi1 mi1 2
xi1 xia1 2
xi1 xie1 2

4.区分yue和yu、ye、yun

输入1 输入2 输出
yue4 ye4 2
yue4 yun4 2
yue4 yu4 2

5.类似xi’an词语

输入1 输入2 输出
xi1,an1 xian1 3
xi1,an1 xie4,an1 3
xi1,an1 xin4,an1 3

重要代码

计算2个拼音的相似度,

使用方法如 getEditDistance("zhang1,san1", "zhang1,shan1");

public static int getEditDistance(String s, String t) {
        int d[][]; // matrix
        int n; // length of s
        int m; // length of t
        int i; // iterates through s
        int j; // iterates through t
        char s_i; // ith character of s
        char t_j; // jth character of t
        int cost; // cost
        // Step 1
        n = s.length();
        m = t.length();
        if (n == 0) {
            return m;
        }
        if (m == 0) {
            return n;
        }
        d = new int[n + 1][m + 1];

        // Step 2
        for (i = 0; i <= n; i++) {
            d[i][0] = i;
        }
        for (j = 0; j <= m; j++) {
            d[0][j] = j;
        }

        // Step 3
        for (i = 1; i <= n; i++) {
            s_i = s.charAt(i - 1);
            // Step 4
            for (j = 1; j <= m; j++) {
                t_j = t.charAt(j - 1);
                // Step 5
                cost = (s_i == t_j) ? 0 : 1;
                // Step 6
                d[i][j] = Minimum(d[i - 1][j] + 1, d[i][j - 1] + 1,
                        d[i - 1][j - 1] + cost);
            }
        }
        // Step 7
        return d[n][m];
    }

完整示例代码下载(JAVA)

http://bos.nj.bpc.baidu.com/v1/audio/similarwordsV1.zip