Обработка естественного языка. Полезные инструменты

Последнее время на Хабре зачастили статьи про обработку естественного языка.
И так уж совпало, что последнее время я работаю в этой области.
Был очень хорошо освещен sentiment analysis, и теггер частей речи pymorphy.
Но мне хотелось бы рассказать, какие средства для NLP использовал я, и что я нашел нового, чего здесь еще не было

Первое, Я был удивлен что никто не упомянул про nltk, очень полезная вещь. Особенно если вас интересует не русский язык, а другие европейские. Среди умений
  • токенизация
  • стеммирование
  • определения частей речи
  • распознование сущностей(named entity detection)
  • бонус в виде классификаторов
  • бонус в виде размеченных корпусов(не для русского)


А самое главное — отличное пособие для начинающих cookbook. При чем порог вхождения очень низкий не обязательно даже знать сам python, потому что в книжке все очень подробно разжевано. Но без английского не обойтись. Есть правда еще вариант перевода на японский, если вы конечно знаете язык. На самом деле там есть очень полезная глава, особенности nltk, при работе с японским, которая должна очень помочь, для разбора языка с Иероглифами.

В общем то все из вышеперечисленного не работает с русским языком что обидно. Сейчас идет процесс перевода nltk cookbook на русский, об этом можно почитать и помочь в google группе

Но самое большое сокровище, которое я нашел в интернете, это freeling

Freeling это библиотека для обработки текстов. Написана на С++, за счет чего имеет не плохую скорость работы. А так же имеет API на всех (ну или почти на всех) языках.

Основные возможности FreeLing:
  • Токенизация
  • Морфологический анализ
  • Приведение слова к начальной форме
  • Определение части речи, в том числе — неизвестного слова
  • Нормализация и определение дат и чисел
  • Распознование и классификация сущностей


В настоящее время поддерживаются испанский, каталанский, галисийский, итальянский, английский, русский, португальский и валлийский. К сожалению русский язык обделили и для него не работает распознование и классификация сущностей, но определение частей речи из коробки уже очень неплохо. Подробней о «кросс-язычности».
Что больше всего меня удивило, то что я почти не нашел упоминаний о freeling'е в рунете, при том что есть хороший мануал на русском.

Для чего же мне пригодились эти инструменты.
Задача состояла в отнесении текстов к той или иной категории причем автоматически. Для этого первые тексты были протеггированны и отнесены к категориям руками(корпусом назвать это сложно). Новые тексты уже разбирались автоматически, сначала RegExp для выделения нужных тегов по словарику. Потом текст доразбирался при помощи Freeling, сюда входит токенизация и разбор на части речи. И в таком виде хранилось.

Следующий шаг состоял в том, что для каждой категории обучался свой классификатор, к тому моменту с темой классификации был знаком очень поверхностно(спасибо Irokez за статью). По этому использовал, то что первую под руку попалось, Наивный байесовский классификатор из nltk, в качестве параметров(фич), в него передавалось слова по одному(униграммы) и теги, при этом количество теггов удваивалось, так как явно задать веса в Наивном классификаторе нельзя, а теги, намного информативней простых слов. А части речи использовались для фильтрации лишних слов: местоимений, числительных, междометий(был не важен эмоциональный окрас) итд.

UPD. от kmike Можно еще добавить scikit-learn.org/ к этому списку — это библиотека, в которой собрано почти все, что нужно для машинного обучения: много разных классификаторов (с хорошей реализацией, все что угодно), подсчет tf-idf, есть cython-реализация HMM (в дев-версии с гитхаба) и т.д.
  • +25
  • 6,6k
  • 8
Поделиться публикацией
AdBlock похитил этот баннер, но баннеры не зубы — отрастут

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

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

    +2
    >А части речи использовались для фильтрации лишних слов: местоимений, числительных, междометий(был не важен эмоциональный окрас) итд.
    А как омонимия решалась тогда?
    Вот, скажем, встретилось слово «мой» — оно как местоимение отсеялось или осталось, т.к. посчиталось глаголом?
      0
      Не надо ждать от компьютера чудес, он бывает и ошибается, конкретно слово «мой» большой роли не сыграло бы, в любом случае.

      В freeling есть словарь, где просчитаны вероятность, значения слова-омонима. По этому выбирался наиболее вероятный вариант.
      +1
      Справедливо. Такие инструменты есть. Соглашусь что nltk не часто используется, хотя штука полезная.

      Но, несколько моментов: на счет качества, на счет скорости и на счет легкости вхождения.

      Когда битва начинается за проценты качества nltk не помогает, а больше мешает. К примеру таггер я банально переписал, используя liblinear, потому что из коробки (и даже после перетренировки) он давал очень плохой результат на данных из твиттера.

      Далее, некотоыре моменты сделаны откровенно неоптимально. Возможно, я кое-чего недоглядел, но вычисление того-же tf-idf происходило экстремально долго. Пришлось переписать (правда, кода на 10 строк с numpy). Кроме того, нешустро работали и классификаторы на более-менее приличных объемах. Было еще несколько моментов, где пришлось отказаться от nltk.

      Про легкость вхождения. Здесь вы правы. Я когда-то читал nltk book. Изложение простое, лаконичное. Но тут есть проблема — оно слишком поверхностное. Так как рано или поздно вам понадобятся знания как именно устроен тот или иной классификатор, что такое энтропия и перплексия, как работаю парсеры и регекспы, и т.п.

      Резюмируя, скажу что это отличный пакет для обучения. Начинаешь быстро понимать, как это все работает вместе. Но для реальной работы скорее понадобятся другие, более оптимальные инструмены.

      С Freeling не работал, так что здесь молчу.
        0
        Надо же с чего то начинать, для этого мне и пригодился nltk.

        NLTK не обязательно брать за основу, но некоторые инструменты все таки не будут лишними(хотя их можно и заменить), такие как токенизатор, стеммер. Банальные вещи зато готовые
        0
        Спасибо большое за наводку на freeling. «Нормализация и определение дат и чисел» — именно то, что совсем скоро мне понадобится!
          0
          Если Java рассматривается в качестве платформы, то посмотрите ещё в сторону GATE Framework. Там есть свой regex-like язык (JAPE), который позволяет писать правила и для дат, и для чисел, и для любых форматированных строк.
          0
          Можно еще добавить scikit-learn.org/ к этому списку — это библиотека, в которой собрано почти все, что нужно для машинного обучения: много разных классификаторов (с хорошей реализацией, все что угодно), подсчет tf-idf, есть cython-реализация HMM (в дев-версии с гитхаба) и т.д.
            0
            Странно, что о FreeLing я узнал только сейчас. Спасибо!

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

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