Я просмотрел множество блогов по обработке естественного языка, но не нашел ни одного блога, который мог бы объяснить мне, как работает конкретный алгоритм, или математическую теорию, лежащую в основе стратегий НЛП. Моя цель - очень легко объяснить НЛП, не жертвуя качеством содержания.

Что такое обработка естественного языка (NLP)?

Проще говоря, НЛП означает обработку и анализ текстовых данных.

Техническое определение:

Обработка естественного языка - это подраздел информатики, информационной инженерии и искусственного интеллекта, связанный с взаимодействием между компьютерами и человеческими языками, в частности, как программировать компьютеры для обработки и анализа больших объемов данных на естественном языке.

Какая польза от НЛП? ИЛИ Зачем нам НЛП?

В эпоху Интернета большая часть данных создается в необработанном текстовом формате, который, по сути, является неструктурированными данными. Эти данные бесполезны, если они не обрабатываются и не анализируются. Мы используем методы НЛП для преобразования «данных в информацию». Используя НЛП, мы можем иметь глубокое понимание данных, и мы также можем предпринимать действия, основанные на результатах данных.

Некоторые приложения, в которых используется НЛП:

Анализ тональности: анализ того, является ли текст положительным или отрицательным,

Автоматическое обобщение: обобщение значения данных,

Классификация текста: организация данных по предопределенным категориям.

Приступим:

Чтобы понять, что на самом деле делает НЛП, мы собираемся сделать образец проекта по анализу настроений, чтобы проверить, является ли данный отзыв положительным или отрицательным.

Пример:

Эта пицца очень вкусная. (положительное заявление)

Эта пицца невкусная. (отрицательное утверждение)

Предварительные требования:

Программирование на Python (базовые знания)

Основы машинного обучения

Наивный Байес - алгоритм машинного обучения

Пачкают руки:

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

Во-первых, нам нужно установить Toolkit обработки естественного языка (nltk). Вы можете щелкнуть здесь, чтобы установить nltk - https://www.nltk.org/install.html

import ntlk
nltk.download()

Перед применением любого алгоритма НЛП / машинного обучения нам нужно очистить текст, нам нужно сделать его в надлежащем формате, чтобы к нему можно было применить функции обработки и анализа.

Импорт набора данных: -

Простейший набор данных, который я нашел для анализа настроений, был доступен на superdatascience.com. Вы можете скачать его, нажав здесь. Или просто перейдите на https://www.superdatascience.com/machine-learning/ и выполните поиск по запросу Natural-Language-Processing.zip. (при этом будут загружены все файлы, т.е. набор данных и файлы кода). Набор данных содержит только 1000 строк и два столбца: Обзор и Понравилось.

Примечание. Код в загруженных файлах отличается от того, что написано в блоге, поэтому не запускайте код напрямую, это может привести к неожиданному поведению.

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

Конвейер НЛП:

Существует множество сложных и сложных способов обработки естественного языка, но я буду использовать очень простой и ограниченный конвейер методов, как показано ниже.

Шаги по очистке текста: -

  1. Удалить дубликаты
  2. Удалить пунктуацию
  3. Удалить цифры, буквенно-цифровые символы
  4. Удалить теги HTML

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

Мы можем использовать регулярные выражения для удаления знаков препинания или мы можем использовать встроенную библиотеку.

Этапы предварительной обработки текста: -

  1. Токенизация
  2. Удалить стоп-слова
  3. Стемминг
  4. Лемматизация

Токенизация: при анализе настроений мы придаем большее значение определенным словам, имеющим значение, и удаляем бессмысленные слова (стоп-слова). Итак, нам приходится иметь дело со словами, а не с полным обзором / предложением . Поэтому лучше разделить эти данные на более мелкие части. Этот процесс разделения данных, текста на более мелкие фрагменты (или токены) известен как токенизация. Используя токенизацию, мы можем придавать больший вес словам, чем предложениям. Таким образом, мы можем легко проверить, является ли отзыв положительным или отрицательным, просто увидев определенные слова.

Удаление игнорируемых слов. В предложении много лишних слов. Пример: is, and, are, the и т. Д. Эти слова не добавляют никакого значения предложению. Итак, мы можем их удалить.

Ввод всех слов в нижний регистр поможет идентифицировать и исключить одни и те же слова, что поможет нам уменьшить размер вектора в Пакет слов или любой другой подход. (объясню это через несколько минут… продолжайте читать)

