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

位置:首页>文章>详情   分类: Java教程 > 编程技术   阅读(402)   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

相关阅读

这是一个非常常见的面试问题。你被问到,如果你有一个只能在一个方向上遍历的链表,并且如果该链表中有一个循环,你将如何检测它? 好吧,如果您不知道答案,请不要沮丧。我个人的看法是,这类问题并不能评估...
你有没有想过拼写检查器,在任何单词编辑器中,如何在你有任何拼写错误时建议你一个可能的其他单词列表?这是使用拼音搜索完成的。 Soundex 是一种语音算法,用于按英语发音对名称进行索引。目标是将...
插入排序 是一种简单而缓慢的排序算法,它反复从未排序的部分中取出下一个元素,并将其插入到已排序部分的正确位置。 插入排序的思想来源于我们的日常生活经验。例如,当你和朋友一起玩牌时,你会把你挑选的...
Picocli 2.0 添加了对其他 JVM 语言的改进支持,尤其是 Groovy。当 Groovy 语言通过 CliBuilder 类提供内置 CLI 支持时,为什么还要使用 picocli?
递归是一种强大的算法技术(分而治之策略),其中一个函数在同一类型的较小问题上调用自身(直接或间接),以便将问题简化为可解决的问题状态。 1.什么是递归? 递归是一种解决问题的方法,可以部分解决问...
校验和哈希是对用户提供的内容应用特定算法和操作后获得的加密字符序列。在本 Java 散列教程中,我们将学习为文件生成校验和散列。 1. 为什么我们可能要为文件生成哈希? 任何严肃的文件提供商都提...
1.未捕获的异常处理程序 Java 应用程序有两种异常——已检查异常和未检查异常。检查异常必须在方法的 throws 子句中指定或在其中捕获。不必指定或捕获未经检查的异常。 当在 run() 对...
注释 是在 Java 5 中引入的,我们都很兴奋。如此出色的工具可以缩短代码!不再有 Hibernate/Spring XML 配置文件!只是注释,就在我们需要它们的代码中。不再有marker ...
当您使用 JSON Web Token (JWT) 或任何其他需要签名或加密负载信息的令牌技术时,为令牌设置到期日期很重要,因此如果令牌过期
在计算机科学中,合并排序(通常也拼写为 mergesort)是一种基于O(n log n) 比较的排序算法。大多数实现会生成一个稳定排序,这意味着该实现保留了排序输出中相等元素的输入顺序。 归并...