Обработка естественного языка с помощью наивного Байеса

Многие из нас слышали о НЛП или обработке естественного языка, и, вероятно, вы здесь, потому что хотите изучить эту область. Проще говоря, НЛП — это технология, с помощью которой компьютеры могут понимать человеческий язык. Но что такое Наивный Байес? Наивный байесовский алгоритм часто используется для обработки естественного языка. Теперь, если у вас есть некоторый предыдущий опыт работы с машинным обучением, вы, возможно, знаете или слышали о таких алгоритмах, как KNN, логистическая регрессия, линейная регрессия. Но в этом блоге мы будем использовать наивный байесовский алгоритм, потому что он лучше любого другого алгоритма, особенно для классификации текста и если вы не слышали о вышеперечисленных алгоритмах, то это тоже не беда, так как они нам здесь вряд ли понадобятся

Поэтому я разделю весь этот блог на две части:

1. Предварительная обработка текста

2. Наивный Байес

1.Предварительная обработка текста

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

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

Таким образом, изменить фрагмент текста так, чтобы мы могли выполнить некоторую математическую операцию, означает преобразовать этот текст в вектор. Почему вектор? Потому что, если мы сможем каким-то образом преобразовать наш текст в вектор, мы сможем использовать все линейные алгебраические операции над нашим текстом. Звучит интересно, правда?

Есть много способов, которыми мы можем преобразовать текст в векторы.

я. Мешок слов

II. Tf-Idf

III. Word2Vec

IV. Среднее значение Word2Vec

Здесь, в этом блоге, я буду обсуждать только первый метод, т.е. мешок слов.

Мешок слов

Пакет слов — один из широко используемых методов преобразования заданного текста в вектор. Итак, давайте посмотрим, как на самом деле работает мешок слов.

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

d1: «Ubuntu — отличная операционная система для начинающих»

d2: «Ubuntu — плохая операционная система для начинающих»

d3: «Ubuntu — потрясающая операционная система для начинающих»

d4: «Ubuntu — худшая операционная система для новичков»

Эти данные в области машинного обучения называются документами.

Шаг 2.Далее мы создадим словарь, содержащий все уникальные слова из четырех документов.

Шаг 3.Теперь мы создадим вектор для каждого из вышеуказанных документов. Если в документе есть слова «d», мы создадим для него d-мерный вектор. Мы можем создать этот вектор, используя хэш-карту или словарь, подобный структуре. Эта структура также будет иметь ту же длину, что и словарь, который мы создали выше, и значения этого вектора будут равны количеству раз соответствующего слова в основном словаре, которое встречалось в обрабатываемом нами документе. Хорошо, я знаю, что это немного сложно! Упростим концепцию на примере.

Вектор для первого документа будет -

Давайте разберемся, почему результирующие векторы выглядят именно так. Первое значение вектора равно 1, потому что первое слово словаря «Ubuntu» присутствует в документе d1, то же самое касается индексов 1,2,3,7,11,12,13,14 при условии, что наш индекс начинается at 1. Четвертое значение вектора равно 0, потому что четвертое слово словаря «an» отсутствует в d1, и то же самое касается индексов 4,5,6,8,9,10.

Следующий фрагмент кода показывает реализацию BOW в python.

Теперь, если вы внимательно посмотрите, у вас может возникнуть сомнение, почему существует 13 функций, когда на самом деле существует 14 уникальных слов, простой ответ: CountVectorizer игнорирует однобуквенные слова, поэтому он проигнорировал букву «а» и поэтому показывает 13 особенности, а не 14

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

а) Удаление стоп-слов

Стоп-слова — это слова, которые при удалении из документа на самом деле не меняют характер этого документа, например, если этот документ был положительным, как «d1» в нашем примере, при удалении стоп-слов из этого документа он будет по-прежнему быть положительным, и то же самое касается отрицательного документа.

пример: is , a , for , this и т. д.

Следующий фрагмент кода выводит все стоп-слова для английского алфавита:

б) Вывод

Для некоторых слов фактическое значение одинаково, например, для слов «зануда» и «скучно», эти два слова на самом деле относятся к одному и тому же значению и поэтому должны быть заменены одним словом.

Следующий фрагмент кода показывает, как выполнить стемминг в python:

в) Лемматизация

Лемматизация — это, по сути, разбиение документа на отдельные слова или на группу из двух, а иногда и более слов. Если документ разбит на отдельные слова, то он называется униграммами, если разделен на группу из двух слов, то он называется биграммами и доходит до n-грамм.

пример: если мы разделим d1 следующим образом, то это называется униграммой

«Убунту», «есть», «а», «отлично», «ОС», «для», «новичков».

если мы разделим d1 так, то это называется биграммами

«Ubuntu есть», «это», «отличная», «отличная ОС», «ОС для», «для начинающих»

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

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

Наивный Байес

Прежде чем идти дальше, вам очень важно прояснить понятия вероятности. Вам нужно иметь четкое понятие — Условная Вероятность, Независимые события, Теорема Умножения, Теорема Байеса и все остальные основные понятия вероятности. Если у вас есть очищенные концепции, то вы готовы понять концепции, а если нет, я настоятельно рекомендую вам изучить эти концепции и вернуться.

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

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

Итак, формула Наивного Байеса:

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

Реализация Наивного Байеса чрезвычайно проста с использованием Python и может быть выполнена с помощью библиотеки обучения scikit.

from sklearn.naive_bayes import GaussianNB
NB=GaussianNB()

Затем мы можем передать данные с помощью функции .fit() и, наконец, предсказать значения с помощью .predict()

БОНУСНЫЙ контент

Эта часть не полностью посвящена машинному обучению, но представляет собой пересечение программной инженерии и машинного обучения, и я чувствую, что она поможет понять, как концепция структур данных и алгоритмов реализуется в машинном обучении. В библиотеке обучения scikit специально для Naive Bayes есть специальная реализация алгоритма Naive Bayes, которая называется «Out of Core Naive Bayes». Таким образом, этот «Out of Core Naive Bayes» используется в тех случаях, когда данные огромны, а наша оперативная память сравнительно намного меньше, в основном все данные не помещаются в ОЗУ. Теперь, если вы знакомы с концепцией внешней сортировки слиянием, то концепция, используемая здесь, почти такая же, т. Е. Все данные будут разделены на размер, который может поместиться в ОЗУ, и они будут отсортированы по отдельности и будут окончательно объединены. Теперь есть довольно большая вероятность того, что на самом деле «Out of Core Naive Bayes» не работает таким образом, или даже если это так, может быть, он использует какую-то более продвинутую версию или более оптимизированную версию внешней сортировки слиянием. Я просто пытался мотивировать вас оценить, как эти алгоритмы могут быть реализованы в этих сценариях.