Поиск с учетом морфологии что это
Морфологический поиск
Точный поиск, реализуемый в базах данных это очень хорошо, когда дело касается точных фраз. Но что делать, когда среди документов есть Киевская карта но нету Карты Киева? В дело включаются языковые фильтры.Во-первых уже на лексическом уровне становится сложно оперировать с монолитным блоком текста что-бы учитывать всевозможные перестановки слов и расстояния между ними. Во-вторых, чем глубже копать в язык, тем ясней становится то, что семантический web — невероятно сложная планка для автоматических анализаторов и генераторов каких-то образов и моделей, что уж говорить про то что-бы написать RDF вручную.Морфология изучает изменение формы объектов в разных областях науки (ботанике например). Поэтому есть два пути — либо
учитывать все формы при поиске, либо вырезать корень слова и искать
только по нему. Последний способ называется stemming, отличается
быстротой, простотой и не нуждается в словарях. Именно его используют Битрикс и MS Sharepoint, Sphinx. Проблемы возникают со словами где корень изменчив (бег-бежать, расти-прирост, лев-львица). Я не буду рассказывать про стемминг, посмотрите как это реализовано php с русской морфологией. Меня больше интересуют словари. Национальный корпус русского языка приводит примерно какие характеристики могут иметься у любого слова. Теперь мы плавно подходим к пониманию того что нам необходима современная морфологическая база слов (RMU, AOT), прототип для семантической сети.
Поиск с учетом морфологии что это
Курс предназначен для базовой подготовки администраторов сайтов, созданных на «1С-Битрикс: Управление сайтом». Изучив курс, вы освоите основные методы администрирования системы, а также пополните знания по темам, изученным в курсе Контент-менеджер.
Если вы добросовестно изучите курс, то научитесь:
Если вам предстоит самостоятельная установка системы или перенос сайта на хостинг, то без курса Установка и настройка Курс Установка и настройка предназначен для специалистов устанавливающих «1С-Битрикс: Управление сайтом» или «Битрикс24 в коробке».
Начальные требования
Необходимый минимум знаний для изучения курса:
Неплохо было бы иметь базовые навыки установки и администрирования *nix-систем.
У нас часто спрашивают, сколько нужно заплатить
Ещё у нас есть Академия 1С-Битрикс, где можно обучиться на платной основе на курсах нашей компании либо наших партнёров.
Баллы опыта
уроке.
Тесты и сертификат
Иконка успешно сданного вами курса отображается в вашем профиле на Freelance, если вы укажите ссылку на ваш профиль на сайте компании 1С-Битрикс.
Комментарии к урокам
Для преподавания оффлайн
Если данный курс берётся в качестве основы для оффлайного преподавания, то рекомендуемая продолжительность: 3 дня (24 академических часа).
Если нет интернета
Скачать материалы курса в формате EPUB. Файлы формата EPUB Чем открыть файл на
Android:
EPUB Reader
CoolReader
FBReader
Moon+ Reader
eBoox
iPhone:
FBReader
CoolReader
iBook
Bookmate
Windows:
Calibre
FBReader
Icecream Ebook Reader
Плагины для браузеров:
EpuBReader – для Firefox
Readium – для Google Chrome
Как проходить учебный курс?
Поиск с учетом морфологии что это
Поиск с учетом морфологии русского языка
Начнем с подключения phpMorphy. Это делается очень просто. Сперва скачайте дистрибутив, словари, распакуйте все это в отдельную папку, соблюдая структуру вложенных каталогов. Словари разместите в папке dict. Теперь откроем файл примера из папки examples и посмотрим настройки:
В настройках используется важный параметр storage, он может принимать одно из трех значений: PHPMORPHY_STORAGE_FILE (не загружать файлы словарей в память целиком, это самый медленный вариант, но самый экономный в плане работы с ресурсами сервера), PHPMORPHY_STORAGE_SHM (загружать файл словаря целиком в shared-память, требуется расширение PHP shmop) или PHPMORPHY_STORAGE_MEM (также загружать файл в память целиком если не используется shmop, по скорости работы ничем не отличается от предыдущего). На виртуальном хостинге, скорее всего, придется использовать первый вариант, а на выделенном сервере для большей скорости лучше применять варианты с использованием памяти. Выберите вариант под свои задачи. Остальные настройки и их значения подробно расписаны в официальной документации.
Словари загружены, скрипт подключен, можно пробовать его в деле. Допустим, что надо найти текст «Примерная строка поиска»:
Обратите внимание, что перед передачей phpMorphy поисковая строка переводится в верхний регистр и разделяется на отдельные слова. Вот что у нас получается. Нормализованные слова (массив $base_form):
Array (
[СТРОКА] => Array (
[0] => СТРОКА
)
[ПРИМЕРНАЯ] => Array (
[0] => ПРИМЕРНЫЙ
)
[ПОИСКА] => Array (
[0] => ПОИСК
)
)
Все словоформы (массив $all_forms):
Array (
[СТРОКА] => Array (
[0] => СТРОКА
[1] => СТРОКИ
[2] => СТРОКЕ
[3] => СТРОКУ
[4] => СТРОКОЙ
[5] => СТРОКОЮ
[6] => СТРОК
[7] => СТРОКАМ
[8] => СТРОКАМИ
[9] => СТРОКАХ
)
[ПРИМЕРНАЯ] => Array (
[0] => ПРИМЕРНЫЙ
[1] => ПРИМЕРНОГО
[2] => ПРИМЕРНОМУ
[3] => ПРИМЕРНЫМ
[4] => ПРИМЕРНОМ
[5] => ПРИМЕРНАЯ
[6] => ПРИМЕРНОЙ
[7] => ПРИМЕРНУЮ
[8] => ПРИМЕРНОЮ
[9] => ПРИМЕРНОЕ
[10] => ПРИМЕРНЫЕ
[11] => ПРИМЕРНЫХ
[12] => ПРИМЕРНЫМИ
[13] => ПРИМЕРЕН
[14] => ПРИМЕРНА
[15] => ПРИМЕРНО
[16] => ПРИМЕРНЫ
[17] => ПРИМЕРНЕЕ
[18] => ПРИМЕРНЕЙ
[19] => ПОПРИМЕРНЕЕ
[20] => ПОПРИМЕРНЕЙ
)
[ПОИСКА] => Array (
[0] => ПОИСК
[1] => ПОИСКА
[2] => ПОИСКУ
[3] => ПОИСКОМ
[4] => ПОИСКЕ
[5] => ПОИСКИ
[6] => ПОИСКОВ
[7] => ПОИСКАМ
[8] => ПОИСКАМИ
[9] => ПОИСКАХ
)
)
Корни слов (массив $pseudo_root):
Array (
[СТРОКА] => Array (
[0] => СТРОК
)
[ПРИМЕРНАЯ] => Array (
[0] => ПРИМЕР
)
[ПОИСКА] => Array (
[0] => ПОИСК
)
)
Как нам это поможет в поиске? Тут есть несколько вариантов. Например, при загрузке или редактировании статьи ее текст при помощи phpMorphy разбирается на нормализованные слова (то есть начальная форма слова) и они сохраняются в базу. Это может быть дополнительное поле в таблице статей, для которого создается индекс FULLTEXT.
SELECT * FROM `articles`
WHERE MATCH (`article_text_index`) AGAINST (‘+СТРОКА +ПРИМЕРНЫЙ +ПОИСК’)
Еще один вариант я встречал в движке форума punBB. Там текст каждого сообщения разделялся на отдельные слова, а затем они сохранялись в таблицу со ссылкой на сообщение. Поисковая строка также сперва разбивается по отдельным словам, и поиск в базе выполняется уже по этим данным, а не по исходному тексту. В нашем случае можно облегчить задачу и повысить точность поиска, если каждое слово перед занесением в базу и слова из поисковой строки будут преобразоваться к начальной форме.
SELECT DISTINCT(`index_article_id`) FROM `index_articles`
WHERE `index_word` IN (‘СТРОКА’, ‘ПРИМЕРНЫЙ’, ‘ПОИСК’)
Релевантность поиска в этом случае можно считать по количеству входящих слов, добавив в запрос команду GROUP.
Для совсем небольших сайтов, где не планируется большая нагрузка, можно извлечь корни из слов искомой строки, а затем использовать эти данные в запросе:
SELECT * FROM `articles`
WHERE UPPER(`article_text`) LIKE ‘%СТРОК%’
OR UPPER(`article_text`) LIKE ‘%ПРИМЕР%’
OR UPPER(`article_text`) LIKE ‘%ПОИСК%’
Искать по всем словоформам в этом случае не имеет смысла, точность результата будет такая же, а нагрузка на базу возрастет.
Реализация морфологического поиска на Kohana (библиотека phpMorphy)
Логика функционирования поиска включает в себя 2 блока:
Индексация контента
Поиск по поисковому индексу
Пишем код
Начало
Инициализация библиотеки
Для использования функционала библиотеки нужно подключить необходимые файлы и создать экземпляр класса, с которым будут предприниматься дальнейшие действия:
Интегрируем библиотеку в Kohana
Контроллер, отвечающий за индексацию
Данный контроллер в моем случае используется как обработчик, к которому я обращаюсь асинхронными запросами из панели управления сайтом (естественно, контроллер доступен только пользователю с правами администратора).
Настраиваем в роутах возможность получения дополнительного параметра (т.к. операция тяжелая и хотелось бы разбить её на порции):
Ну, с роутами, я думаю, все поняли, что имеется в виду. Далее, в самом котроллере, в action_index() принимаем параметр offset, создаем экземпляр класса phpMorphy, и производим все операции, описанные в логической схеме:
Думаю, что не стоит приводить код реализации панели управления (учитывая, что и сейчас объем статьи не маленький). Там всё достаточно банально — кнопка, и jquery обработчик, обращающийся к вышеописанному контроллеру и соответствующим образом обрабатывающий получаемый ответ.
Контроллер, отвечающий за поиск на сайте
Для работы данного контроллера аналогичным образом создаем роут. Контроллер принимает поисковую фразу, введенную пользователем. Фраза передается методом GET. Так выглядит контроллер:
Ну, вывод информации, думаю, описывать смысла большого нет — тут всё как обычно. Листинги кода старался как можно больше сократить, чтобы не захламлять статью совсем простыми и банальными вещами (такими как получение информации из БД или обработка ошибок, все и так знают, как это делается. ).
Надеюсь, моя статья будет полезна Хабрасообществу. Пример работы данной реализации поиска можете посмотреть тут.
Новая версия Яндекс.Браузера: поиск по странице с учетом морфологии и поддержка жестов
Представляем вам новую версию Яндекс.Браузера. Наиболее интересные изменения в этой версии:
Поиск по странице с учетом морфологии
Яндекс с 1997 года специализируется на понимании ваших поисковых запросов. Важную роль в этом играют наши алгоритмы, которые позволяют анализировать и учитывать для качественной поисковой выдачи морфологию русского языка. Было бы странно не использовать наши достижения в области морфологии в других продуктах. Возможно, вы уже слышали про программу Mystem, а теперь они нашли применение в Яндекс.Браузере.
В любой современный браузер встроен поиск на странице. Все они умеют искать лишь по точному посимвольному вхождению запроса в тексте. Но зачастую пользователи не помнят (или не знают) точной формы слова или фразы, которые они ищут. Яндекс.Браузер первым приступил к решению этой проблемы и совместно с командой Поиска представляет первую версию поиска информации на странице с учетом морфологии русского языка.
Предположим, что вы ищете слово «пользователя», но забыли его точную форму и поэтому в поле поиска по странице вводите запрос [пользователей]. Если в других браузерах искомый запрос не будет найден, то обновленный поиск в Яндекс.Браузере найдет и покажет нужное слово.
Еще интереснее ситуация, когда вы ищете фразу из нескольких слов. В этом случае мы ищем все введенные слова, а также все слова, найденные по точному вхождению. При этом они могут быть в любом порядке или даже на расстоянии нескольких слов друг от друга.
Разумеется, вы можете искать и только точные соответствия вашему запросу. Для этого достаточно поставить галочку «Точное совпадение».
Как это работает? Яндекс.Браузер использует специальный модуль, который анализирует морфологию текста на странице. Работа эта идет локально, без использования сети, при этом сам модуль весит около мегабайта. Это лишь первая версия нашего морфологического движка, но уже в нем мы научились с определенной вероятностью находить схожие слова без использования словаря. В будущих версиях мы планируем повысить качество анализа и точность выявления слов с общей нормальной формой.
Жесты
Возможность управлять браузером при помощи жестов мыши известна достаточно давно. В одних браузерах это реализуется с помощью расширений, в других — встроено изначально. Начиная с этой версии Яндекс.Браузер поддерживает жесты «из коробки». Теперь такие часто выполняемые действия, как «вперед», «назад», открытие, закрытие, перезагрузка или восстановление вкладок, можно совершать быстрее.
При желании вы можете отключить жесты в настройках. Описание всех доступных жестов можно найти в справке.
Поисковость
Посетители нашего стенда на YaC 2013 уже могли заметить, что в тестовой версии Яндекс.Браузера на странице с поисковой выдачей Яндекса поисковая строка объединена с адресной. Как следствие, увеличился объем полезной информации на странице. В новой версии Браузера это реализовано в виде эксперимента (cейчас только под Windows), чтобы оценить, насколько удобно это будет для пользователя.
По умолчанию эта возможность отключена. Для того чтобы ее подключить, необходимо запустить Браузер с параметром:
Новый способ нумерации версий
Несколько слов о новом способе нумерации версий. Теперь номер содержит год и месяц выхода обновления: например, 13.10 означает, что версия вышла в октябре 2013 года. Подобный способ уже знаком многим по операционной системе Ubuntu. Это позволяет нам уйти от простого увеличения первого числа в номере версии в начале каждого цикла разработки (подобный способ нумерации принят у браузеров Chrome, Firefox, Opera). Кроме того, такой способ позволяет отказаться от субъективной оценки «значимости» обновления (как мы делали раньше).
И еще один бонус. Теперь можно включить отображение фавиконок на панели закладок. Нас об этом просили многие пользователи, и мы решили вернуть такую возможность.