Изменения

Перейти к: навигация, поиск

Обработка естественного языка

2 байта убрано, 30 январь
Нет описания правки
}}
NLP решает большой набор задач, который можно разбить по уровням (в скобках). Среди этих задач, можно выделить следующие:
* Распознавание текста, речи, синтез речи (сигнал).;* Морфологический анализ, канонизация (слово).;* POS-тэгирование, распознавание именованных сущностей, выделение слов (словосочетание).;* Синтаксический разбор, токенизация предложений (предложение).;* Извлечение отношений, определение языка, анализ эмоциональной окраски (абзац).;* Аннотация документа, перевод, анализ тематики (документ).;
* Дедубликация, информационный поиск (корпус).
=== Предобработка текста ===
Предобработка текста переводит текст на естественном языке в формат удобный для дальнейшей работы. Предобработка состоит из различных этапов, которые могут отличаться в зависимости от задачи и реализации. Далее приведен один из возможных набор этапов:
* Перевод всех букв в тексте в нижний или верхний регистры.;* Удаление цифр (чисел) или замена на текстовый эквивалент (обычно используются регулярные выражения).;* Удаление пунктуации. Обычно реализуется как удаление из текста символов из заранее заданного набора.;* Удаление пробельных символов (whitespaces).;* Токенизация (обычно реализуется на основе регулярных выражений).;* Удаление стоп слов.;* Стемминг.;* Лемматизация.;
* Векторизация.
=== Лемматизация ===
Данный подход является альтернативой стемминга. Основная идея в приведении слова к словарной форме {{---}} лемме. Например для русского языка:
* для существительных — именительный падеж, единственное число.;* для прилагательных — именительный падеж, единственное число, мужской род.;* для глаголов, причастий, деепричастий {{---}} глагол в инфинитиве несовершенного вида.
=== Векторизация ===
Большинство математических моделей работают в векторных пространствах больших размерностей, поэтому необходимо отобразить текст в векторном пространстве. Основным походом является мешок слов (bag-of-words): для документа формируется вектор размерности словаря, для каждого слова выделяется своя размерность, для документа записывается признак насколько часто слово встречается в нем, получаем вектор. Наиболее распространенным методом для вычисления признака является TF-IDF<ref>[https://ru.wikipedia.org/wiki/TF-IDF TF-IDF]</ref> (TF {{---}} частота слова, term frequency, IDF {{---}} обратная частота документа, inverse document frequency). TF вычисляется, например, счетчиком вхождения слова. IDF обычно вычисляют как логарифм от числа документов в корпусе, разделённый на количество документов, где это слово представлено. Таким образом, если какое-то слово встретилось во всех документах корпуса, то такое слово не будет никуда добавлено. Плюсами мешка слов является простая реализация, однако данный метод теряет часть информации, например, порядок слов.
Для уменьшения потери информации можно использовать мешок N-грамм (добавлять не только слова, но и словосочетания), или использовать методы векторных представлений слов {{---}} это, например, позволяет снизить ошибку на словах с одинаковыми написаниями, но разными значениями.
=== Дедубликация ===
Станкевич Андрей Сергеевич {{---}} лауреат специальной премии корпорации IBM.
'''Станкевич Андрей Сергеевич'''[личность] {{---}} лауреат специальной премии корпорации '''IBM'''[компания].
Определение семантических отношений между именованными сущностями или другими объектами текста, является задачей извлечения отношений. Примеры отнощенийотношений: (автор,книга), (организация,главный_офис).
Эти два подхода применяются во многих задачах, например, извлечение синонимов из текста, автоматическом построении онтологий и реализованы во многих работающих системах, например, NELL<ref>[http://rtw.ml.cmu.edu/rtw/ NELL]</ref> и Snowball<ref>[http://www.mathcs.emory.edu/~eugene/papers/dl00.pdf Snowball]</ref>.
'''N-грамма''' {{---}} последовательность из <tex>n</tex> элементов.
}}
В NLP N-граммы используются для построения вроятностных вероятностных моделей, задач схожести текстов, категоризации текста и языка.
Построив N-граммную модель можно определить вероятность употребления заданной фразы в тексте. N-граммная модель рассчитывает вероятность последнего слова N-граммы, если известны все предыдущие, при этом полагается, что вероятность появления каждого слова зависит только от предыдущих слов.
Плюсы:
* Самая известная и полная по функционалу библиотека для NLP.;* Большое количество сторонних расширений.;* Быстрая токенизация предложений.;
* Поддерживается множество языков.
Минусы
* Медленная.;* Сложная в изучении и использовании.;* Работает со строками.;* Не использует нейронные сети.;
* Нет встроенных векторов слов.
Плюсы:
* Самая быстрая библиотека для NLP.;* Простая в изучении и использовании.;* Работает с объектами, а не строками.;* Есть встроенные вектора слов.;
* Использует нейронные сети для тренировки моделей.
Минусы
* Менее гибкая по сравнению с NLTK.;* Токенизация предложений медленнее, чем в NLTK.;
* Поддерживает маленькое количество языков.
Плюсы:
* Большое количество алгоритмов для построения моделей.;* Содержит функции для работы с Bag-of-Words моделью.;
* Хорошая документация.
Минусы
* Плохой препроцессинг, что вынуждает использовать ее в связке с другой библиотекой (например, NLTK).;
* Не использует нейронные сети для препроцессинга текста.
Плюсы:
* Работает с большими датасетами.;* Поддерживает глубокое обучение.;
* word2vec, tf-idf vectorization, document2vec.
Минусы
* Заточена под модели без учителя.;
* Не содержит достаточного функционала, необходимого для NLP, что вынуждает использовать ее вместе с другими библиотеками.
== Примеры использования NLTK ==
* Разбиение на предложения.:
text = "Предложение. Предложение, которое содержит запятую. Восклицательный знак! Вопрос?"
sents = nltk.sent_tokenize(text)
print(sents)
'''output:''' ['Предложение.', 'Предложение, которое содержит запятую.', 'Восклицательный знак!', 'Вопрос?']
* Токенизация.:
from nltk.tokenize import RegexpTokenizer
sent = "В этом предложении есть много слов, мы их разделим."
print(word_tokenize(sent))
'''output:''' ['В', 'этом', 'предложении', 'есть', 'много', 'слов', ',', 'мы', 'их', 'разделим', '.']
* Стоп слова.:
from nltk.corpus import stopwords
stop_words=set(stopwords.words('english'))
'''output:''' {'should', 'wouldn', 'do', 'over', 'her', 'what', 'aren', 'once', 'same', 'this', 'needn', 'other', 'been', 'with', 'all' ...
* Стемминг и лемматизация.:
from nltk.stem.porter import PorterStemmer
porter_stemmer = PorterStemmer()
77
правок

Навигация