我想在我的Android应用程序中以语音方式比较字符串。但这里的特例是,我想比较用英语写的印度语单词。例如,我想检查“Edhu”“Adhu”“Yethu”在语音上是否相等,它们在泰米尔语中都是相同的。但是使用英文脚本来写印度语的人使用不同的拼写来表达这个词。在这种情况下如何比较单词?
我试过了Levenshtein。但我不知道如何将它返回的数字转换为相等。
我尝试了Soundex,当这个词的第一个字母改变时,Soundex代码不一样。但它能够找出类似的声音部分。我不明白它是如何工作的。
soundex.encode("Yethu") (soundex.encode("Edhu")) (soundex.encode("adhu"))
Y300 E300 A300
答案 0 :(得分:6)
根据我的理解,你想要用英语写的单词,用语音分解它们,然后将拼写不同的单词组合在一起,但具有相同的语音表示。
对于这个SoundEx是一个90%的解决方案,前提是拼写单词的人在将这些单词从泰米尔语翻译成英语时实际上正在使用正确的辅音。
您应该只能从SoundEx表示中删除第一个值,并在第一个字母为元音时将其用作编码。
原因是SoundEx(https://en.wikipedia.org/wiki/Soundex)仅对其所呈现的单词中的辅音执行其编码。它抛弃了所有的元音加上h和w - 除非 - 元音是单词中的第一个字母 - 这解释了为什么你的价值观略有不同,但仅限于第一个字母中编码。
至于你的零,SoundEx编码根据定义是1个字母和3个数字(仅1到6),每个单词(d或t)只有1个辅音,SoundEx将它们都映射到数字3。没有辅音,我相信它会增加2个零符号。因此你得到Letter300
如果您要继续为您的应用程序使用SoundEx,您应该记住它只能根据其字母编号(1-6)编号(1)给您26 * 6 * 6 * 6 = 5616个唯一编码-6)数字(1-6)方案。这意味着语音编码将不是唯一的,并且一些完全不同的词将具有碰撞的SoundEx编码。