Выделение корней: теперь у нас есть отдельные слова для анализа, но некоторые слова имеют одно и то же основание / корень. Итак, мы можем объединить их или принять их как одно слово, поскольку мы не хотим увеличивать размер наших данных для анализа. Stemming преобразует слово в его корневую форму. Пример: петь, петь, певец принадлежит к корню слова «петь». Поэтому было бы лучше оставить одно слово «петь», а остальные удалить. Иногда выходные слова из Стеммера не имеют смысла. Пример телят - ›теленок (метод Stemming фактически пытается удалить суффиксы или заменить суффиксы). Существует 3 наиболее часто используемых стеммера, их сравнение приведено ниже:

Здесь можно заметить, что PorterStemmer наименее строгий, а Lancaster - самый строгий, но очень быстрый. Стеммер Snowball - это хороший компромисс между скоростью и строгостью. Итак, мы можем использовать Snowball Stemmer для остановки наших обзоров.

Лемматизация. Как и стемминг, лемматизация преобразует слова в их базовую форму, но она является более сложной. Лемматизатор использует свою базу знаний для преобразования слов в их корневую форму. Пример: Телята - ›Теленок (вывод существительного лемматизатора). Здесь лемматизатор не удаляет суффиксы. Ниже приводится сравнение существительного лемматизатора и верда лемматизатора. Вы можете использовать любой из них, но сохраните его во всем коде.

Он использует базу знаний WordNet. Благодаря знаниям, лемматизация может даже преобразовывать слова с различным написанием, но не может быть решена с помощью стеммеров, например преобразования «пришел» в «пришел». Вывод стеммеров может быть бессмысленным, но вывод лемматизаторов всегда будет значимым.

Стемминг, или лемматизация, или и то, и другое: все зависит от набора данных и того, как вы его анализируете. Лучше, если мы сможем использовать метод проб и ошибок, потому что все наборы данных не одинаковы. После нескольких попыток мы поймем, что использовать: стемминг или лемматизацию, или и то, и другое.

Из нашего набора данных я взял крайний случай обзоров, когда некоторые люди написали сумасшедшие обзоры, опечатки, преднамеренные орфографические ошибки, чтобы выразить эмоции. А теперь проверьте, что лучше стемминг или лемматизация.

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

Машинное обучение - это не то, насколько эффективно работает ваша модель, а насколько точно работает ваша модель. Итак, мы не получим максимально точного результата с первой попытки, нам нужно снова и снова оптимизировать наши методы.

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

Стратегии разработки элементов / модели для анализа текста:

  1. Мешок слов
  2. TF-IDF (частота термина * обратная частота документа)
  3. Word2Vec
  4. Среднее Word2Vec
  5. Взвешенное слово TF-IDF 2Vec

Поскольку этот блог становится слишком большим, в этой части я буду объяснять только подход «Мешок слов».

Мешок слов:

Я рассказал вам кое-что о «векторах» в приведенных выше разделах. Помните?

Наш компьютер не может выполнять операции непосредственно с чистыми текстовыми данными. Итак, нам нужно преобразовать наши данные в такую ​​форму, которую может понять компьютер. Компьютер понимает язык чисел и математики. Нам нужно преобразовать наши данные во что-то, что называется вектором. И математические операции можно легко выполнять с вектором.

Вектор - это не что иное, как одномерный массив размером «n».

Матрица - это набор векторов. После того, как мы преобразовали обзоры в векторные, мы можем использовать возможности линейной алгебры для правильного анализа обзоров. Расстояние между двумя похожими векторами будет меньше, чем расстояние между двумя разными векторами. Векторы можно сравнивать друг с другом, и аналогичные векторы могут быть нанесены на график / представлены рядом друг с другом, а несходные могут быть нанесены на график / представлены вдали друг от друга в 2D-, 3D- или ND-пространстве. И мы можем использовать линию или плоскость в n-мерном пространстве, чтобы разделить группу положительных и отрицательных точек. Таким образом можно отличить положительные отзывы от отрицательных.

Предположим, что мы получили векторное представление обзоров в d-мерном пространстве, как показано на изображении выше. Мы можем разделить их, используя плоскость в d-мерном пространстве, используя «w» (перпендикулярно или перпендикулярно плоскости). Нахождение ‘w’ на данный момент является сложной теорией . Таким образом, мы можем просто предположить, что векторные точки в направлении «w» могут быть классифицированы как положительные, а в направлении, противоположном «w», то есть w ^ T (w-транспонирование) - отрицательными.

Обзор также называется документом. А собрание отзывов или документов называется корпусом.

Предположим, у нас есть 3 предварительно обработанных отзыва (также мы объединили токены в отдельные предложения)

Теперь мы можем сказать, что у нас есть корпус и в нем 3 отзыва / документа.

