Обработка естественного языка
NLP (Natural Language Processing) - пересечение машинного обучения и математической лингвистики[1], направленное на изучение методов анализа и синтеза естественного языка. NLP применяется во многих сферах сегодня, в том числе в голосовых помощниках, автоматических переводах текста и фильтрации текста. Основными тремя направлениями являются: Speech Recognition (перевод речи в текст), Natural Language Understanding[2] (выделение сути, контекста, фактов и прочего из текста на естественном языке) и Natural Language Generation[3] (программная генерация текстов на естественном языке).
Задачи
NLP решает большой набор задач, который можно разбить по уровням. Среди этих задач, можно выделить следующие:
- Распознавание текста, речи, синтез речи (сигнал)
- Морфологический анализ, канонизация (слово)
- POS-тэгирование, распознавание именованных сущностей, выделение слов (словосочетание)
- Синтаксический разбор, токенизация предложений (предложение)
- Извлечение отношений, определение языка, анализ эмоциональной окраски (абзац)
- Аннотация документа, перевод, анализ тематики (документ)
- Дедубликация, информационный поиск (корпус)
Основные подходы
Стемминг
Количество корректных словоформ, значения которых схожи, но написания отличаются суффиксами, приставками, окончаниями и прочим, очень велико, что усложняет создание словарей и дальнейшую обработку. Стемминг позволяет привести слово к его основной форме. Суть подхода в нахождении основы слова, для этого с конца и начала слова последовательно отрезаются его части. Правила отсекания для стеммера создаются заранее (лингвистами), что делает данный подход трудоемким, так как при подключении очередного языка нужны новые лингвистические исследования. Вторым недостатком подхода является возможная потеря информации при отрезании частей, например, мы можем потерять информацию о части речи.
Лемматизация
Данный подход является альтернативой стемминга. Основная идея в приведении слова к словарной форме - лемме. Например для русского языка:
- для существительных — именительный падеж, единственное число
- для прилагательных — именительный падеж, единственное число, мужской род
- для глаголов, причастий, деепричастий — глагол в инфинитиве несовершенного вида
Векторизация
Большинство математических моделей работают в векторных пространствах больших размерностей, поэтому необходимо отобразить текст в векторном пространстве. Основным походом являет bag-of-words (мешок слов): для документа формируется вектор размерности словаря, для каждого слова выделяется своя размерность, для документа записывается признак насколько часто слово встречается в нем, получаем вектор. Наиболее распространенным методом для вычисления признака является TF-IDF (TF - term frequency, частота слова, IDF - inverse document frequency, обратная частота документа). TF вычисляется, например, счетчиком вхождения слова. IDF обычно вычисляют как логарифм от числа документов в корпусе, разделённый на количество документов, где это слово представлено. Таким образом, если какое-то слово встретилось во всех документах корпуса, то такое слово не будет никуда добавлено. Плюсами мешка слов является простая реализация, однако данный метод теряет часть информации, например, порядок слов. Для уменьшения потери информации можно использовать мешок N-грамм (добавлять не только слова, но и словосочетания), или использовать методы векторных представлений слов - это, например, позволяет снизить ошибку на словах с одинаковыми написаниями, но разными значениями.
Дедубликация
Так как количество схожих документов в большом корпусе может быть велико, необходимо избавляться от дубликатов. Так как каждый документ может быть представлен как вектор, то мы можем определить их близость, взяв косинус или другую метрику. Минусом является то, что для больших корпусов полный перебор по всем документам будет невозможен. Для оптимизации можно использовать локально-чувствительный хеш, который поместит близко похожие объекты.
Семантический анализ
Семантический (смысловой) анализ текста - выделение семантических отношений, формировании семантического представления. В общем случае семантическое представление является графом, семантической сетью, отражающим бинарные отношения между двумя узлами — смысловыми единицами текста. Глубина семантического анализа может быть разной, а в реальных системах чаще всего строится только лишь синтаксико-семантическое представление текста или отдельных предложений.
NER и Relation Extraction
Именованные сущности - объекты из текста, которые могут быть отнесены к одной из заранее заявленных категорий (например, организации, личности, адреса). Идентификация ссылок на подобные сущности в тексте является задачей распознавания именованных сущностей. Определение семантических отношений между именованными сущностями или другими объектами текста, является задачей извлечения отношений. Эти два подхода применяются во многих задачах, например, извлечение синонимов из текста, автоматическом построении онтологий.
Библиотеки для NLP
NLTK (Natural Language ToolKit)[4]
Плюсы:
- Самая известная и полная по функционалу библиотека для NLP
- Большое количество сторонних расширений
- Быстрая токенизация предложений
- Поддерживается множество языков
Минусы
- Медленная
- Сложная в изучении и использовании
- Работает со строками
- Нет встроенных сетей
- Нет встроенных векторов слов
spaCy[5]
Плюсы:
- Самая быстрая библиотека для NLP
- Простая в изучении и использовании
- Работает с объектами, а не строками
- Есть встроенные вектора слов
- Использует нейронные сети для тренировки моделей
Минусы
- Менее гибкая по сравнению с NLTK
- Токенизация предложений медленнее, чем в NLTK
- Поддерживает маленькое количество языков
scikit-learn[6]
Плюсы:
- Большое количество алгоритмов для построения моделей
- Содержит функции для работы с Bag-of-Words моедлью
- Хорошая документация
Минусы
- Плохой препроцессинг, что вынуждает использовать ее в связке с другой библиотекой (например, NLTK)
- Не использует нейронные сети для препроцессинга текста
gensim[7]
Плюсы:
- Работает с большими датасетами
- Поддерживает глубокое обучение
- word2vec, tf-idf vectorization, document2vec
Минусы
- Заточена под модели без учителя
- Не содержит достаточного функционала, необходимого для NLP, что вынуждает использовать ее вместе с другими библиотеками
Примеры использования NLTK
- Sentence Segmentation
sents = nltk.sent_tokenize(text)
- Tokenization
from nltk.tokenize import RegexpTokenizer tokenizer = RegexpTokenizer(r'\w+') tokenizer.tokenize(sents[0])
from nltk import word_tokenize tokens = word_tokenize(sents[0])
- StopWords
from nltk.corpus import stopwords stop_words=set(stopwords.words('english'))
- Stemming And Lemmatization
from nltk.stem.porter import PorterStemmer porter_stemmer = PorterStemmer() porter_stemmer.stem("crying") // cri
from nltk.stem.lancaster import LancasterStemmer lancaster_stemmer = LancasterStemmer() lancaster_stemmer.stem("crying") // cry
from nltk.stem import SnowballStemmer snowball_stemmer = SnowballStemmer("english") snowball_stemmer.stem("crying") // cri
from nltk.stem import WordNetLemmatizer wordnet_lemmatizer = WordNetLemmatizer() wordnet_lemmatizer.lemmatize("came", pos="v") // come