Учебники

AI с Python — пакет NLTK

В этой главе мы узнаем, как начать работу с пакетом Natural Language Toolkit.

необходимое условие

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

Для создания таких приложений мы будем использовать пакет Python под названием NLTK (Natural Language Toolkit Package).

Импорт НЛТК

Нам нужно установить NLTK перед его использованием. Его можно установить с помощью следующей команды —

pip install nltk

Чтобы собрать пакет conda для NLTK, используйте следующую команду —

conda install -c anaconda nltk

Теперь после установки пакета NLTK нам нужно импортировать его через командную строку python. Мы можем импортировать его, написав следующую команду в командной строке Python —

>>> import nltk

Загрузка данных НЛТК

Теперь после импорта NLTK нам нужно скачать необходимые данные. Это можно сделать с помощью следующей команды в командной строке Python —

>>> nltk.download()

Установка других необходимых пакетов

Для построения приложений обработки естественного языка с использованием NLTK нам нужно установить необходимые пакеты. Пакеты следующие:

gensim

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

pip install gensim

шаблон

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

pip install pattern

Концепция токенизации, стемминга и лемматизации

В этом разделе мы поймем, что такое токенизация, основа и лемматизация.

лексемизацию

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

Вход — Манго, банан, ананас и яблоко — все это фрукты.

Выход лексемизацию

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

В модуле Python NLTK у нас есть различные пакеты, связанные с токенизацией, которые мы можем использовать для разделения текста на токены в соответствии с нашими требованиями. Некоторые из пакетов следующие:

пакет sent_tokenize

Как следует из названия, этот пакет разделит входной текст на предложения. Мы можем импортировать этот пакет с помощью следующего кода Python —

from nltk.tokenize import sent_tokenize

пакет word_tokenize

Этот пакет делит введенный текст на слова. Мы можем импортировать этот пакет с помощью следующего кода Python —

from nltk.tokenize import word_tokenize

Пакет WordPunctTokenizer

Этот пакет делит вводимый текст на слова, а также знаки препинания. Мы можем импортировать этот пакет с помощью следующего кода Python —

from nltk.tokenize import WordPuncttokenizer

Морфологический

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

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

В модуле Python NLTK у нас есть различные пакеты, связанные со стволом. Эти пакеты могут быть использованы для получения базовых форм слова. Эти пакеты используют алгоритмы. Некоторые из пакетов следующие:

PorterStemmer пакет

Этот пакет Python использует алгоритм Портера для извлечения базовой формы. Мы можем импортировать этот пакет с помощью следующего кода Python —

from nltk.stem.porter import PorterStemmer

Например, если мы дадим им слово «запись» в качестве входных данных для этого стеммера, мы получим слово «запись» после стемминга.

LancasterStemmer пакет

Этот пакет Python будет использовать алгоритм Ланкастера для извлечения базовой формы. Мы можем импортировать этот пакет с помощью следующего кода Python —

from nltk.stem.lancaster import LancasterStemmer

Например, если мы дадим им слово «запись» в качестве входных данных для этого стеммера, мы получим слово «запись» после стемминга.

SnowballStemmer пакет

Этот пакет Python будет использовать алгоритм снежного кома для извлечения базовой формы. Мы можем импортировать этот пакет с помощью следующего кода Python —

from nltk.stem.snowball import SnowballStemmer

Например, если мы дадим им слово «запись» в качестве входных данных для этого стеммера, мы получим слово «запись» после стемминга.

Все эти алгоритмы имеют разный уровень строгости. Если мы сравним эти три стеммера, то стеммеры Портера наименее строгие, а Ланкастер — самый строгий. Снежный комик хорош как по скорости, так и по строгости.

лемматизации

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

Основное различие между основанием и лемматизацией заключается в использовании словарного и морфологического анализа слов. Другое отличие состоит в том, что в основе определения чаще всего сходятся слова, связанные с деривацией, в то время как лемматизация обычно сводит воедино только различные инфлективные формы леммы. Например, если мы введем слово saw в качестве входного слова, тогда stemming может вернуть слово «s», но лемматизация будет пытаться вернуть слово «see» или «saw» в зависимости от того, использовался ли токен как глагол или существительное.

В модуле Python NLTK у нас есть следующий пакет, связанный с процессом лемматизации, который мы можем использовать для получения базовых форм слова —

