Рубрики
Без рубрики

Python для НЛП: Введение в библиотеку TextBlob

Автор оригинала: Usman Malik.

Python для НЛП: Введение в библиотеку TextBlob

Вступление

Это седьмая статья в моей серии статей по Python для НЛП. В моей предыдущей статье я объяснил , как выполнить тематическое моделирование с использованием Латентного распределения Дирихле и Неотрицательной матричной факторизации . Мы использовали библиотеку Scikit-Learn для выполнения тематического моделирования.

В этой статье мы рассмотрим Text Blob , который является еще одной чрезвычайно мощной библиотекой НЛП для Python. TextBlob построен на NLTK и предоставляет простой в использовании интерфейс для библиотеки NLTK. Мы увидим, как TextBlob может быть использован для выполнения различных задач НЛП, начиная от маркировки частей речи и заканчивая анализом настроений и переводом языка и заканчивая классификацией текста.

Подробные инструкции по загрузке библиотеки можно найти по официальной ссылке . Я бы посоветовал вам установить библиотеку TextBlob, а также образцы корпусов.

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

$ pip install -U textblob

И установить корпусы:

$ python -m textblob.download_corpora

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

Токенизация

Токенизация – это разбиение большого абзаца на предложения или слова. Как правило, маркер относится к слову в текстовом документе. Токенизация довольно прямолинейна с помощью TextBlob. Все, что вам нужно сделать, это импортировать объект TextBlob из библиотеки textblob , передать ему документ, который вы хотите маркировать, а затем использовать атрибуты sentences и words , чтобы получить маркированные предложения и атрибуты. Давайте посмотрим на это в действии:

Первым шагом является импорт объекта Text Blob :

from textblob import TextBlob

Далее необходимо определить строку, содержащую текст документа. Мы создадим строку, содержащую первый абзац статьи Википедии об искусственном интеллекте.

document = ("In computer science, artificial intelligence (AI), \
            sometimes called machine intelligence, is intelligence \
            demonstrated by machines, in contrast to the natural intelligence \
            displayed by humans and animals. Computer science defines AI \
            research as the study of \"intelligent agents\": any device that \
            perceives its environment and takes actions that maximize its\
            chance of successfully achieving its goals.[1] Colloquially,\
            the term \"artificial intelligence\" is used to describe machines\
            that mimic \"cognitive\" functions that humans associate with other\
            human minds, such as \"learning\" and \"problem solving\".[2]")

Следующий шаг-передать этот документ в качестве параметра классу Text Blob . Возвращаемый объект затем может быть использован для обозначения документа словами и предложениями.

text_blob_object = TextBlob(document)

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

document_sentence = text_blob_object.sentences

print(document_sentence)
print(len(document_sentence))

В выходных данных вы увидите маркированные предложения вместе с количеством предложений.

[Sentence("In computer science, artificial intelligence (AI),             sometimes called machine intelligence, is intelligence             demonstrated by machines, in contrast to the natural intelligence             displayed by humans and animals."), Sentence("Computer science defines AI             research as the study of "intelligent agents": any device that             perceives its environment and takes actions that maximize its            chance of successfully achieving its goals."), Sentence("[1] Colloquially,            the term "artificial intelligence" is used to describe machines            that mimic "cognitive" functions that humans associate with other            human minds, such as "learning" and "problem solving"."), Sentence("[2]")]
4

Аналогично, атрибут words возвращает маркированные слова в документе.

document_words = text_blob_object.words

print(document_words)
print(len(document_words))

Вывод выглядит следующим образом:

['In', 'computer', 'science', 'artificial', 'intelligence', 'AI', 'sometimes', 'called', 'machine', 'intelligence', 'is', 'intelligence', 'demonstrated', 'by', 'machines', 'in', 'contrast', 'to', 'the', 'natural', 'intelligence', 'displayed', 'by', 'humans', 'and', 'animals', 'Computer', 'science', 'defines', 'AI', 'research', 'as', 'the', 'study', 'of', 'intelligent', 'agents', 'any', 'device', 'that', 'perceives', 'its', 'environment', 'and', 'takes', 'actions', 'that', 'maximize', 'its', 'chance', 'of', 'successfully', 'achieving', 'its', 'goals', '1', 'Colloquially', 'the', 'term', 'artificial', 'intelligence', 'is', 'used', 'to', 'describe', 'machines', 'that', 'mimic', 'cognitive', 'functions', 'that', 'humans', 'associate', 'with', 'other', 'human', 'minds', 'such', 'as', 'learning', 'and', 'problem', 'solving', '2']
84

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

