Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
Форум программистов > Алгоритмы > Комбинаторика: перестановка слов в предложении |
Автор: Manonia 17.9.2010, 11:17 |
Добрый день. Помогите пожалуйста с комбинаторикой. На сайте есть строка запроса, куда пользователь вводит запрос. Запрос этот нужно проанализировать: выкинуть стоп-слова, и проверить данный запрос на соответствие записей в БД. Например, запрос таков: new york city mobile phone, в БД есть записи: phone и mobile phone, т.е. я должна как-то разбить это предложение и посмотреть в БД. Как я понимаю это перестановки или размещения. Дело еще в том, что в БД содержаться записи и из трех, четырех, пяти слов. Т.е. ввели : EXTERNAL OBLIQUE MUSCLE ABDOMINAL , а в БД есть запись ABDOMINAL EXTERNAL OBLIQUE MUSCLE. Т.е. сначала нужно посмотреть каждое слово из запроса в предложении, затем первое вместе со вторым, потом 1-3, потом 2-1, 2-3, 3-1, 3-2. И так до пяти слов ... |
Автор: Akina 17.9.2010, 11:26 | ||
Ну так это же неправильно... |
Автор: Manonia 17.9.2010, 12:02 | ||
Исчерпывающий ответ ... =) БД меняться не будет .. |
Автор: Akina 17.9.2010, 12:14 |
Значит, сервер будет ложиться после каждого более-менее длинного запроса... А вы что ждали? что к вашей кривой структуре вам найдётся гениальный алгоритм - быстрый и эффективный? нормализацию не от хорошей жизни придумали... |
Автор: nworm 18.9.2010, 10:38 |
Если (совпадение=3 из 5 совпали), то размещения Если (совпадение=в точности 5 из 5 совпали), то перестановки Ищем программы для вычисления всех перестановок в интернете и проверяем Если фраза из 5 слов - 120 проверок для перестановок (число перестановок из 5 символов) Для размещений проверок больше чем для перестановок ------------------------------------ Если словарь и база маленькие - нормально Если же словарь большой, то можно как-то извернуться с базой. Например, упорядочить по алфавиту все слова во всех фразах словаря. Упорядочить по алфавиту все фразы словаря. Проиндексировать базу по фразам, чтобы долго было вставлять и быстро - искать. |
Автор: Manonia 20.9.2010, 05:11 | ||
Akina, смотрите: у меня есть таблица dictionary, в ней содержатся слова, словосочетания, и есть таблица scenarios, где для каждого слова или словосочетания есть свой сценарий. Эти таблицы связаны. Поэтому слова так и хранятся в первой таблице. Есть такой вариант: берём первое слово, подставляем в запрос:
nworm, спасибо, постараюсь разобрать =) |
Автор: Akina 20.9.2010, 08:11 | ||
В результате - груда запросов в БД для обработки одного запроса пользователя. Если задача - найти записи, в которых есть ВСЕ введённые слова - то это проще:
А если задача - найти записи, в которых, скажем, не менее X% от введённых слов - то задача намного сложнее, и, видимо, разумнее использовать нечто вроде мускульного match() against либо внешние поисковые компоненты. |
Автор: Manonia 21.9.2010, 09:55 |
Так вот я и хочу составить наиболее оптимальный запрос =) Вот, например, пользователь ввёл: shopping in new york city, в базе есть и слово city, и словосочетание new york city и просто new york, нужно достать эти записи. А если пользователю стрельнуло и он ввёл: new shopping in york city/ shopping in york city new, результат должен быть таким же как в первом случае. Т.е. слова могут быть в произвольном порядке и у вас в запросе я вижу нужно обязательно подавать 4 слова, когда как мне нужно будет искать и слово и словосочетание из 2-ух, 3-ёх, 4-ёх слов.. |
Автор: Manonia 22.9.2010, 12:06 |
Определенного ответа я так и не получила, но всё равно всем спасибо =) |
Автор: ksnk 22.9.2010, 12:29 |
А FULLTEXT под такое, случайно не заточен? проиндексировать эти странные "ключевые" поля как FULLTEXT и вроде как и все. При сравнени выдается % совпадения, что-то вроде того, что и нужно... Может помешать разве только если база не mySql и "структуру базы менять не будем". |
Автор: Akina 22.9.2010, 12:33 |
Нет. Под это заточен match - о нём я уже говорил выше. |
Автор: Manonia 24.9.2010, 03:09 |
ksnk, база не MySql и структуру менять не будем =) |
Автор: Akina 24.9.2010, 07:42 |
Короче, общего инструмента или способа нет. Так что указывайте конкретную СУБД и просите модератора перенести тему. |
Автор: Manonia 27.9.2010, 06:24 |
Спасибо, база - MS SQL Server =) |
Автор: Akina 27.9.2010, 07:30 | ||
В рамках MS SQL, вероятно, можно реализовать пользовательскую функцию, которая выполнит составление... СТОП!
Всё! если нужно просмотреть каждое слово в одиночку - сочетания можно не смотреть! если запись соответствует сочетанию - она соответствует и отдельному слову из неё. |