Пакет WordNetLemmatizer

Этот пакет Python извлечет базовую форму слова в зависимости от того, используется ли оно как существительное или как глагол. Мы можем импортировать этот пакет с помощью следующего кода Python —

from nltk.stem import WordNetLemmatizer

Чанкинг: деление данных на чанки

Это один из важных процессов в обработке естественного языка. Основная задача чанкинга состоит в том, чтобы идентифицировать части речи и короткие фразы, такие как словосочетания. Мы уже изучили процесс токенизации, создания токенов. Чанкинг в основном является маркировкой этих токенов. Другими словами, чанкинг покажет нам структуру предложения.

В следующем разделе мы узнаем о различных типах чанковки.

Типы чанкинга

Есть два типа чанкинга. Типы следующие:

Чанкинг

В этом процессе фрагментации объект, вещи и т. Д. Становятся более общими, а язык становится более абстрактным. Есть больше шансов на соглашение. В этом процессе мы уменьшаем масштаб. Например, если мы разберемся с вопросом, «для чего предназначены автомобили»? Мы можем получить ответ «транспорт».

Расщепление

В этом процессе фрагментации объект, вещи и т. Д. Движутся к тому, чтобы стать более специфичными, а язык становится более проницательным. Более глубокая структура будет рассмотрена при разбивке. В этом процессе мы увеличиваем масштаб. Например, если мы разберемся с вопросом «Расскажите конкретно об автомобиле»? Мы получим меньшие кусочки информации об автомобиле.

пример

В этом примере мы сделаем чанки Noun-Phrase, категорию чанков, которые найдут куски именных фраз в предложении, используя модуль NLTK в Python —

Выполните следующие шаги в Python для реализации чанкинга именных фраз —

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

Шаг 2 — На этом шаге нам нужно создать парсер чанков. Было бы разобрать грамматику и дать вывод.

Шаг 3 — На этом последнем шаге вывод производится в древовидном формате.

Давайте импортируем необходимый пакет NLTK следующим образом:

import nltk

Теперь нам нужно определить предложение. Здесь DT означает определитель, VBP означает глагол, JJ означает прилагательное, IN означает предлог и NN означает существительное.

sentence=[("a","DT"),("clever","JJ"),("fox","NN"),("was","VBP"),
          ("jumping","VBP"),("over","IN"),("the","DT"),("wall","NN")]

Теперь нам нужно дать грамматику. Здесь мы дадим грамматику в виде регулярного выражения.

grammar = "NP:{<DT>?<JJ>*<NN>}"

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

parser_chunking = nltk.RegexpParser(grammar)

Парсер разбирает предложение следующим образом —

parser_chunking.parse(sentence)

Далее нам нужно получить вывод. Выходные данные генерируются в простой переменной с именем output_chunk .

Output_chunk = parser_chunking.parse(sentence)

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

output.draw()

NLTK

Модель Мешка Слова (BoW)

Bag of Word (BoW), модель в обработке естественного языка, в основном используется для извлечения особенностей из текста, чтобы текст можно было использовать при моделировании, например, в алгоритмах машинного обучения.

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

Как это устроено

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

Понятие матрицы сроков документа

Алгоритм BoW строит модель, используя матрицу терминов документа. Как следует из названия, матрица терминов документа является матрицей различного количества слов, встречающихся в документе. С помощью этой матрицы текстовый документ может быть представлен в виде взвешенной комбинации различных слов. Устанавливая порог и выбирая слова, которые являются более значимыми, мы можем построить гистограмму всех слов в документах, которые можно использовать как вектор признаков. Ниже приведен пример, чтобы понять концепцию матрицы термина документа —

пример

Предположим, у нас есть следующие два предложения —

  • Предложение 1 — Мы используем модель Bag of Words.

  • Предложение 2 — модель Bag of Words используется для извлечения функций.

Предложение 1 — Мы используем модель Bag of Words.

Предложение 2 — модель Bag of Words используется для извлечения функций.

Теперь, рассматривая эти два предложения, мы имеем следующие 13 различных слов —

  • мы
  • являются
  • с помощью
  • мешок
  • из
  • слова
  • модель
  • является
  • используемый
  • за
  • экстрагирование
  • функции

Теперь нам нужно построить гистограмму для каждого предложения, используя количество слов в каждом предложении —

  • Предложение 1 — [1,1,1,1,1,1,1,1,0,0,0,0,0]

  • Предложение 2 — [0,0,0,1,1,1,1,1,1,1,1,1,1]

