我想制作一本字典,我需要有一个查询,可以找到拼写错误的单词(我的意思是拼写错误或拼写错误或拼写错误),如果查询找不到确切的单词,那么请尝试使用其他拼写。
那么什么是阿拉伯语: 在阿拉伯语中有一些字母带有(几乎)相同的发音但字母不同,人们有时不会知道应该使用哪一个。例如阿拉伯语中有4种Z “Ò/ظ/ذ/ض”发音不同(一点点)但是人们会忘记哪一个是正确的拼写。使用“z”字母的一个单词的示例:
مریز/مریض/مریظ/مریذ
正确的是مریض
以下是其他拥有多个后者的世界:
z: ض / ز / ذ / ظ
T: ت / ط /
S: ث / س / ص /
Gh: ق / غ
那么你的想法是什么? 应该如何查询?
我想如果用户搜索“مریز”而不是向他显示404错误(未找到),则用其他字母(全部为Z)搜索数据库,然后如果找到任何内容则返回结果。
答案 0 :(得分:5)
在德语中,我们在t和tt或dt方面存在同样的问题 - 特别是在名称中。
解决此问题的一种方法是存储包含具有固定转换的名称/单词的附加规范化列。
tt -> t
dt -> t
ß -> s
ss -> s
所以表格包含
WORD | NORMALIZED
schmitt | schmit
schmidt | schmit
在查询时,将这些相同的转换应用于查询,然后与规范化列进行比较。
答案 1 :(得分:4)
有一种名为Levenshtein distance的算法(还有其他算法),它告诉两个字符串之间的编辑距离。
您可以从中得出,尝试在您的词典中找到与您的输入相比最相似的单词。
稍后您可以根据您提到的字母元组为替换分配权重以优化搜索。
实际上有一个MySQL的实现,你一定要查看:https://www.artfulsoftware.com/infotree/qrytip.php?id=552
SO中的大多数levenshtein + mysql问题都指向此页面。
答案 2 :(得分:2)
更简单的解决方案是在类似语句中使用正则表达式。 对于可能拼写错误的字母,您可以将变量保存在正则表达式通配符中。 对应于z通配符的字母是“[Òذظض]” 您可以使用通配符替换所有Ò,ذ,ظ,ض字母,然后使用类似的语句进行查询:
select * from searched_table where word like "%[مرى[زذظض%"
找到所搜索单词的所有版本后,您可以向用户显示所有这些单词,也可以计算出levenshtein距离(koshinae的答案)并显示最接近的单词。
编辑:仅针对字母Z,查询将如下所示
set @word = 'مرىض'; -- take this text from user
set @word = replace(@word, 'ذ', 'Z');
set @word = replace(@word, 'ظ', 'Z');
set @word = replace(@word, 'ض', 'Z');
set @word = replace(@word, 'ز', 'Z');
set @word = replace(@word, 'Z', '[زظضذ]');
set @word = Concat('%', @word, '%');
select @word;
select * from mydb.searchTable where word like @word;