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

    Точный поиск, реализуемый в базах данных это очень хорошо, когда дело касается точных фраз. Но что делать, когда среди документов есть Киевская карта но нету Карты Киева? В дело включаются языковые фильтры.Во-первых уже на лексическом уровне становится сложно оперировать с монолитным блоком текста что-бы учитывать всевозможные перестановки слов и расстояния между ними. Во-вторых, чем глубже копать в язык, тем ясней становится то, что семантический web — невероятно сложная планка для автоматических анализаторов и генераторов каких-то образов и моделей, что уж говорить про то что-бы написать RDF вручную.Морфология изучает изменение формы объектов в разных областях науки (ботанике например). Поэтому есть два пути — либо
    учитывать все формы при поиске, либо вырезать корень слова и искать
    только по нему. Последний способ называется stemming, отличается
    быстротой, простотой и не нуждается в словарях. Именно его используют Битрикс и MS Sharepoint, Sphinx. Проблемы возникают со словами где корень изменчив (бег-бежать, расти-прирост, лев-львица). Я не буду рассказывать про стемминг, посмотрите как это реализовано php с русской морфологией. Меня больше интересуют словари. Национальный корпус русского языка приводит примерно какие характеристики могут иметься у любого слова. Теперь мы плавно подходим к пониманию того что нам необходима современная морфологическая база слов (RMU, AOT), прототип для семантической сети.


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

    Идея — в использовании базы данных (Postgre) с таблицами морф (все возможные слова) и связанных с ним лексем (корней и аффиксов). При индексации документа происходит:
    • Разбивка документа на слова
    • Нормализация — каждое слово связывается с морфой если такая есть
    • Если морф нет, то в будующем вручную они добавляются в словарь благодаря регистрации частоты упоминания тех или иных слов
    При поиске происходит аналогичный процесс — каждое слово запроса нормализуется если оно есть среди лексем и по связям «запрос-лексема-морфа-документ» получается список документов. Для ускорения словаря можно загрузить всю таблицу сразу в оперативку (надавно услышал от Жени про облегчённую БД — hsqldb)

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

    Как быть с релевантностью? Учтение расстояние слов или их последовательности — дело уже синтаксического уровня. Синтаксическая индексация подразумевает разбиение на предложения и создание связей между словами, которые используются в одном предложении. Можно в дополнение учитывать в качестве какой части речи выступает лексема. В базе данных это выглядит как очередная таблица со связями между лексемами и при поиске проверяется например присутсвие нескольких слов в одном предложении.Уровень семантический должен уже учитывать типы отношений между словами (синонимы/антонимы, меронимы=партоним/холонимы, гипонимы/гипермимы), т.е. в идеале на запрос «дети Бонапарта» нашлись бы документы типа «отец Валевского — Наполеон».Но самая главная задача высших уровней это разбор омонимии, т.е. многозначности как корней (ключ, лук) так и ударения (засЫпал/засыпАл, пАрить/парИть). На данный момент и google и yandex учитывают спряжения слов, но какой именно смысл вы имели ввиду не переспрашивают. Читайте также:Парочка говорящих кошек явно показывает что язык возникает там где рождается общение.  P.S. К сожалению аналога Wordnet'а в рунете я не нашёл (только упоминания про "Ариадну" на основе словаря Зализняка). Никто не подумывал об этом?


    +Оригинал
    Поделиться публикацией
    AdBlock похитил этот баннер, но баннеры не зубы — отрастут

    Подробнее
    Реклама

    Комментарии 11

      0
      Не сочтите за рекламу - довече написал маленькую статейку в совем блоге про похожесть слов :

      http://denis-ka.blogspot.com/2008/02/blog-post_21.html#links
      http://denis-ka.blogspot.com/2008/02/blog-post_22.html#links

      Не то чтобы совсем что то новое , просто собранно в кучу и проверенно на жизнеспособность.
        +1
        хабракат пожалуйста
          0
          сказано-сделано
          0
          В последнее время очень интересуюсь подобными вещами, спасибо за статью :) Проблема с морфами возникает практически всегда когда делаешь человеческий интерфейс.

          Простейший пример - у юзеров в базе есть запись о поле - 1 или 2, соответственно мужской или женский.
          Когда юзер заходит в любой профиль, нужно писать "Малинка написала 2 новости" или "Фунтик написал 3 новости". И таких слов которые склоняются в зависимости от пола может быть очень много.

          Хотелось бы узнать как хабрадевелоперы решают такие задачи? :)

          То же самое например есть "Вася Пупкин", а новости были добавлены "Васей Пупкиным"
            0
            Я это у себя в блоге реализовывал - первой слово искал среди словаря женских имён и если не находил, то по умолчанию - женский род. Проблема возникает когда используются псевдонимы и латиница. Так что потом убрал.
              0
              Для перезаписи слов в зависимости от пола я у себя использовал такую функцию:

              function rw_word($w,$s) {
              // Функция перезаписи слов в зависимости от пола
              // Вызов: rw_word("слово", "пол");
              // $w - слово(а),
              // $s - пол (значения: "1" - муж, "2" - жен)
              if (!$s || $s==1 || (trim($s) == "")) {echo $w;}
              else {
              $original_word = $w;

              // справочник слов
              if ($w=="Он") $w="Она";
              if ($w=="его") $w="ее";
              if ($w=="он был") $w="она была";
              if ($w=="Он написал") $w="Она написала";
              if ($w=="зарегистрировался") $w="зарегистрировалась";
              if ($w=="ним") $w="ней";
              if ($w=="написал") $w="написала";
              if ($w=="сказал") $w="сказала";

              // если нет совпадений для женского пола, предупреждаем-с, если есть, выводим
              if ($original_word == $w) {echo "<b>не найдено</b>";} else {echo $w;}
              }
              }



              Может кто-то предложит более красивое или функциональное решение?
                0
                Ну я таких функций не использую, потому что у меня несколько языков, я на smarty перекладываю перевод каждой фразы из БД. Тут главное определить какого рода слово.
            0
            Спасибо за материал. Как раз сейчас пытался заставить себя начать работать над дипломом (а темой я себе выбрал создание поисковой системы, на свою глупую голову...), а тут много ссылочек и сам материал очень и очень полезный.
            Сам у себя я реализовывал как-то счетчик символов в тексте, делал простенькую разбивку по окончаниям (21 символ, 22 символа, 25 символов, 0 без ничего). Потом еще в одном проекте по недвижимости вбивал вплоть до восьмикомнатной квартиры:
            "Большая четырехкомнатная квартира
            Огромная пятикомнатная
            Шикарная шестикомнатная
            Роскошная семикомнатная
            Гигантская восьмикомнатная"

            Вообще, кстати, с русским языком у очень многих веб-opensource продуктов большие проблемы.
            Взять тот же phpbb, где никакой морфологической поддержки не предусмотрено в принципе...
              0
              Поправьте тэги! А то я из-за того, что они ошибочные, только сейчас заметил, что пропустил такой важный для меня топик.
              saerch, искусственный интеллек

            Только полноправные пользователи могут оставлять комментарии. Войдите, пожалуйста.

            Самое читаемое