SQLinfo.ru - Все о MySQL

Форум пользователей MySQL

Задавайте вопросы, мы ответим

Вы не зашли.

#1 11.05.2013 01:14:31

FiMko
Активист
Откуда: Санкт-Петербург
Зарегистрирован: 18.09.2009
Сообщений: 198

Spell checking (проверка орфографии) средствами MySQL

Ребята, привет всем!

Пытаюсь придумать запрос, который будет более или менее вменяемо предлагать варианты исправления ошибок в напечатанном слове. Есть большая таблица слов. Среди них, скажем, есть слова: "equalizer", "excelsior". Пользователь неверно набрал слово "equalizer" как "equalizr", тогда можно получить некоторые вменяемые варианты исправлений для опечатки (естественно без использования индексов, увы):

select distinct word from words where word sounds like ‘equalizr’ limit 10;
+-----------+
| word      |
+-----------+
| equalizer |
| excelsior |
+-----------+

Но для более коротких слов, скажем для "dog" (которое тоже в таблице, конечно, есть) ситуация обстоит хуже:

mysql> select distinct word from words where word sounds like ‘dg’ limit 10;
+-------+
| word  |
+-------+
| dace  |
| dacha |
| dag   |
| dago  |
| dais  |
| daisy |
| dash  |
| dates |
| dauk  |
| dax   |
+-------+

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

Что-то вроде (фантазия):

select distinct word from words where word sounds like ‘dg’ having length(word) >= 2 AND having length(word) <= 3 limit 10;

Неактивен

 

#2 11.05.2013 01:20:33

FiMko
Активист
Откуда: Санкт-Петербург
Зарегистрирован: 18.09.2009
Сообщений: 198

Re: Spell checking (проверка орфографии) средствами MySQL

Вот составил что-то похожее:

select word from words where word sounds like 'dg' and length(word) >= 2 and length(word) <= 3 limit 10;
+------+
| word |
+------+
| dag  |
| dax  |
| dc   |
| DC   |
| dca  |
| deg  |
| des  |
| dig  |
| dis  |
| dix  |
+------+

Хотя "dog" все еще за пределами выборки (он в 15-той строке на самом деле). Есть идеи для улучшения?

--- добавлено ---

Для русского языка совсем феерично neutral (опечатался в слове "драка"):

