Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: Общие вопросы > Поиск совпадений в тексте со списком записей


Автор: Akella 21.5.2009, 13:18
Есть таблица в базе. Там, примерно, сотня записей. Может быть и больше, значительно больше. Таблица районов города, чтобы имели представление.
Есть текстовое объявление типа "куплю дом ил квартиру" и т.д. Нужно определить в тексте объявления район города.
Пытался строить регулярные выражения по списку районов: (район1|район2|район3|районN) но регулярка получается на столько огромной, что парсер просто не справляется и программа виснет.

Какие могут быть оптимальные обходные пути?

Автор: Alexeis 21.5.2009, 13:35
Akella, попробуй отсортировать районы в алфавитном порядке и искать совпадения бинарным поиском в отсортированном массиве. Или же добавить их в THashedStringList. Сам текст разбить на слова и искать слова в THashedStringList при помощи IndexOf().

Автор: Akella 21.5.2009, 13:37
Разбивать на слова не получится. Как разбивать на слова? Ведь есть районы из двух слов. П.Поле или П. Поле.

Автор: Alexeis 21.5.2009, 13:43
Цитата(Akella @  21.5.2009,  12:37 Найти цитируемый пост)
Разбивать на слова не получится. Как разбивать на слова? Ведь есть районы из двух слов. П.Поле или П. Поле.

  Ищи и так и так. Если есть из 3х то проверяй и сочетания из 3х слов. Регулярки это общее решение, грамотно построенное частное решение всегда быстрее общего. 

Разделители слова могут быть . : ; , ! ? пробел табуляция. Их на самом деле не так много.

Автор: Akella 21.5.2009, 14:04
Ну допустим, что разделитель можно использовать только пробел. А как правильно работать с тем, что искомое выражение может быть из двух слов: пр. Ленина, пр.Ленина, П.Поле, Хол. Гора, Х Гора и т.д. С пробелами и без.
Если нет пробела, то пр.Ленина, П.Поле сразу можно определить... а такие: Хол. Гора или Х Гора ??

Автор: Akella 21.5.2009, 14:23
Блин, регулярки работают даже с большим списком. Я поспешил создать тему. Я не заметил, что динамически построенное регулярку оказалось два подряд символа ||, а это очень резко снижает производительность и увеличивает количество совпадений.

Автор: Frees 21.5.2009, 14:24
а если

разбить на слова по рпзделителям ' .,;!?'

и искать последовательность слов, искомую фразу сперва тоже разбить на слова и искать эту последовательность слов

IndexOf от первого слова искомой строки
потом IndexOf + 1 и сравнить со 2  словом из искомой строки и так перебрать все слова в искомой строке

Добавлено через 1 минуту и 10 секунд
Цитата(Akella @  21.5.2009,  16:23 Найти цитируемый пост)
Блин, регулярки работают даже с большим списком

Регулярки всетаки рулят))

Автор: Akella 21.5.2009, 16:40
http://ru.wikipedia.org/wiki/%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%90%D1%85%D0%BE_%E2%80%94_%D0%9A%D0%BE%D1%80%D0%B0%D1%81%D0%B8%D0%BA

Добавлено через 1 минуту и 31 секунду
Дело ещё в том, что регулярку можно хранить в файле. И для каждого пользователя использовать можно свою регуляргу.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)