|
Интересная задача по поиску похожих слов
|
|||
---|---|---|---|
#18+
Имеем функцию, которая просчитывает Расстояние Левенштейна для слова из английского языка. Есть таблица в SQL базе данных, в которой содержится 1000 000 (миллион) слов английского языка (хороший такой словарь). Задача: для слова X найти множество, до которых расстояние Левенштейна равно L (например L = 3). Другими словами, надо найти список слов похожих на X. Например, для слова community он будет выглядеть примерно так: cammunity, comunity, communiti et cetera. Нет, можно конечно сделать перебором, но тогда мы получим результат лишь через пол-часа ;-) ... |
|||
:
Нравится:
Не нравится:
|
|||
10.09.2008, 15:44 |
|
Интересная задача по поиску похожих слов
|
|||
---|---|---|---|
#18+
Если искомое слово произвольно, то подозреваю, что кроме перебора никак. P.S. Это случайно не родственная тема: Как бороться с дубликатами в справочниках ? ... |
|||
:
Нравится:
Не нравится:
|
|||
10.09.2008, 16:14 |
|
Интересная задача по поиску похожих слов
|
|||
---|---|---|---|
#18+
Александр ГoлдунЕсли искомое слово произвольно, то подозреваю, что кроме перебора никак. Думаю, что это плохой ответ. Можно, например, как-нибудь подготовить БД, к примеру для каждого слова прописать метрику, которая вычисляется по некой оценочной функции. А потом загружать только те слова, у которых метрика похожа на метрику исходно слова. Вопрос в том, как выбрать эту оценочную функцию... ... |
|||
:
Нравится:
Не нравится:
|
|||
10.09.2008, 16:19 |
|
Интересная задача по поиску похожих слов
|
|||
---|---|---|---|
#18+
Святогор Думаю, что это плохой ответ. Можно, например, как-нибудь подготовить БД, к примеру для каждого слова прописать метрику, которая вычисляется по некой оценочной функции. Какую метрику для сравнения с произвольным словом можно прописать? Универсальная метрика здесь только одна: это само слово, нравится вам это или нет. Хотя может быть есть возможность слегка оптимизировать это, если к примеру использовать тот факт, что тут не просто случайные наборы букв, а именно слова какого-то языка. Но и тут у меня мысль не идет дальше возможности использовать что-то типа сжатия по словарю. Ибо упирается все в то, что я не представляю как использовать такое для определения расстояния, кроме как развернув в полное слово. Или у вас есть решение этой проблемы? ... |
|||
:
Нравится:
Не нравится:
|
|||
10.09.2008, 16:27 |
|
Интересная задача по поиску похожих слов
|
|||
---|---|---|---|
#18+
СвятогорДругими словами, надо найти список слов похожих на X. Например, для слова community он будет выглядеть примерно так: cammunity, comunity, communiti et cetera. Нет, можно конечно сделать перебором, но тогда мы получим результат лишь через пол-часа ;-) - если ввести что-то вроде гипотезы "в каком символе ошибка", можно заметно сузить область поиска: [a-z]{0,2}ammunity c[a-z]{0,2}mmunity ca[a-z]{0,2}munity ... количество запросов будет равно количеству символов в исходном слове (можно и в один запрос исхитриться впихнуть), а уже в полученной коллекции вести сравнение с помощью расстояния Левенштейна. Прошу не чухонить - это всего лишь предположение выдвинутое без какого-либо обдумывания :) ... |
|||
:
Нравится:
Не нравится:
|
|||
10.09.2008, 16:50 |
|
Интересная задача по поиску похожих слов
|
|||
---|---|---|---|
#18+
Для общего случая подобная метрика не подходит. ... |
|||
:
Нравится:
Не нравится:
|
|||
10.09.2008, 18:12 |
|
Интересная задача по поиску похожих слов
|
|||
---|---|---|---|
#18+
SeVaДля общего случая подобная метрика не подходит. - а Вы обсуждаете конкретную задачу или Вас интересует "сферический конь в вакууме"? Для конкретных задач есть конкретные решения, например: MySQL+levenshtein ... |
|||
:
Нравится:
Не нравится:
|
|||
10.09.2008, 18:53 |
|
Интересная задача по поиску похожих слов
|
|||
---|---|---|---|
#18+
СвятогорНет, можно конечно сделать перебором, но тогда мы получим результат лишь через пол-часа ;-) - в общем случае попробуйте использовать самодельную хранимую процедуру и запихните ее в в секцию "WHERE ..." - сколько это займет времени, в "общем случае" неизвестно :) ... |
|||
:
Нравится:
Не нравится:
|
|||
10.09.2008, 18:58 |
|
Интересная задача по поиску похожих слов
|
|||
---|---|---|---|
#18+
СвятогорНет, можно конечно сделать перебором, но тогда мы получим результат лишь через пол-часа ;-)Когда некоторое время назад интересовался нечетким поиском, то натолкнулся на следующую научную статью, которую сейчас не нашел. Смысл там был указан следующий: Для сравнения слов там использовался вектор, с кол-вом координат, равным кол-ву символов в алфавите. т.е. для Русского языка - это будет 33 мерный вектор. Каждой позиции в векторе - сопоставляем букву алфавита (можно по порядку, для простоты) Каждому слову сопоставляем вектор, у которого в соответствующей позиции стоит 0 - если такой буквы нет в этом слове и 1 - если такая буква есть в таком слове. Данный вектор можно использовать в качесстве хэш функции. Теперь, чтобы найти "похожие слова", надо просто из вектора слова сгенерить "вектора похожих слов". Далее - по полученному списку векторов - находим все похожие слова в вашей таблице и для этих пар уже можно запускать процедуру определения расстояния Левинштэйна. ... |
|||
:
Нравится:
Не нравится:
|
|||
10.09.2008, 19:30 |
|
Интересная задача по поиску похожих слов
|
|||
---|---|---|---|
#18+
Кстати, нашел статью . В ней вектор называется сигнатурой. ... |
|||
:
Нравится:
Не нравится:
|
|||
10.09.2008, 19:36 |
|
Интересная задача по поиску похожих слов
|
|||
---|---|---|---|
#18+
BelyТеперь, чтобы найти "похожие слова", надо просто из вектора слова сгенерить "вектора похожих слов". Далее - по полученному списку векторов - находим все похожие слова в вашей таблице и для этих пар уже можно запускать процедуру определения расстояния Левинштэйна.До кучи - в качестве одного из параметров для отсечения можно использовать еще длинну слова. Если мы ищем дистанцию редактировани не более 1, то имеет смысл сравнивать слова не длиннее/короче чем на один символ. ну и продумать прочие логические ограничения, которые могут наложиться, если использовать несколько параметров одновременно (длинну, сигнатуру, дистанцию редактирования итп.) ... |
|||
:
Нравится:
Не нравится:
|
|||
10.09.2008, 19:42 |
|
Интересная задача по поиску похожих слов
|
|||
---|---|---|---|
#18+
BelyКстати, нашел статью . В ней вектор называется сигнатурой. - тоже когда-то аналогичную конструкцию хотел использовать, но руки не дошли :) ... |
|||
:
Нравится:
Не нравится:
|
|||
10.09.2008, 19:58 |
|
Интересная задача по поиску похожих слов
|
|||
---|---|---|---|
#18+
авторДо кучи - в качестве одного из параметров для отсечения можно использовать еще длинну слова. Если мы ищем дистанцию редактировани не более 1, то имеет смысл сравнивать слова не длиннее/короче чем на один символ. У Левенштейна есть де ц кая болезнь, не говоря уже о "ООО Рога и Копыта" и "Рога и Копыта ООО"(это не одно слово,но зачастую нужны и такие проверки). Для нечеткого поиска в БД больше подходит алгоритм q-grams.Я его применял для поиска в товаров в прайслистах конкурентов. ... |
|||
:
Нравится:
Не нравится:
|
|||
11.09.2008, 13:57 |
|
Интересная задача по поиску похожих слов
|
|||
---|---|---|---|
#18+
Загрузите всю таблицу в память. Сейчас проверил ради любопытства - у меня перебор по массиву в 1 млн. слов из 12 букв каждое занял около 11 сек. Intel Core Duo 1.60 GHz, 2 Gb RAM, Windows Vista Business 32, .NET Framework 3.5 SP1. ... |
|||
:
Нравится:
Не нравится:
|
|||
13.09.2008, 01:29 |
|
Интересная задача по поиску похожих слов
|
|||
---|---|---|---|
#18+
СвятогорИмеем функцию, которая просчитывает Расстояние Левенштейна для слова из английского языка. Цель - определить техническую похожесть слова (хлеб - хлев - блеф) или семантическую похожесть (хлеб-булка-каравай)? С семантической похожестью расстояние Левенштейна совсем никак не работает - нужны словари синонимов и/или семантические сети. Святогор Есть таблица в SQL базе данных, в которой содержится 1000 000 (миллион) слов английского языка (хороший такой словарь). Реально используется не более 30'000 слов. Реальная система - всегда компромисс. Святогор Задача: для слова X найти множество, до которых расстояние Левенштейна равно L (например L = 3). IMHO только перебор. Максимум - можно сделать его для известных значений заранее, построив "конкордансы". Святогор Другими словами, надо найти список слов похожих на X. Например, для слова community он будет выглядеть примерно так: cammunity, comunity, communiti et cetera. См. aspell, функцию поиска всех возможных ошибочных слов для правильного. Что правда - не Левенштейн, есть 3 градации, в зависимости от режимов работы aspell. Святогор Нет, можно конечно сделать перебором, но тогда мы получим результат лишь через пол-часа ;-) Для 30'000 вместо 1'000'000 - 1 мин. Для 30'000 слов - 20 дней на построение "конкордансов" по одному значению расстояния Левенштейна. Задача отлично распараллеливается. ... |
|||
:
Нравится:
Не нравится:
|
|||
15.09.2008, 12:24 |
|
Интересная задача по поиску похожих слов
|
|||
---|---|---|---|
#18+
Soundex? ... |
|||
:
Нравится:
Не нравится:
|
|||
18.09.2008, 18:49 |
|
Интересная задача по поиску похожих слов
|
|||
---|---|---|---|
#18+
НахлобучSoundex? ...и вообще фонетические алгоритмы. ... |
|||
:
Нравится:
Не нравится:
|
|||
18.09.2008, 18:49 |
|
Интересная задача по поиску похожих слов
|
|||
---|---|---|---|
#18+
Попробуй Код: plaintext 1. 2.
... |
|||
:
Нравится:
Не нравится:
|
|||
18.09.2008, 19:26 |
|
Интересная задача по поиску похожих слов
|
|||
---|---|---|---|
#18+
На саундексе свет клином не сошелся. ... |
|||
:
Нравится:
Не нравится:
|
|||
18.09.2008, 19:29 |
|
Интересная задача по поиску похожих слов
|
|||
---|---|---|---|
#18+
Неплохой обзор возможных алгоритмов Информационный поиск Есть и сравнительный анализ быстродействия ... |
|||
:
Нравится:
Не нравится:
|
|||
18.09.2008, 19:36 |
|
|
start [/forum/topic.php?fid=33&msg=35537439&tid=1548701]: |
0ms |
get settings: |
10ms |
get forum list: |
15ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
211ms |
get topic data: |
10ms |
get forum data: |
3ms |
get page messages: |
49ms |
get tp. blocked users: |
1ms |
others: | 301ms |
total: | 606ms |
0 / 0 |