Под лемматизацией понимается приведение слова к его корневой форме, найденной в словаре.

Чтобы выполнить лемматизацию с помощью Text Blob, вы должны использовать объект Word из библиотеки textblob , передать ему слово, которое вы хотите лемматизировать, а затем вызвать метод lemmatize .

from textblob import Word

word1 = Word("apples")
print("apples:", word1.lemmatize())

word2 = Word("media")
print("media:", word2.lemmatize())

word3 = Word("greater")
print("greater:", word3.lemmatize("a"))

В приведенном выше сценарии мы выполняем лемматизацию слов “яблоки”, “медиа” и “больше”. В выходных данных вы увидите слова “яблоко” (которое является единственным для яблока), “средний” (который является единственным для среды) и “великий” (который является положительной степенью для слова больше). Обратите внимание, что для слова greater мы передаем “a” в качестве параметра методу lemmatize . Это конкретно говорит методу, что слово должно рассматриваться как прилагательное. По умолчанию слова обрабатываются как существительные методом lemmatize () . Полный список частей компонентов речи выглядит следующим образом:

ADJ, ADJ_SAT, ADV, NOUN, VERB = 'a', 's', 'r', 'n', 'v'

Маркировка частей речи (POS)

Как и библиотеки space и NLTK, библиотека TextBlob также содержит функциональные возможности для маркировки POS.

Чтобы найти POS-теги для слов в документе, все, что вам нужно сделать, это использовать атрибут tags , как показано ниже:

for word, pos in text_blob_object.tags:
    print(word + " => " + pos)

В приведенном выше скрипте выведите теги для всех слов в первом абзаце статьи Википедии об искусственном интеллекте. Вывод приведенного выше скрипта выглядит следующим образом:

POS-теги были напечатаны в форме аббревиатуры. Чтобы увидеть полную форму каждой аббревиатуры, пожалуйста, обратитесь к этой ссылке .

Преобразование текста в единственное и множественное число

TextBlob также позволяет конвертировать текст во множественное или единственное число с помощью методов pluralize и singularize соответственно. Посмотрите на следующий пример:

text = ("Football is a good game. It has many health benefit")
text_blob_object = TextBlob(text)
print(text_blob_object.words.pluralize())

В выходных данных вы увидите множественное число всех слов:

['Footballs', 'iss', 'some', 'goods', 'games', 'Its', 'hass', 'manies', 'healths', 'benefits']

Аналогично, для сингуляризации слов вы можете использовать метод singularize следующим образом:

text = ("Footballs is a goods games. Its has many healths benefits")

text_blob_object = TextBlob(text)
print(text_blob_object.words.singularize())

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

['Football', 'is', 'a', 'good', 'game', 'It', 'ha', 'many', 'health', 'benefit']

Извлечение Именных Фраз

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

Чтобы найти именные фразы, вам просто нужно использовать атрибуты noun_phrase объекта Text Blob . Посмотрите на следующий пример:

text_blob_object = TextBlob(document)
for noun_phrase in text_blob_object.noun_phrases:
    print(noun_phrase)

Вывод выглядит следующим образом:

computer science
artificial intelligence
ai
machine intelligence
natural intelligence
computer
science defines
ai
intelligent agents
colloquially
artificial intelligence
describe machines
human minds

Вы можете увидеть все именные фразы в нашем документе.

Получение количества слов и фраз

В предыдущем разделе мы использовали встроенный в Python метод len для подсчета количества предложений, слов и именных фраз, возвращаемых объектом TextBlob . Для этой же цели мы можем использовать встроенные методы Text Blob.

Чтобы найти частоту встречаемости определенного слова, мы должны передать имя слова в качестве индекса в список word_counts объекта TextBlob .

В следующем примере мы подсчитаем количество экземпляров слова “интеллект” в первом абзаце статьи Википедии об искусственном интеллекте.

text_blob_object = TextBlob(document)
text_blob_object.word_counts['intelligence']

Другой способ-просто вызвать метод count для атрибута words и передать имя слова, частота встречаемости которого должна быть найдена, как показано ниже:

text_blob_object.words.count('intelligence')

Важно отметить, что по умолчанию поиск не чувствителен к регистру. Если вы хотите, чтобы ваш поиск был чувствителен к регистру, вам нужно передать True в качестве значения параметра case_sensitive , как показано ниже:

