使用Soundex算法在java中实现拼音搜索

位置:首页>文章>详情   分类:Java教程   阅读(260)   2023-06-26 07:54:18

你有没有想过拼写检查器,在任何单词编辑器中,如何在你有任何拼写错误时建议你一个可能的其他单词列表?这是使用拼音搜索完成的。 Soundex 是一种语音算法,用于按英语发音对名称进行索引。目标是将同音词(发音与另一个词相同但含义不同,拼写可能不同)编码为相同的表示形式,以便尽管拼写存在微小差异,但它们仍可以匹配,例如bear - beer, Nelson - Neilson - Neelson

它现在是流行数据库软件的标准功能,例如 DB2、PostgreSQL、MySQL、Ingres、MS SQL Server 和 Oracle 以及一些主要的文字编辑器。

Soundex算法

该算法由 Robert Russell 于 1910 年针对英语单词开发。该算法背后的主要原则是辅音根据序数分组,最后编码成一个值,其他辅音与之匹配。它旨在通过上述过程为每个单词找到一个代码,称为 soundex 代码。

The Soundex code for a name consists of a letter followed by three numerical digits: the letter is the first letter of the name, and the digits encode the remaining consonants.

查找 soundex 代码的完整算法如下:

  1. 保留姓名的第一个字母并删除所有其他出现的 a、e、i、o、u、y、h、w。
  2. 用数字替换辅音字母如下(首字母后): 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. 如果两个或多个相同编号的字母在原始名称中相邻(步骤1之前),则只保留第一个字母;由“h”或“w”分隔的具有相同数字的两个字母也被编码为单个数字,而由元音分隔的此类字母被编码两次。此规则也适用于第一个字母。
  4. 重复上一步,直到您有一个字母和三个数字。如果单词中的字母太少而无法分配三个数字,请附加零直到出现三个数字。如果您的字母超过 3 个,只需保留前 3 个数字。

Java 中的 Soundex 实现

Soundex算法的一种实现如下:

package com.howtodoinjava.examples;

public class Soundex 
{
	public static String getGode(String s) 
	{
		char[] x = s.toUpperCase().toCharArray();
		
		
		char firstLetter = x[0];

		//RULE [ 2 ]
		//Convert letters to numeric code
		for (int i = 0; i < x.length; i++) {
			switch (x[i]) {
			case 'B':
			case 'F':
			case 'P':
			case 'V': {
				x[i] = '1';
				break;
			}

			case 'C':
			case 'G':
			case 'J':
			case 'K':
			case 'Q':
			case 'S':
			case 'X':
			case 'Z': {
				x[i] = '2';
				break;
			}

			case 'D':
			case 'T': {
				x[i] = '3';
				break;
			}

			case 'L': {
				x[i] = '4';
				break;
			}

			case 'M':
			case 'N': {
				x[i] = '5';
				break;
			}

			case 'R': {
				x[i] = '6';
				break;
			}

			default: {
				x[i] = '0';
				break;
			}
			}
		}

		//Remove duplicates
		//RULE [ 1 ]
		String output = "" + firstLetter;
		
		//RULE [ 3 ]
		for (int i = 1; i < x.length; i++)
			if (x[i] != x[i - 1] && x[i] != '0')
				output += x[i];

		//RULE [ 4 ]
		//Pad with 0's or truncate
		output = output + "0000";
		return output.substring(0, 4);
	}
}

让我们看看它如何使用上述算法。

class Main {
	public static void main(String[] args) 
	{
		String name1 = "beer";
		String name2 = "bear";
		String name3 = "bearer";
		
		System.out.println(Soundex.getGode(name1));
		System.out.println(Soundex.getGode(name2));
		System.out.println(Soundex.getGode(name3));
	}
}

Output:

B600
B600
B660

从上面的输出中可以清楚地看到单词“bear”和“beer”具有相同的代码;所以他们是拼音的。 “bearer”这个词有不同的代码,因为它的语音不同。

您可以查看一些可用的 soundex 算法的实现,例如Apache commons Soundex 实现

参考

https://en.wikipedia.org/wiki/Soundex http://introcs.cs.princeton.edu/java/31datatype/Soundex.java.html

快乐学习!!

地址:https://www.cundage.com/article/implement-phonetic-search-using-soundex-algorithm.html