найти нечеткие совпадения строки в массиве строк
От: deng  
Дата: 16.06.11 07:46
Оценка:
Доброго дня!

Возникла задача ускорить поиск совпадений сложной строки в массиве строк.

Простой пример поиска совпадений:

строка для поиска : dates
массив строк: date3 , gates, thimatis

результат поиска :

DATEs
DATE3 : найдено совпадение 4-рех символов

dATES
gATES : найдено совпадение 4-рех символов

dATeS
thimATiS : найдено совпадение 3-х символов

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

строка для поиска : (d,g)(a)(t)(e,i)(s)
массив строк: date3 , gates, thimatis

результат поиска :

DATEs
DATE3 : найдено совпадение 4-рех символов

GATES
GATES : найдено совпадение 5-ти символов

dATIS
thimATIS : найдено совпадение 4-рех символов

На текущий момент найдено решение, которое позволяет найти совпадения примерно за O(nm) времени , это не устраивает, т.к. в реальном применении база эталонных строк будет в районе 4 млн. записей, каждая запись ~50 символов, количество сложных строк для поиска 4-6 тыс на запрос (длинна 150 символов),
плюс дополнительная обработка каждого результата поиска тестовой строки, итого оценка требуемых операций несколько десятков террафлопс...

Нужно найти линейный алгоритм поика, может кто-нибудь знает, в каком направлении копать?
Re: найти нечеткие совпадения строки в массиве строк
От: __kot2  
Дата: 16.06.11 08:37
Оценка:
Здравствуйте, deng, Вы писали:
D>Нужно найти линейный алгоритм поика, может кто-нибудь знает, в каком направлении копать?
я такой делал. сделать можно. коммерческая тайна. хе-хе.
Re[2]: найти нечеткие совпадения строки в массиве строк
От: deng  
Дата: 16.06.11 09:32
Оценка:
Здравствуйте, __kot2, Вы писали:

__>я такой делал. сделать можно. коммерческая тайна. хе-хе.


Хотя бы что-то можешь подсказать? Пример где можно посмотреть работу алгоритма, какая литература есть по теме? Общий способ какой, на основе суффиксных деревьев? В примерах поиска ,какие нашел, везде фиксированная тестовая строка для поиска в дереве, как прикрутить строку у которой может быть несколько вариантов одного символа даже представить боюсь :/
Re[3]: найти нечеткие совпадения строки в массиве строк
От: __kot2  
Дата: 16.06.11 09:54
Оценка:
Здравствуйте, deng, Вы писали:
D>Хотя бы что-то можешь подсказать? Пример где можно посмотреть работу алгоритма, какая литература есть по теме? Общий способ какой, на основе суффиксных деревьев? В примерах поиска ,какие нашел, везде фиксированная тестовая строка для поиска в дереве, как прикрутить строку у которой может быть несколько вариантов одного символа даже представить боюсь :/
нет. никаких деревьев. хотя в вашем конкретном случае они могут и пригодиться
общий смысл в что чтобы получить нечеткое совпадение нужно все равно иметь какое-то четкое. то есть нечеткое это несколько четких
Re: найти нечеткие совпадения строки в массиве строк
От: Sinix  
Дата: 16.06.11 09:54
Оценка:
Здравствуйте, deng, Вы писали:

D>Возникла задача ускорить поиск совпадений сложной строки в массиве строк.

Как вариант, гуглим расстояние Левенштейна.

Для СУБД может оказаться удобнее хранить в вычисляемом столбце что-то аля SOUNDEX (гуглим %servername% fuzzy match, для sql server-а — см тынц). На крайний случай можно посмотреть готовые средства для полнотекстового поиска.
Re[4]: найти нечеткие совпадения строки в массиве строк
От: deng  
Дата: 16.06.11 10:25
Оценка:
Здравствуйте, __kot2, Вы писали:

__>нет. никаких деревьев. хотя в вашем конкретном случае они могут и пригодиться

__>общий смысл в что чтобы получить нечеткое совпадение нужно все равно иметь какое-то четкое. то есть нечеткое это несколько четких

Для моего случая не подойдет, т.к. в строке поиска для каждой буквы может быть до 20 значений, длинна слова 144 буквы, количество четких вариантов получается слишком большое. Слово для поиска получается как массив, в каждой позиции которого список букв, жуть )

