Точный поиск, реализуемый в базах данных это очень хорошо, когда дело касается точных фраз. Но что делать, когда надо найти нечёткое соответствие - когда среди документов есть Киевская карта но нету Карты Киева? Надо окунаться в текст и язык.
Любое сообщение на естественном языке можно рассматривать по глубине и этим занимаются разные разделы лингвистики - лексика, морфология, синтаксис, семантика, прагматика.
На лексическом уровне становится сложно оперировать с монолитным блоком текста что-бы учитывать всевозможные перестановки слов и расстояния между ними. Чем глубже копать в язык, тем ясней становится то, что семантический web - невероятно сложная планка для автоматических анализаторов и генераторов каких-то образов и моделей, что уж говорить про то что-бы написать RDF вручную.
Морфология изучает изменение формы объектов и в общем случае это междисциплинарная наука (например морфогенез). Поэтому есть два пути - либо учитывать все формы при поиске, либо вырезать корень слова и искать только по нему. Последний способ называется stemming, отличается быстротой, простотой и не нуждается в словарях. Проблемы стеммера в исключениях которыми кишит язык, например со словами где корень изменчив (бег-бежать, расти-прирост, лев-львица).
Я не буду рассказывать про стемминг, посмотрите как это делал Илья Рудомилов или Дмитрий Котеров со стеммингом Портера для русского языка. Или как это продаёт Битрикс и MS Sharepoint.
Меня больше интересуют словари. Национальный корпус русского языка приводит примерно какие характеристики могут иметься у любого слова. Теперь мы плавно подходим к пониманию того что нам необходима современная морфологическая база слов (RMU , AOT), прототип для семантической сети.
Индексация и поиск
Идея - в использовании базы данных (Postgre) с таблицами морф (все возможные слова) и связанных с ним лексем (корней и аффиксов). При индексации документа происходит:
- Разбивка документа на слова
- Нормализация - каждое слово связывается с морфой если такая есть
- Если морф нет, то в будующем вручную они добавляются в словарь благодаря регистрации частоты упоминания тех или иных слов
При поиске происходит аналогичный процесс - каждое слово запроса нормализуется если оно есть среди лексем и по связям "запрос-лексема-морфа-документ" получается список документов. Для ускорения словаря можно загрузить всю таблицу сразу в оперативку (надавно услышал от Жени про облегчённую БД - hsqldb)
Высшие уровни языка
Как быть с релевантностью? Учтение расстояние слов или их последовательности - дело уже синтаксического уровня. Синтаксическая индексация подразумевает разбиение на предложения и создание связей между словами, которые используются в одном предложении. Можно в дополнение учитывать в качестве какой части речи выступает лексема. В базе данных это выглядит как очередная таблица со связями между лексемами и при поиске проверяется например присутсвие нескольких слов в одном предложении.
Уровень семантический должен уже учитывать типы отношений между словами (синонимы/антонимы, меронимы=партоним/холонимы, гипонимы/гипермимы), т.е. в идеале на запрос "дети Бонапарта" нашлись бы документы типа "отец Валевского - Наполеон".
Но самая главная задача высших уровней это разбор омонимии, т.е. многозначности как корней (ключ, лук) так и ударения (засЫпал/засыпАл, пАрить/парИть). На данный момент и google и yandex учитывают спряжения слов, но какой именно смысл вы имели ввиду не переспрашивают.
Читайте также:
- Использование стемминга в Раблере
- Куча ссылок по лингвистическим ресурсам
- Словари+софт в своём непонятном формате на aot.ru
- Фонетический поиск
P.S. К сожалению аналога Wordnet'а в рунете я не нашёл (только упоминания про "Ариадну" на основе словаря Зализняка). Никто не подумывал об этом?
Парочка говорящих кошек явно показывает что язык возникает там где рождается общение.
Комментарии
За статью больше спасибо :)