Стратегия Пакет слов преобразует все обзоры в наборе данных в векторы. Итак, для каждого обзора будет отдельный вектор. Вектор хранит количество каждого слова в обзоре. Вектор фактически будет содержать все слова из корпуса.

Как говорится в названии модели, «Сумка слов», она создает сумку (вектор), которая содержит количество слов для каждого обзора в документе. Вы можете видеть, что эта матрица является разреженной матрицей (содержит большинство элементов в виде нулей). Если бы не производилась предварительная обработка, матрица была бы более разреженной, а количество слов также увеличилось бы, что сделало бы ее менее эффективной и менее точной. Кроме того, написав слова в нижнем регистре, мы избежали дополнительной записи в векторе. Пример: «Еда» и «еда» были бы отдельными элементами в векторе, если бы они не были в нижнем регистре.

Код (набор слов): мы будем использовать CountVectorizer для преобразования наших обзоров в векторы. CountVectorizer доступен в обучающей библиотеке Sci-Kit (sklearn).

Следующие шаги являются основными в машинном обучении:

  1. Разделение данных на обучающий набор и тестовый набор.
  2. Подгонка алгоритма машинного обучения к обучающей выборке. (Здесь мы будем использовать Наивный алгоритм машинного обучения Байеса)
  3. Прогнозирование результатов набора тестов.
  4. Проверка точности модели.

Наивный байесовский классификатор предполагает, что один признак в векторе не зависит от другого. Таким образом, он считает, что каждая функция будет независимо вносить вклад в вероятность того, что обзор будет положительным или отрицательным, без какой-либо корреляции между функциями.

Мы видим, что точность модели составляет 74%, что неплохо. Глядя на матрицу путаницы, мы наблюдаем:

Мы видим, что 41 отзыв был ложноположительным, т.е. они были ложными, но были предсказаны как истинные. Странно?

Это произошло потому, что при удалении игнорируемых слов мы также удалили «не». Удаление ‘not’ может полностью изменить смысл отзыва.

Пример:

  1. Это место нехорошее. (первоначальный обзор)

2. поставить хорошо (убрать стоп-слова, смысл меняется полностью)

Понятие об униграммах, биграммах и н-граммах

Чтобы справиться с ситуациями, подобными описанной выше, Ложные срабатывания, нам нужно иметь дело с более чем одним словом за раз.

Униграмма означает одно слово. При преобразовании обзора в векторы с помощью CountVectorizer по умолчанию мы используем метод uni-gram. Он преобразует отдельное слово в объект вектора.

Мы также можем использовать биграммы (2 слова) или триграммы (3 слова), чтобы иметь дело с такими словами, как: 'не хорошо' (биграмма), 'не так вкусно »(трехграмм). Это очень редкий случай, чтобы использовать вышеуказанные триграммы. Таким образом мы можем повысить точность нашей модели.

Пример: отзыв- Место не так хорошо по сравнению с другими. (после предварительной обработки, за исключением удаления слов)

Примечание. Теперь, поскольку мы будем использовать «не» в наших обзорах, следует избегать удаления таких стоп-слов, как «не» .

Я использовал двухграммовый и трехграммовый подход, но вместо того, чтобы получать лучшие результаты, моя точность продолжала снижаться по мере того, как я увеличивал диапазон n-граммов. Для биграмм и триграмм я получил точность 73,5% (уменьшилась на 0,5%). Но это могло быть потому, что я избегал удаления таких слов, как «не». А использование настраиваемых стоп-слов может не сработать.

Код для построения н-граммов:

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

Вывод:

Пакет слов - очень примитивный подход к НЛП. Мы увидели, что удаление стоп-слов может снизить нашу точность, тогда как при использовании n-граммов ее можно увеличить, но, опять же, нам нужно избегать удаления стоп-слов, таких как «not», для построения n-граммов. Мы не можем вручную удалять игнорируемые слова по одному. Итак, нужен другой подход. Возможно, «TF-IDF» может дать лучшие результаты или любой другой подход к машинному обучению или подход к глубокому обучению. Давай разберемся.

Я бы обсудил TF-IDF в следующей части.

Спасибо за терпеливое чтение.

Ссылки:

Https://www.appliedaicourse.com/ для всей теории и глубоких понятий математики, ML и NLP.

Https://www.superdatascience.com / для простейшего набора данных, который я смог найти для НЛП. Также отсюда была передана часть кодов.



Все изображения в блоге без упомянутого источника созданы мной самостоятельно с использованием MS Paint, со ссылкой на концепции, изложенные на https://www.appliedaicourse.com/.