text_blob_object.words.count('intelligence', case_sensitive=True)

Как и подсчет слов, именные фразы также могут быть подсчитаны таким же образом. В следующем примере в абзаце встречается фраза “искусственный интеллект”.

text_blob_object = TextBlob(document)
text_blob_object.noun_phrases.count('artificial intelligence')

В выводе вы увидите 2.

Преобразование в верхний и нижний регистр

Объекты Text Blob очень похожи на строки. Вы можете преобразовать их в верхний или нижний регистр, изменить их значения и объединить их вместе. В следующем скрипте мы преобразуем текст из объекта Text Blob в верхний регистр:

text = "I love to watch football, but I have never played it"
text_blob_object = TextBlob(text)

print(text_blob_object.upper())

В выходных данных вы увидите строку в верхнем регистре:

I LOVE TO WATCH FOOTBALL, BUT I HAVE NEVER PLAYED IT

Аналогично, чтобы преобразовать текст в нижний регистр, мы можем использовать метод lower () , как показано ниже:

text = "I LOVE TO WATCH FOOTBALL, BUT I HAVE NEVER PLAYED IT"
text_blob_object = TextBlob(text)

print(text_blob_object.lower())

Нахождение N-граммов

N-Граммы относятся к n сочетаниям слов в предложении. Например, для предложения “Я люблю смотреть футбол” некоторые 2 грамма будут (я люблю), (люблю смотреть) и (смотреть футбол). N-граммы могут играть решающую роль в классификации текста.

В TextBlob N-грамм можно найти, передав количество N-грамм в метод n грамм объекта Text Blob|/. Посмотрите на следующий пример:

text = "I love to watch football, but I have never played it"
text_blob_object = TextBlob(text)
for ngram in text_blob_object.ngrams(2):
    print(ngram)

Вывод скрипта выглядит следующим образом:

['I', 'love']
['love', 'to']
['to', 'watch']
['watch', 'football']
['football', 'but']
['but', 'I']
['I', 'have']
['have', 'never']
['never', 'played']
['played', 'it']

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

Орфографические исправления

Коррекция орфографии-это одна из уникальных функций библиотеки TextBlob. С помощью метода correct объекта Text Blob вы можете исправить все орфографические ошибки в вашем тексте. Посмотрите на следующий пример:

text = "I love to watchf footbal, but I have neter played it"
text_blob_object = TextBlob(text)

print(text_blob_object.correct())

В приведенном выше сценарии мы допустили три орфографические ошибки: “смотреть” вместо “смотреть”, “футбол” вместо “футбол”, “ни” вместо “никогда”. В выходных данных вы увидите, что эти ошибки были исправлены TextBlob, как показано ниже:

I love to watch football, but I have never played it

Языковой Перевод

Одной из самых мощных возможностей библиотеки TextBlob является перевод с одного языка на другой. На бэкэнде переводчик языка TextBlob использует API Google Translate

Чтобы перевести с одного языка на другой, вам просто нужно передать текст объекту Text Blob , а затем вызвать метод translate для этого объекта. Код языка для языка, на который вы хотите перевести текст, передается в качестве параметра методу. Давайте рассмотрим пример:

text_blob_object_french = TextBlob(u'Salut comment allez-vous?')
print(text_blob_object_french.translate(to='en'))

В приведенном выше сценарии мы передаем предложение на французском языке объекту Text Blob . Затем мы вызываем метод translate для объекта и передаем код языка en параметру to . Код языка en соответствует английскому языку. В выходных данных вы увидите перевод французского предложения, как показано ниже:

Hi, how are you?

Давайте возьмем другой пример, где мы будем переводить с арабского на английский:

text_blob_object_arabic = TextBlob(u'مرحبا كيف حالك؟')
print(text_blob_object_arabic.translate(to='en'))

Выход:

Hi, how are you?

Наконец, используя метод detect_language , вы также можете определить язык предложения. Посмотрите на следующий сценарий:

text_blob_object = TextBlob(u'Hola como estas?')
print(text_blob_object.detect_language())

В выходных данных вы увидите es , что означает испанский язык.

Код языка для всех языков можно найти по этой ссылке .

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

TextBlob также предоставляет базовые возможности классификации текста. Хотя я бы не рекомендовал TextBlob для классификации текста из-за его ограниченных возможностей, однако, если у вас действительно ограниченные данные и вы хотите быстро разработать очень простую модель классификации текста, то вы можете использовать TextBlob. Для продвинутых моделей я бы рекомендовал библиотеки машинного обучения, такие как Scikit-Learn или Tensorflow.

