2016-01-09 7 views
5

Я хочу сделать словарь, и мне нужен запрос, который может найти слова с ошибкой (я имею в виду Typos/spelling error или typo), если запрос не смог найти точное слово затем попытаться получить с другим правописанием ...SQL-запрос, который может найти Typos на арабском языке

Так что арабский: в арабском есть некоторые письма с (почти) же произношением, но разными буквами, люди иногда не знают, какой из них следует использовать. Например, есть 4 вида Z на арабском языке произношение "ز/ظ/ذ/ض" - разные (немного), но люди забудут, какой из них правильный. пример одного слова с различными использованием "г" письма:

مریز/مریض/مریظ/مریذ

Правильным является مریض

Вот другие миры, имеет более чем один последний:

z: ض/ز/ذ/ظ 

T: ت/ط/

S: ث/س/ص/

Gh: ق/غ 

Итак, что вы думаете об этом? Как должен быть запрос?

Я хочу, если бы пользователь искал «مریز» вместо того, чтобы показывать ему ошибку 404 (не найден), искать базу данных с другой буквой (все Z), а затем возвращать результат, если я что-то нашел.

+0

Я знаю арабский, но я не знаю, если вы пытались что-нибудь. Понимаете, кто-то даст вам отрицательный результат, потому что вы даже не отправляли никаких запросов, где вы можете увидеть, даже если вы попытались. – Amel

+0

@Amel Я не хочу точного запроса, хочу идею (я не знаю хорошо арабский) спасибо за ваш комментарий – kiokoshin

ответ

5

На немецком языке мы имеем ту же проблему относительно t и tt или dt - особенно в именах.

Одним из способов приблизиться к этому было бы хранить дополнительный нормализованный столбец, содержащий имя/слово с фиксированным преобразованием.

tt -> t 
dt -> t 
ß -> s 
ss -> s 

Так таблица будет содержать

WORD | NORMALIZED 
schmitt | schmit 
schmidt | schmit 

Во время запроса, применять это же преобразование в запрос, а затем сравнить с нормированной колонкой.

+0

Спасибо, я не знал, что на немецком языке есть такая же проблема (мой родной язык не арабский!) , вы знаете, что это отличный словарь, я ищу хороший алгоритм (и запрос), потому что есть около полумиллиона слов для поиска! – kiokoshin

+0

Полиция должна использовать аналогичный алгоритм на автомобильных номерных знаках - это O или 0; I или 1; Z или 2. Даже E vs F может быть проблемой, если есть «пластина». –

4

Существует алгоритм, называемый Levenshtein distance (есть и другие), который сообщает расстояние редактирования между двумя строками.

Вы можете извлечь из этого, попробуйте найти наиболее похожие слова в словаре по сравнению с вашим вводом.

Позже вы можете назначить вес для замещений на основе буквенных кортежей, которые вы упомянули, чтобы уточнить ваш поиск.

На самом деле есть реализация для MySQL вы определенно должны проверить: https://www.artfulsoftware.com/infotree/qrytip.php?id=552
Большинство Левенштейн + MySQL вопросы здесь, в точке SO на эту страницу.

2

Простым решением будет использование регулярных выражений внутри аналогичного оператора. Для букв, которые могут быть написаны с ошибками, вы можете сохранять разновидности в шаблоне регулярного выражения. Для букв, соответствующих г шаблона является «[زذظض]» Вы можете заменить все ز, ذ, ظ, ض письмо с шаблоном, а затем запрос на аналогичное заявлении:

select * from searched_table where word like "%[مرى[زذظض%" 

Найдя все версии искомого слова, вы можете либо показать пользователю все, либо вы можете рассчитать расстояние levenshtein (ответ koshinae) и показать самые близкие слова.

Edit: только для буквы 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; 
+0

Спасибо, дорогой друг. но я хочу иметь динамический запрос. – kiokoshin

+0

Добро пожаловать, и вы можете построить динамический запрос с помощью вышеуказанного запроса, используя команды execute-execute –