Модераторы: Poseidon, Snowy, bems, MetalFan
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Поиск совпадений в тексте со списком записей, записи из таблицы БД 
:(
    Опции темы
Akella
  Дата 21.5.2009, 13:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Творец
****


Профиль
Группа: Модератор
Сообщений: 18485
Регистрация: 14.5.2003
Где: Корусант

Репутация: 36
Всего: 329



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

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

Это сообщение отредактировал(а) Akella - 21.5.2009, 13:19
PM MAIL   Вверх
Alexeis
Дата 21.5.2009, 13:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Амеба
Group Icon


Профиль
Группа: Админ
Сообщений: 11743
Регистрация: 12.10.2005
Где: Зеленоград

Репутация: 109
Всего: 459



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


--------------------
Vit вечная память.

Обсуждение действий администрации форума производятся только в этом форуме

гениальность идеи состоит в том, что ее невозможно придумать
PM ICQ Skype   Вверх
Akella
Дата 21.5.2009, 13:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Творец
****


Профиль
Группа: Модератор
Сообщений: 18485
Регистрация: 14.5.2003
Где: Корусант

Репутация: 36
Всего: 329



Разбивать на слова не получится. Как разбивать на слова? Ведь есть районы из двух слов. П.Поле или П. Поле.
PM MAIL   Вверх
Alexeis
Дата 21.5.2009, 13:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Амеба
Group Icon


Профиль
Группа: Админ
Сообщений: 11743
Регистрация: 12.10.2005
Где: Зеленоград

Репутация: 109
Всего: 459



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

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

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


--------------------
Vit вечная память.

Обсуждение действий администрации форума производятся только в этом форуме

гениальность идеи состоит в том, что ее невозможно придумать
PM ICQ Skype   Вверх
Akella
Дата 21.5.2009, 14:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Творец
****


Профиль
Группа: Модератор
Сообщений: 18485
Регистрация: 14.5.2003
Где: Корусант

Репутация: 36
Всего: 329



Ну допустим, что разделитель можно использовать только пробел. А как правильно работать с тем, что искомое выражение может быть из двух слов: пр. Ленина, пр.Ленина, П.Поле, Хол. Гора, Х Гора и т.д. С пробелами и без.
Если нет пробела, то пр.Ленина, П.Поле сразу можно определить... а такие: Хол. Гора или Х Гора ??
PM MAIL   Вверх
Akella
Дата 21.5.2009, 14:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Творец
****


Профиль
Группа: Модератор
Сообщений: 18485
Регистрация: 14.5.2003
Где: Корусант

Репутация: 36
Всего: 329



Блин, регулярки работают даже с большим списком. Я поспешил создать тему. Я не заметил, что динамически построенное регулярку оказалось два подряд символа ||, а это очень резко снижает производительность и увеличивает количество совпадений.
PM MAIL   Вверх
Frees
Дата 21.5.2009, 14:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2233
Регистрация: 2.12.2005
Где: Екатеринбург

Репутация: 9
Всего: 54



а если

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

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

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

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

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


--------------------
Кольцов Виктор Владимирович
PM MAIL ICQ   Вверх
Akella
Дата 21.5.2009, 16:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Творец
****


Профиль
Группа: Модератор
Сообщений: 18485
Регистрация: 14.5.2003
Где: Корусант

Репутация: 36
Всего: 329



Ахо — Корасик

Добавлено через 1 минуту и 31 секунду
Дело ещё в том, что регулярку можно хранить в файле. И для каждого пользователя использовать можно свою регуляргу.
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Общие вопросы"
SnowyMetalFan
bemsPoseidon
Rrader

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по Дельфи обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, MetalFan, bems, Poseidon, Rrader.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0505 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.