Привет сообществу. При проектировании поиска на сайте, столкнулся с одной задачей, решение которой гугл не подсказал. Условия: Присутствует строка поиска на сайте. Пользователь вводит поисковый запрос, а далее вступает в дело поисковый движок sphinx. Задача: Пользователь вводит запрос в неверной раскладке, т.е. вместо "сотовый телефон", "cjnjdsq ntktajy". Как следствие, поисковый движок ничего не находит. Необходимо предложить пользователю поискать эту строку в правильной раскладке. Таким образом нужен алгоритм, готовый код или php-модуль, который реализует проверку строки на "правильность" раскладки. Очевидно, что результат будет вероятностный. Собственно я не смог найти такого алгоритма или готового кода, но уверен, что оно есть, а изобретать велосипеды не хочется. Подскажите, может кто сталкивался с подобной задачей или просто знает, как ее решить?
А как насчет предложить установить пфуто свичер перед заходом на сайт. На самом деле нафиг такие пользователи нужны. А если он даун и не может запоминать пароль - тоже будете рашать проблему? Мне кажется такие вопросы не стоят того, чтобы их решать. Поиск блин. Вот если бы он вводил пароль, то да! Как вы узнали что пользователи так ищут?
давайте не будем пожалуйста засорять ветку постами вида "да это не надо решать, да это пользователи виноваты" и т.д. Мне требуется решение задачи а не пустая вода. Зачем вы пишете, если не можете ответить на вопрос?
cramen потому что это форум, и я буду писать сюда всё, что пожелаю нужным в меру правил... Может кто то вам и подскажет, я сказал своё мнение!
Ну вот у гугла видимо по словарю проверяется поисковый текст. Ищет же всегда по тому что указал юзер, но в тоже время предлагает "Возможно, вы имели в виду: сотовый телефон". Как по мне то ненужная вещь для сайта (а не для поисковика) делать такую проверку. Разбивает на слова запрос, переводит слово на какойто язык поочередно, сравнивает со словом в словаре того же определенного языка, если есть - значит предложить переведенный запрос, если нет - искать по тому что имеется.
У меня был такой вариант решения и пока он остается основным, но хочется все же спросить у народа. Может кто-то знает более качественное решение этой задачи. Дело в том, что этот сайт и является в некотором роде поисковой машиной по каталогу товаров, ибо товаров довольно много (около 800000 позиций) и без качественного поиска тут не обойтись.
cramen Оправданно будет мудрить такую штуку если поиск является основным инструментом сайта. Да и "бегать" по словарям явно не на пхп надо.
cramen можно искать по другой таблице с шаблонами названий товаров, а то как можно вообще отличить марку TB1000 от ЕИ1000 и определить какая должна быть правильная раскладка?
собственно так и есть именно для этого и требуется вероятностно оценить верность раскладки и после только предлагать пользователю изменить раскладку слова при вероятности верности, например меньше 0.4
cramen ну вот и забейте в мускуль таблицу типовые шаблоны, а потом запросом с ранжированием вашу вероятность и считайте...
поисковики собирают поисковые запросы, анализируют их и потом учат поисковик подставлять. к примеру пользовател ввел ';jgf',а потом сразу 'жопа' и сделал переход по ссылкам далее. значит есть вероятность того, что это ошибочный ввод. мысля понятна? со временем как раз набирается такой словарик.
я вообще считаю что все кроме UTF 8 форматы надо уничтожить во имя упрошения написания кода и уничтожения кракозябр в Dbscript 4.2 я использовал для файлового менеджера определитель кодировки для чтения файла . а вот для сохранения принудительно перекодирую в UTF-8 . и думаю так нужно делать во всех программах , тогда cp1251 будет наконец побежден.
А почему так плохо cp-1251? Просто ставьте всегда теги meta (отправляйте заголовки для писем?) и кракозябр не будет... Или я что-то не понимаю/не знаю?
440Hz предложил хороший вариант, но на это уйдёт время, пока программа обучиться. Вариант другой, делать то, что делает гугл, по его же базе. А именно: 1. Пользователь вводит слово. 2. Проверяем раскладку, если раскладка оказалась русской (символов кириллицы больше, чем символов латинских) 3. Делаем курл запрос гуглу на перевод в английский, если результат совпадает с исходным, то явно ошибка раскладки. 4. Конвертируем в нормальную раскладку (й -> q, ц -> w, у ->e и т.д.) 5. Снова отсылаем на перевод, если удалось, предлагаем новый вариант пользователю. Если в п.2 язык оказался английский, делаем точно также но с точностью на оброт. В противном случае пользователю предлагается исходный вариант.
А проще нельзя? Если на запрос ничего не нашлось, переводим раскладку и опять запрашиваем. Если во второй раз нашлось много чего, то скорее всего раскладка была неверной.
vasa_c а как ты определишь если и на одной, и на второй расскладке чтото нашлось? Сравнивать количество найденного - както не серьезно.
Апельсин эм-м... всё-тки на какой больше - то и выдавать. так как количество записей в БД с неверной раскладкой думаю меньше, чем с верной
Ensiferum это я понял. Но если, например, нашлось 3 и 5 результатов. Выводить там где 5 - нет уверенности, что чел искал именно это. Лучше просто дублировать как гугл и делать ссылку типа "Может вы имели ввиду 'слово' ". А там пусть сам решает юзер что именно искал.
Думаю, может процентное отношение выяснять. Если оно ниже "значения" - выводить в другой раскладке, если выше - предлагать варианты. Только нужно задать "значение"
думаю, что если ЧТО-ТО будет найдено по запросу пользователя - то выводить. если НИЧЕГО не будет найдено - то пробовать изменить раскладку. всё гениально просто, товарисчи