Обработка естественного языка. Полезные инструменты
Последнее время на Хабре зачастили статьи про обработку естественного языка.
И так уж совпало, что последнее время я работаю в этой области.
Был очень хорошо освещен 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 (в дев-версии с гитхаба) и т.д.