Предложение 1 — [1,1,1,1,1,1,1,1,0,0,0,0,0]

Предложение 2 — [0,0,0,1,1,1,1,1,1,1,1,1,1]

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

Концепция статистики

Концепция статистики называется TermFrequency-Inverse Document Frequency (tf-idf). Каждое слово важно в документе. Статистика помогает нам понять важность каждого слова.

Термин частота (тс)

Это мера того, как часто каждое слово появляется в документе. Его можно получить путем деления количества каждого слова на общее количество слов в данном документе.

Частота обратных документов (IDF)

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

Построение модели мешка слов в НЛТК

В этом разделе мы определим коллекцию строк, используя CountVectorizer для создания векторов из этих предложений.

Давайте импортируем необходимую посылку —

from sklearn.feature_extraction.text import CountVectorizer

Теперь определите набор предложений.

Sentences = ['We are using the Bag of Word model', 'Bag of Word model is
           used for extracting the features.']

vectorizer_count = CountVectorizer()

features_text = vectorizer.fit_transform(Sentences).todense()

print(vectorizer.vocabulary_)

Вышеуказанная программа генерирует вывод, как показано ниже. Это показывает, что у нас есть 13 различных слов в двух вышеупомянутых предложениях —

{'we': 11, 'are': 0, 'using': 10, 'the': 8, 'bag': 1, 'of': 7,
 'word': 12, 'model': 6, 'is': 5, 'used': 9, 'for': 4, 'extracting': 2, 'features': 3}

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

Решение проблем

В этом разделе мы решим несколько связанных проблем.

Прогнозирование категории

В наборе документов также важны не только слова, но и категория слов; в какую категорию текста попадает определенное слово. Например, мы хотим предсказать, относится ли данное предложение к категории «электронная почта», «новости», «спорт», «компьютер» и т. Д. В следующем примере мы будем использовать tf-idf, чтобы сформулировать вектор признаков для поиска категории документов. Мы будем использовать данные из 20 наборов новостей группы sklearn.

Нам нужно импортировать необходимые пакеты —

from sklearn.datasets import fetch_20newsgroups
from sklearn.naive_bayes import MultinomialNB
from sklearn.feature_extraction.text import TfidfTransformer
from sklearn.feature_extraction.text import CountVectorizer

Определите карту категории. Мы используем пять различных категорий: Религия, Автомобили, Спорт, Электроника и Космос.

category_map = {'talk.religion.misc':'Religion','rec.autos''Autos',
   'rec.sport.hockey':'Hockey','sci.electronics':'Electronics', 'sci.space': 'Space'}

Создать тренировочный набор —

training_data = fetch_20newsgroups(subset = 'train',
   categories = category_map.keys(), shuffle = True, random_state = 5)

Создайте векторизатор количества и извлеките число отсчетов —

vectorizer_count = CountVectorizer()
train_tc = vectorizer_count.fit_transform(training_data.data)
print("\nDimensions of training data:", train_tc.shape)

Трансформатор TF-IDF создается следующим образом —

tfidf = TfidfTransformer()
train_tfidf = tfidf.fit_transform(train_tc)

Теперь определите тестовые данные —

input_data = [
   'Discovery was a space shuttle',
   'Hindu, Christian, Sikh all are religions',
   'We must have to drive safely',
   'Puck is a disk made of rubber',
   'Television, Microwave, Refrigrated all uses electricity'
]

Приведенные выше данные помогут нам подготовить многокомиальный наивный байесовский классификатор —

classifier = MultinomialNB().fit(train_tfidf, training_data.target)

Преобразовать входные данные с помощью счетчика векторизатора —

input_tc = vectorizer_count.transform(input_data)

Теперь мы преобразуем векторизованные данные с помощью преобразователя tfidf —

input_tfidf = tfidf.transform(input_tc)

Мы прогнозируем выходные категории —

predictions = classifier.predict(input_tfidf)

Выход генерируется следующим образом —

for sent, category in zip(input_data, predictions):
   print('\nInput Data:', sent, '\n Category:', \
      category_map[training_data.target_names[category]])

Предиктор категории генерирует следующий вывод:

Dimensions of training data: (2755, 39297)

Input Data: Discovery was a space shuttle
Category: Space

Input Data: Hindu, Christian, Sikh all are religions
Category: Religion

Input Data: We must have to drive safely
Category: Autos

Input Data: Puck is a disk made of rubber
Category: Hockey

Input Data: Television, Microwave, Refrigrated all uses electricity
Category: Electronics

Пол Finder

В этом заявлении о проблемах классификатор будет обучен определению пола (мужского или женского пола) путем предоставления имён. Нам нужно использовать эвристику для построения вектора признаков и обучения классификатора. Мы будем использовать помеченные данные из пакета scikit-learn. Ниже приведен код Python для построения гендерного поиска —

Давайте импортируем необходимые пакеты —

import random

from nltk import NaiveBayesClassifier
from nltk.classify import accuracy as nltk_accuracy
from nltk.corpus import names

Теперь нам нужно извлечь последние N букв из входного слова. Эти письма будут действовать как функции —

def extract_features(word, N = 2):
   last_n_letters = word[-N:]
   return {'feature': last_n_letters.lower()}
	
if __name__=='__main__':

Создайте данные тренировок, используя помеченные имена (мужские и женские), доступные в NLTK —

male_list = [(name, 'male') for name in names.words('male.txt')]
female_list = [(name, 'female') for name in names.words('female.txt')]
data = (male_list + female_list)

random.seed(5)
random.shuffle(data)

Теперь тестовые данные будут созданы следующим образом —

namesInput = ['Rajesh', 'Gaurav', 'Swati', 'Shubha']

Определите количество образцов, используемых для обучения и тестирования, с помощью следующего кода

train_sample = int(0.8 * len(data))

Теперь нам нужно перебрать разные длины, чтобы можно было сравнить точность —

for i in range(1, 6):
   print('\nNumber of end letters:', i)
   features = [(extract_features(n, i), gender) for (n, gender) in data]
   train_data, test_data = features[:train_sample],
features[train_sample:]
   classifier = NaiveBayesClassifier.train(train_data)

Точность классификатора может быть рассчитана следующим образом —

accuracy_classifier = round(100 * nltk_accuracy(classifier, test_data), 2)
   print('Accuracy = ' + str(accuracy_classifier) + '%')

Теперь мы можем предсказать результат —

for name in namesInput:
   print(name, '==>', classifier.classify(extract_features(name, i)))

Вышеуказанная программа сгенерирует следующий вывод —

Number of end letters: 1
Accuracy = 74.7%
Rajesh -> female
Gaurav -> male
Swati -> female
Shubha -> female

Number of end letters: 2
Accuracy = 78.79%
Rajesh -> male
Gaurav -> male
Swati -> female
Shubha -> female

Number of end letters: 3
Accuracy = 77.22%
Rajesh -> male
Gaurav -> female
Swati -> female
Shubha -> female

Number of end letters: 4
Accuracy = 69.98%
Rajesh -> female
Gaurav -> female
Swati -> female
Shubha -> female

Number of end letters: 5
Accuracy = 64.63%
Rajesh -> female
Gaurav -> female
Swati -> female
Shubha -> female

В приведенном выше выводе мы видим, что точность максимального количества конечных букв равна двум, и она уменьшается с увеличением числа конечных букв.

Моделирование темы: идентификация шаблонов в текстовых данных

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

Мы можем использовать технику моделирования темы в следующих сценариях —

Классификация текста

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

Рекомендательные Системы

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

Алгоритмы для тематического моделирования

Тематическое моделирование может быть реализовано с использованием алгоритмов. Алгоритмы следующие:

Скрытое распределение Дирихле (LDA)

Этот алгоритм является самым популярным для тематического моделирования. Он использует вероятностные графические модели для реализации тематического моделирования. Нам нужно импортировать пакет gensim в Python для использования алгоритма LDA.

Скрытый семантический анализ (LDA) или Скрытый семантический индекс (LSI)

Этот алгоритм основан на линейной алгебре. В основном он использует концепцию SVD (Singular Value Decomposition) в матрице терминов документа.

Неотрицательная матричная факторизация (НМФ)

Он также основан на линейной алгебре.

Все вышеупомянутые алгоритмы для моделирования тем будут иметь количество тем в качестве параметра, матрицу документа-слова в качестве входных данных и WTM (матрица тем Word) и TDM (матрица документов тем) в качестве выходных данных.