Давайте посмотрим, как мы можем выполнить классификацию текста с помощью Text Blob. Первое, что нам нужно, – это обучающий набор данных и тестовые данные. Классификационная модель будет обучаться на обучающем наборе данных и оцениваться на тестовом наборе данных.

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

train_data = [
    ('This is an excellent movie', 'pos'),
    ('The move was fantastic I like it', 'pos'),
    ('You should watch it, it is brilliant', 'pos'),
    ('Exceptionally good', 'pos'),
    ("Wonderfully directed and executed. I like it", 'pos'),
    ('It was very boring', 'neg'),
    ('I did not like the movie', 'neg'),
    ("The movie was horrible", 'neg'),
    ('I will not recommend', 'neg'),
    ('The acting is pathetic', 'neg')
]
test_data = [
    ('Its a fantastic series', 'pos'),
    ('Never watched such a brillent movie', 'pos'),
    ("horrible acting", 'neg'),
    ("It is a Wonderful movie", 'pos'),
    ('waste of money', 'neg'),
    ("pathetic picture", 'neg')
]

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

Мы будем обучать наш набор данных на train_data и оценивать его на test_data . Для этого мы будем использовать класс NaiveBayesClassifier из библиотеки textblob.classifiers . Следующий сценарий импортирует библиотеку:

from textblob.classifiers import NaiveBayesClassifier

Чтобы обучить модель, мы просто должны передать обучающие данные конструктору класса NaiveBayesClassifier . Класс вернет объект, обученный на наборе данных и способный делать прогнозы на тестовом наборе.

classifier = NaiveBayesClassifier(train_data)

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

print(classifier.classify("It is very boring"))

Похоже на отрицательный отзыв. Когда вы выполните описанный выше сценарий, вы увидите neg в выходных данных.

Аналогично, следующий скрипт вернет pos , так как отзыв положительный.

print(classifier.classify("It's a fantastic series"))

Вы также можете сделать прогноз, передав наш классификатор параметру классификатора объекта Text Blob|/. Затем вам нужно вызвать метод classify для объекта Text Blob , чтобы просмотреть прогноз.

sentence = TextBlob("It's a fantastic series.", classifier=classifier)
print(sentence.classify())

Наконец, чтобы найти точность вашего алгоритма в тестовом наборе, вызовите метод accuracy в вашем классификаторе и передайте ему test_data , который мы только что создали. Посмотрите на следующий сценарий:

classifier.accuracy(test_data)

На выходе вы увидите 0.66, что является точностью алгоритма.

Чтобы найти наиболее важные признаки для классификации, можно использовать метод show_informative_features . В качестве параметра передается количество наиболее важных объектов, которые необходимо увидеть.

classifier.show_informative_features(3)

Вывод выглядит следующим образом:

Most Informative Features
            contains(it) = False             neg : pos    =      2.2 : 1.0
            contains(is) = True              pos : neg    =      1.7 : 1.0
           contains(was) = True              neg : pos    =      1.7 : 1.0

В этом разделе мы попытались найти тональность обзора фильма, используя классификацию текста. На самом деле вам не нужно выполнять классификацию текста, чтобы найти смысл предложения в текстовом блобе. Библиотека TextBlob поставляется со встроенным анализатором настроений, который мы увидим в следующем разделе.

Анализ настроений

В этом разделе мы проанализируем настроения общественности по поводу различных продуктов, приобретенных через Amazon. Для этого мы будем использовать анализатор настроений Text Blob.

Набор данных можно загрузить по ссылке this Kaggle link .

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

import pandas as pd
import numpy as np

reviews_datasets = pd.read_csv(r'E:\Datasets\Reviews.csv')
reviews_datasets = reviews_datasets.head(20000)
reviews_datasets.dropna()

Чтобы увидеть, как выглядит наш набор данных, мы будем использовать метод head фрейма данных pandas:

reviews_datasets.head()

Вывод выглядит следующим образом:

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

Давайте посмотрим на распределение рейтинга:

import seaborn as sns
import matplotlib.pyplot as plt
%matplotlib inline
sns.distplot(reviews_datasets['Score'])

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

sns.countplot(x='Score', data=reviews_datasets)

Результаты показывают, что более половины отзывов имеют 5-звездочные рейтинги.

Давайте случайным образом выберем отзыв и найдем его полярность с помощью TextBlob. Давайте взглянем на отзыв № 350.

