Морфологический поиск

Точный поиск, реализуемый в базах данных это очень хорошо, когда дело касается точных фраз. Но что делать, когда надо найти нечёткое соответствие - когда среди документов есть Киевская карта но нету Карты Киева? Надо окунаться в текст и язык.

Любое сообщение на естественном языке можно рассматривать по глубине и этим занимаются разные разделы лингвистики - лексика, морфология, синтаксис, семантика, прагматика.

На лексическом уровне становится сложно оперировать с монолитным блоком текста что-бы учитывать всевозможные перестановки слов и расстояния между ними. Чем глубже копать в язык, тем ясней становится то, что семантический web - невероятно сложная планка для автоматических анализаторов и генераторов каких-то образов и моделей, что уж говорить про то что-бы написать RDF вручную.

Морфология изучает изменение формы объектов и в общем случае это междисциплинарная наука (например морфогенез). Поэтому есть два пути - либо учитывать все формы при поиске, либо вырезать корень слова и искать только по нему. Последний способ называется stemming, отличается быстротой, простотой и не нуждается в словарях. Проблемы стеммера в исключениях которыми кишит язык, например со словами где корень изменчив (бег-бежать, расти-прирост, лев-львица).


Я не буду рассказывать про стемминг, посмотрите как это делал Илья Рудомилов или Дмитрий Котеров со стеммингом Портера для русского языка. Или как это продаёт Битрикс и MS Sharepoint.

Меня больше интересуют словари. Национальный корпус русского языка приводит примерно какие характеристики могут иметься у любого слова. Теперь мы плавно подходим к пониманию того что нам необходима современная морфологическая база слов (RMU , AOT), прототип для семантической сети.

Индексация и поиск

Идея - в использовании базы данных (Postgre) с таблицами морф (все возможные слова) и связанных с ним лексем (корней и аффиксов). При индексации документа происходит:

  • Разбивка документа на слова
  • Нормализация - каждое слово связывается с морфой если такая есть
  • Если морф нет, то в будующем вручную они добавляются в словарь благодаря регистрации частоты упоминания тех или иных слов

При поиске происходит аналогичный процесс - каждое слово запроса нормализуется если оно есть среди лексем и по связям "запрос-лексема-морфа-документ" получается список документов. Для ускорения словаря можно загрузить всю таблицу сразу в оперативку (надавно услышал от Жени про облегчённую БД - hsqldb)

Высшие уровни языка

Как быть с релевантностью? Учтение расстояние слов или их последовательности - дело уже синтаксического уровня. Синтаксическая индексация подразумевает разбиение на предложения и создание связей между словами, которые используются в одном предложении. Можно в дополнение учитывать в качестве какой части речи выступает лексема. В базе данных это выглядит как очередная таблица со связями между лексемами и при поиске проверяется например присутсвие нескольких слов в одном предложении.

Уровень семантический должен уже учитывать типы отношений между словами (синонимы/антонимы, меронимы=партоним/холонимы, гипонимы/гипермимы), т.е. в идеале на запрос "дети Бонапарта" нашлись бы документы типа "отец Валевского - Наполеон".

Но самая главная задача высших уровней это разбор омонимии, т.е. многозначности как корней (ключ, лук) так и ударения (засЫпал/засыпАл, пАрить/парИть). На данный момент и google и yandex учитывают спряжения слов, но какой именно смысл вы имели ввиду не переспрашивают.

Обязательно гляньте на библиотеку phpMorphy

Читайте также:

P.S. К сожалению аналога Wordnet'а в рунете я не нашёл (только упоминания про "Ариадну" на основе словаря Зализняка). Никто не подумывал об этом?

Парочка говорящих кошек явно показывает что язык возникает там где рождается общение.

RSS

Комментарии

  • felisa
    avatar
    Кошки порадовали, у самой дома таких же 4 штуки (один, правда, гулящий), регулярно так же разговаривают.
    За статью больше спасибо :)
  • daedmen
    avatar
    Вот тут http://www.dialog-21.ru/Archive/2003/Goncharuk.htm народ пробует перевести ворднет на русский, я думал что будет полная Г, но народ утверждает что перевели так 45% wordnet'а и 75% корректностью...