Здравствуйте, Sinix, Вы писали:

__>Как вариант, гуглим расстояние Левенштейна.


По расстоянию Левенштейна смотрел, для него есть готовые алгоритмы , но кроме замены буквы еще учитываются удаления и вставки, которые не требуются для моей задачи, интересно, получиться ли переделать алгоритмы, чтобы вычислялись только замены букв? И еще, для случая поиска слова в котором находятся метасимволы опять же не попадались способы.
Re[5]: найти нечеткие совпадения строки в массиве строк
От: __kot2  
Дата: 16.06.11 10:43
Оценка:
Здравствуйте, deng, Вы писали:
D>Для моего случая не подойдет, т.к. в строке поиска для каждой буквы может быть до 20 значений, длинна слова 144 буквы, количество четких вариантов получается слишком большое. Слово для поиска получается как массив, в каждой позиции которого список букв, жуть )
подойдет-подойдет. не в лоб конечно
Re[6]: найти нечеткие совпадения строки в массиве строк
От: deng  
Дата: 16.06.11 11:44
Оценка:
Здравствуйте, __kot2, Вы писали:

__>подойдет-подойдет. не в лоб конечно


N-граммы? С ними тоже возникает проблема: должны быть общие участки размером в N-грамму, если общие участки нужного размера не попадаются, будут пропускаються правильные варианты совпадений, это очень не желательно.

типа:
слово для поиска: маха, набор триграм: мах, аха

слова базы : маша, мыха, миха

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

МАхА
МАшА

МаХА
МыХА

МаХА
МиХА


Как вариант можно составлять N-граммы с пропусками позиций,причем в разных вариантах,(типа маха (м-ха)) но все равно пропусков правильных результатов не избежать, все сочетания все равно не учтешь.

Хотелось бы найти решение для точного поиска общих частей, прежде чем приступать к реализации поиска N-грамм, или хотя бы убедиться что такого нет )
Re: найти нечеткие совпадения строки в массиве строк
От: mefrill Россия  
Дата: 16.06.11 13:15
Оценка:
Здравствуйте, deng, Вы писали:

D>Доброго дня!

D>Возникла задача ускорить поиск совпадений сложной строки в массиве строк.

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

строим трай:

--> 0 -- t --> 1 -- e -- > 2 -- s --> 3 -- t --> 4*
       \ -- m --> 5 -- e --> 6 -- s --> 7 -- o --> 8*


и на вход приходит mest. Идем по трайю. Переходим сразу в два состояния: {1, 2}, причем состоние 1 с коэффициентом 1. Идем дальше по состояниям. Доходим до состояния 4 с коэффициентом 1, который наследуется, и до состояния 8, также с коэффициентом 1, который получился при переходе из состояния 7. Алгоритм линейный от длины входной строки, но если трай ветвистый, то вариантов будет до фига и множество состояний при переходах будет большое. Чудес не бывает, здесь задача по любому имеет большую вычислительную сложность.
Re[7]: найти нечеткие совпадения строки в массиве строк
От: hotdox  
Дата: 16.06.11 19:58
Оценка:
Здравствуйте, deng, Вы писали:


D>N-граммы? С ними тоже возникает проблема: должны быть общие участки размером в N-грамму, если общие участки нужного размера не попадаются, будут пропускаються правильные варианты совпадений, это очень не желательно.


можно пределиться каков минимальный размер совпадений, исходя из размеров словаря и использовать его в качестве размера N-граммы. В твоем случае 50 для базовых строк, 150 для запроса, врядли имеет смысл брать меньше, чем 10-граммы.
Re: найти нечеткие совпадения строки в массиве строк
От: c-smile Канада http://terrainformatica.com
Дата: 18.06.11 03:57
Оценка:
Здравствуйте, deng, Вы писали:

D>строка для поиска : (d,g)(a)(t)(e,i)(s)

D>массив строк: date3 , gates, thimatis

Ternary search trie не пробовали ?

См: partial_match_search() и neighbour_search() здесь:
http://rsdn.ru/forum/src/824201.1.aspx
Автор: c-smile
Дата: 25.09.04


Сложность поиска O(S + log N)
N — кол-во слов,
S — длина строки.

что значительно лучше того что у вас есть.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.