select length('драк');
+----------------+
| length('драк') |
+----------------+
|              4 |
+----------------+
select word from words where word sounds like 'драк' and length(word) >= 4 and length(word) <= 5 limit 10;
+------+
| word |
+------+
| да   |
| Да   |
| дБ   |
| ДВ   |
| дг   |
| Де   |
| де   |
| Дж   |
| Ди   |
| ди   |
+------+
mysql> show create table words;
------+----------------------------------------------------------------+
| words | CREATE TABLE `words` (                                       |
  `wordid` int(10) unsigned NOT NULL AUTO_INCREMENT,                   |
  `word` varchar(70) CHARACTER SET utf8 NOT NULL,                      |
  PRIMARY KEY (`wordid`),                                              |
  KEY `word` (`word`)                                                  |
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8 COLLATE=utf8_bin |
+-------+--------------------------------------------------------------+
 

Отредактированно FiMko (11.05.2013 10:40:12)

Неактивен

 

#3 11.05.2013 10:34:17

FiMko
Активист
Откуда: Санкт-Петербург
Зарегистрирован: 18.09.2009
Сообщений: 198

Re: Spell checking (проверка орфографии) средствами MySQL

FiMko написал:

Для русского языка совсем феерично neutral (опечатался в слове "драка"):

select length('драк');
+----------------+
| length('драк') |
+----------------+
|              4 |
+----------------+
select length(word), word from words where word sounds like 'драк' and length(word) >= 4 and length(word) <= 5 limit 10;
+------+
| word |
+------+
| да   |
| Да   |
| дБ   |
| ДВ   |
| дг   |
| Де   |
| де   |
| Дж   |
| Ди   |
| ди   |
+------+

Не спасает даже:

select word
from   words
where  word sounds like 'драк'
       and length(hex(word)) >= 8
       and length(hex(word)) <= 10
limit  10;
+------+
| word |
+------+
| да   |
| Да   |
| дБ   |
| ДВ   |
| дг   |
| Де   |
| де   |
| Дж   |
| Ди   |
| ди   |
+------+
select hex('драк');
+-------------+
| hex('драк') |
+-------------+
| A4E0A0AA    |
+-------------+
select length(hex('драк'));
+---------------------+
| length(hex('драк')) |
+---------------------+
|                   8 |
+---------------------+

Отредактированно FiMko (11.05.2013 10:40:54)

Неактивен

 

#4 11.05.2013 12:00:23

FiMko
Активист
Откуда: Санкт-Петербург
Зарегистрирован: 18.09.2009
Сообщений: 198

Re: Spell checking (проверка орфографии) средствами MySQL

В результате некоторых изысканий в Интернет и собственного придумывания запроса получилось следующее.

Опечатки бывают, условно, 3-х типов:

1. Потерянная буква.
2. Лишняя буква.
3. Буквы перепутанные местами.

Из статистики некоторых наиболее популярных опечаток Yandex (для русских слов) имеем слова:

агенство > агентство
расчитать > рассчитать
програма > программа
рассписание > расписание
руский > русский
растояние > расстояние

Тогда запрос MySQL для проверки орфографии (по отношению к большой таблице words) может иметь вид:

SELECT   DISTINCT word
FROM     words WHERE
word     LIKE CONCAT(LEFT('YOUR_WORD',2), '%', RIGHT('YOUR_WORD',1))
         AND HEX(word) SOUNDS LIKE HEX('YOUR_WORD')
         -- чтобы обработать лишние буквы
         AND CHAR_LENGTH(word) >= CHAR_LENGTH('YOUR_WORD') - 1
         -- чтобы обработать потерянные буквы
         AND CHAR_LENGTH(word) <= CHAR_LENGTH('YOUR_WORD') + 1
-- при спешной печати чаще теряют буквы, чем добавляют лишние
ORDER BY CHAR_LENGTH(word) DESC
LIMIT  5;

Проверяем результаты работы (исходя из факта, что правильные слова для всех опечаток в таблице words есть):

агенство > агентурно, агентство,  агатово,  агарово, агукало
расчитать > рассчитать
програма > предсхема
рассписание > растворение,  рассуждение, расширенное, распускание, расторжение
руский > русский, ручной, ручкой, рукой, Ружей
растояние > разрушение, расширение, расстояние, расскажите, рассеяние

Отредактированно FiMko (11.05.2013 12:00:53)

Неактивен

 

#5 11.05.2013 13:39:43

FiMko
Активист
Откуда: Санкт-Петербург
Зарегистрирован: 18.09.2009
Сообщений: 198

Re: Spell checking (проверка орфографии) средствами MySQL

Согласно списка Oxford Dictionaries наиболее частых опечаток и ошибок в словах имеем результаты выполнения запроса:

belive > beagle,beetle,believe,belite,Belize
beleive > bearable,bellaire,Belgrade,beeville,bedplate
calender > calander,cavalier,capillar,calender,calendar (слово calender существует, в переводе с англ. означает каландровый)
commitee > commutate,Committee,comminute
harrass > hatches,harass,habitus,Habeas,harris
occuring > occupying,occurring
occurance > occurrence,occurence,oceanside
rember > Reaumur,reamer
remeber > remember,redeemer,Reaumur,reamer
succesful > successful,superfcal,sublineal,sublevel
molicular > motorailer,mollifier,molecular

Отредактированно FiMko (11.05.2013 13:43:33)

Неактивен

 

Board footer

Работает на PunBB
© Copyright 2002–2008 Rickard Andersson