Про похожесть слов и словари

  • Автор темы Дракон
  • Дата начала

Дракон

Guest
Про похожесть слов и словари

Доброго времени суток всем.
Есть задача...
Существует некая база данных слов (словарь). Я неправильно пишу какое-либо слово из этой БД и скрипт должен написать, мол, а не ошиблись ли вы? Может вы имели ввиду то-то и то-то?
Придумал несколько способов, но все не то :)
Подайте идею плз :)
 

Дракон

Guest
Объясни пожалуйста по-русски, я не очень понял :(
 

Дракон

Guest
Нет, такой способ не подходит :( Полнотекстовый поиск может определить степень сходства двух строк, но не двух слов. Я попробовал - в БД есть запись со словом "Шкаф", я пишу
SELECT
`name`,
MATCH(
`name`
)
AGAINST (
'шкав' # специально сделал ошибку
) AS `R`
FROM `names`

Он даже не догадывается, что слова "Шкаф" и "Шкав" похожи :) Либо я что-то не так делаю...
 

alpine

Новичок
Дракон
Хочешь сделать поиск как на яндексе средствами ПХП и/или mysql?
 

lucas

Guest
Он хочет сделать поиск слова как в Ворде по правому клику.
 

Tor

Новичок
Дракон
читаем внимательнее
и еще, чем, по твоему, строка отличается от слова?
 

Дракон

Guest
Tor
В смысле не строка, а фраза (неправильно выразился). Вхождение слова в фразу он ищет, а похожесть слов - нет. Я пока не понял, как это сделать через полнотекстовый поиск :(
 

lucas

Guest
Судя по тому, какие варианты предлагает Ворд, у него алгоритм примерно такой:

0. Есть слово "мома", которого нет в словаре, то есть -- с ошибкой.
1. Генерируем варианты запросов (для MySQL): "_ома", "м_ма", "мо_а", "мом_" и ищем по ним в БД.
2. Если что-то нашлось -- предлагаем пользователю.

Соответственно, для длинных слов (с большей вероятностью ошибки в разных местах/нескольких рядом стоящих символов) можно модифицировать алгоритм составления "вариантов запросов".
 

Дракон

Guest
И как же я это сам не догадался :)) Будем пробовать! ;) Спасибо :)
 

Long

Новичок
lucas, единственная проблема в таком подходе - заранее не известно сколько ошибок при вводе будет сделано, если ошибок больше 2 - алгоритм получается крайне тяжелый, да и запросы тоже тяжелые... я год назад размышлял над подобной задачей - пришел к выводу, что наиболее правильный вариант - вычислять растояние Левенштейна и по нему определять наиболее подходящие варианты. Только и тут засада - в MySQL нет такой встроенной функции. Как варант - использовать Postgres.
 

Profic

just Profic (PHP5 BetaTeam)
Я иcпользовал в таком случае soundex, правда алгоритм есть только для английского, но мне больше и не нужно было - слова, которые нужно было сравнивать как-раз были английскими. Где-то в Сети видел что-то подобное и для русского
 
Сверху