拼音相似度比较
更新时间:2024-05-29
简介
本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)
https://platform.bj.bcebos.com/sdk/asr/asr_doc/doc_download_files/similarwordsV1.zip