reviews_datasets['Text'][350]

Выход:

'These chocolate covered espresso beans are wonderful!  The chocolate is very dark and rich and the "bean" inside is a very delightful blend of flavors with just enough caffine to really give it a zing.'

Похоже, отзыв положительный. Давайте проверим это с помощью библиотеки TextBlob. Чтобы найти сентимент, мы должны использовать атрибут sentiment объекта Text Blog . Объект sentiment возвращает кортеж, содержащий полярность и субъективность обзора.

Значение полярности может быть между -1 и 1, где отзывы с отрицательными полярностями имеют отрицательные настроения, в то время как отзывы с положительными полярностями имеют положительные настроения.

Значение субъективности может быть от 0 до 1. Субъективность количественно определяет количество личного мнения и фактической информации, содержащейся в тексте. Более высокая субъективность означает, что текст содержит личное мнение, а не фактическую информацию.

Давайте выясним настроение 350-го обзора.

text_blob_object = TextBlob(reviews_datasets['Text'][350])
print(text_blob_object.sentiment)

Вывод выглядит следующим образом:

Sentiment(polarity=0.39666666666666667,subjectivity=0.6616666666666667)

Вывод показывает, что отзыв положительный с высокой субъективностью.

Теперь давайте добавим столбец для полярности настроений в наш набор данных. Выполните следующий сценарий:

def find_pol(review):
    return TextBlob(review).sentiment.polarity

reviews_datasets['Sentiment_Polarity'] = reviews_datasets['Text'].apply(find_pol)
reviews_datasets.head()

Теперь давайте посмотрим на распределение полярности в нашем наборе данных. Выполните следующий сценарий:

sns.distplot(reviews_datasets['Sentiment_Polarity'])

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

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

Давайте теперь построим среднюю полярность для каждого балла рейтинга.

sns.barplot(x='Score', y='Sentiment_Polarity', data=reviews_datasets)

Выход:

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

Давайте теперь рассмотрим некоторые из наиболее негативных отзывов, то есть отзывы со значением полярности -1.

most_negative = reviews_datasets[reviews_datasets.Sentiment_Polarity == -1].Text.head()
print(most_negative)

Вывод выглядит следующим образом:

545     These chips are nasty.  I thought someone had ...
1083    All my fault. I thought this would be a carton...
1832    Pop Chips are basically a horribly over-priced...
2087    I do not consider Gingerbread, Spicy Eggnog, C...
2763    This popcorn has alot of hulls I order 4 bags ...
Name: Text, dtype: object

Выведем значение отзыва № 545.

reviews_datasets['Text'][545]

В выходных данных вы увидите следующий обзор:

'These chips are nasty.  I thought someone had spilled a drink in the bag, no the chips were just soaked with grease.  Nasty!!'

Результат ясно показывает, что отзыв является крайне негативным.

Давайте теперь посмотрим некоторые из самых положительных отзывов. Выполните следующий сценарий:

most_positive = reviews_datasets[reviews_datasets.Sentiment_Polarity == 1].Text.head()
print(most_positive)

Вывод выглядит следующим образом:

106     not what I was expecting in terms of the compa...
223     This is an excellent tea.  One of the best I h...
338     I like a lot of sesame oil and use it in salad...
796     My mother and father were the recipient of the...
1031    The Kelloggs Muselix are delicious and the del...
Name: Text, dtype: object

Давайте рассмотрим обзор 106 подробнее:

reviews_datasets['Text'][106]

Выход:

"not what I was expecting in terms of the company's reputation for excellent home delivery products"

Вы можете видеть, что, хотя отзыв был не очень положительным, ему была присвоена полярность 1 из-за наличия таких слов, как отлично и репутация . Важно знать, что анализатор настроений не является на 100% устойчивым к ошибкам и может предсказать неправильные настроения в нескольких случаях, таких как тот, который мы только что видели.

Давайте теперь посмотрим на отзыв № 223, который также был отмечен как положительный.

reviews_datasets['Text'][223]

Вывод выглядит следующим образом:

"This is an excellent tea.  One of the best I have ever had.  It is especially great when you prepare it with a samovar."

Результаты ясно показывают, что обзор является в высшей степени позитивным.

Вывод

Библиотека TextBlob Python-одна из самых известных и широко используемых библиотек обработки естественного языка. В этой статье подробно описываются некоторые функции библиотеки TextBlob, такие как токенизация, стемминг, анализ настроений, классификация текста и языковой перевод.

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