Як зробити індекс за заданим текстом, і як за цим індексом потім шукати
- Java
- пошукові технології
- алгоритми
Вітаю.
Прошу допомогти у вирішенні виниклої проблеми (завдання). Вказати напрямок, допомогти мудрою порадою.
Є завдання:
-є список правильних назв програм (а-ля шаблон, зразок, еталон). Назви складаються з 1-6 слів
-є список назв програм, які писали співробітники. Співробітники писали не по шаблону, допускали помилки в написанні самих слів, називали програми якось інакше. При цьому все одно зберігалася суть назви.
наприклад:
еталон "Программуля плюс"
співробітник написав "Програма для документів Программуля"
Як видно, є багато зайвого, але суть збережена.
Хочу створити індекс з довідника еталонних назв і якось в цьому індексі шукати відповідності з призначеним для користувача запитом (або є збіг, або користувальницької програми в словнику немає).
Припускаю, що шукаємо по окремим словами вихідні рядки і шукаємо перетину збігів. Або не так?
Прошу підказати як створюється індекс, і як за цим індексом проводиться пошук (алгоритм).
Предметної базою сильно не володію, тому прошу пояснити простими словами.
Писати буду на мові Java.
Дякую за відповіді :)
- взяв рядок. рядок була виду original_Name. alternate_name_1, alternate_name_2
- запам'ятав оригінальне ім'я в окрему змінну origName.
- очистив її від сміття. Сюди входило видалення знаків пунктуації, там де у мене в рядку були посилання я зберігав тире "-". Прибрав "стоп" слова. Стоп слова я вибрав за допомогою спостережень в наявному словнику. Викинув все слова, крім прийменників і спілок, які не носили смислового навантаження. У мене це були слова типу "портал", "online", загальні абревіатури "ас", "абс".
- розбив рядок на ключові слова. Всю рядок, включаючи і оригінальну назву.
- зберіг в HashMap зв'язку keyWord. origName. Десь це називали метод зворотних посилань.
- якщо ключові слова повторювалися, то дописував до origName інші слова в рядок.
В отриманому "довіднику" я шукав входження ключових слів із запиту. На виході отримував список з усім знайденими origName.
Ранжування полягало в тому, що я вважав найбільшу кількість збігів і вважав ці збіги результатом. Іноді було кілька збігів з однаковою кількістю входжень. Збіги були схожими за змістом, але вносили якусь плутанину. (Цю проблему я вирішив діалоговим вікном з "оператором" програми)
Загалом пошук вийшов прийнятний.
Писав я не для маси людей, а для конкретної організації, тому я прийняв той факт, що кількість помилок при завданні пошукового запиту буде мінімальним, і що залишилися слова (написані правильно) дадуть коректний результат.
Все одно є кілька помилок, треба доопрацювати, впровадити кращі алгоритми.
Але мій велосипед вдався (чого я дуже радий).
Буду продовжувати апгрейдити алгоритми, днями чекаю пачку даних від користувачів для Обкатился программулі в справі :)
Якось так я це і уявляв. Навіть майже вирішив проблему "схожості" слів через тупе порівняння на збіг символів (кострубато, але якісь результати дасть. Программуля == програмуля).
А ось питання. Коли я отримаю за ключовим словом з рядка список еталонних назв, я перейду до пошуку по другому слову. Цей пошук дасть мені ще список рядків, в яких зустрічається "слово keywords".
А як бути далі? Перевірити на збіг у всіх випадках (або на якийсь відсоток збігів)?
я розмірковував приблизно так:
У довіднику у мене є список слів, отриманий з рядків еталонів. Кожне з цих слів посилається на оригінальну рядок.
Припустимо я розбив користувальницький запит на слова і порівнюю зі словами довідника. Той факт, що я в рядку користувача знаходжу слово з довідника вже дає мені натяк на те, що запит є в базі. Слова "без особливого сенсу", такі як "програма для документів" не даватимуть результату, залишається збіг по "Программуля". Вважати призначену для користувача рядок схожою.
Може різним словами, які точно мають сенс, типу "Программуля" дати в довіднику рейтинг вище.
Артур. Дивіться, в будь-якій випадку на вході ми чекаємо рядок, а на виході - список програм зі схожими назвами, я вірно вважаю? або умова - повернути одну максимально схожу програму?
Шукати за збігом символів - дуже поганий варіант, якщо чесно, проблеми зі швидкістю і пам'яттю гарантовані. Тим більше можуть бути слова з ідентичним масивом символів, але різним порядком проходження.
sirs. "Шукати за збігом символів - дуже поганий варіант, якщо чесно, проблеми зі швидкістю і пам'яттю гарантовані. Тим більше можуть бути слова з ідентичним масивом символів, але різним порядком проходження."
- повністю згоден. Якщо я не розберуся з більш розумними варіантами, не залишиться нічого іншого :) Благо обсяги не дуже великі.
"Артур: Дивіться, в будь-якій випадку на вході ми чекаємо рядок, а на виході - список програм зі схожими назвами, я вірно вважаю? Або умова - повернути одну максимально схожу програму?"
- по-хорошому, на виході я чекаю або фразу "Такої програми немає в довіднику", максимально схожу.