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

Вопрос. Как узнать, успешен ли ваш продукт?

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

Итак, давайте начнем с того, что такое анализ настроений?

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

Это может быть возможно не в индивидуальном порядке каждый раз, когда вы не выполняете анализ настроений, но вы ищете отзывы прямо, например, перед покупкой продукта или загрузкой приложения на свое устройство (телефон) из App Store или Play Store вы можете искать отзывы о том, что другие клиенты или пользователи говорят об этом продукте, хорошо это или плохо, и вы анализируете их вручную. Рассмотрим на уровне компании, как они анализируют, что клиенты говорят о конкретных продуктах, у них действительно более миллиона клиентов. Именно здесь компаниям необходимо провести анализ настроений, чтобы узнать, хороши ли их продукты на рынке или нет.

Что такое НЛТК?

NLTK расшифровывается как Natural Language Toolkit. Он предоставляет нам различные библиотеки обработки текста с множеством тестовых наборов данных. Сегодня вы узнаете, как обрабатывать текст для анализа настроений с помощью NLTK. Существуют и другие библиотеки, такие как CoreNLP, spaCy, PyNLPI и Polyglot. Наиболее широко используются NLTK и spaCy. Spacy хорошо работает с большими объемами информации и для продвинутого НЛП.

Мы собираемся использовать NLTK для анализа настроений, чтобы оценить, посвящена ли публикация в Твиттере Covid-19 или нет. Подробнее о наборах данных, которые мы собираемся использовать, можно прочитать здесь

Первый шаг — установить NLTK в вашей рабочей среде.

pip install nltk

Загрузка данных

Наши наборы данных имеют три функции: идентификатор, текст и цель, где идентификатор просто индексирует каждый твит, текст — это твит, который необходимо классифицировать, а цель — это метка твита, где 1 означает твит с содержанием Covid и 0 твитов без Covid содержание.

import pandas as pd
tweets =  pd.read_csv("../data/tweets.csv")
tweets.head()

вывод предварительного просмотра данных

Обзор твитов

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

# %tweet with covid contents
tweets[tweets['target'] == 1 ].loc[8,'text']

# %tweet with non covid contents
tweets[tweets['target'] == 1].loc[1,'text']

Очистка данных

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

Удаление пунктуации

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

# %function to remove punctuation using string library
def remove_punctuation(text):
    '''a function for removing punctuation'''
    translator = str.maketrans('', '', string.punctuation)
    return text.translate(translator)
tweets['text'] = tweets['text'].apply(remove_punctuation)

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

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

tweets['text'] = tweets['text'].apply(lambda x: " ".join(x.lower()  for x in x.split()))

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

Текст может содержать такие слова, как «есть», «был», «когда» и т. д. Мы можем удалить стоп-слова из текста. В НЛП нет универсального списка стоп-слов, однако библиотека NLTK предоставляет список стоп-слов, поэтому здесь мы воспользуемся приведенным ниже фрагментом, чтобы удалить все стоп-слова из текста.

# import nltk
import nltk
# download stopwords using nltk
nltk.download('stopwords')
# remove english stopwords
allstopwords = nltk.corpus.stopwords.words("english")
tweets['text'] = tweets['text'].apply(lambda x: " ".join(i for i in x.split() if i not in allstopwords))

Удаление номеров

Числа или слова, объединенные с числами, очень трудно обработать, вы можете найти предложение со словами, такими как covid-19, software2020 или plan7. Для этого мы должны удалить такие слова, чтобы машины могли их понять. Для нашего случая вот кусок кода для выполнения такой задачи.

def remove_numbers(text):
    '''a function to remove numbers'''
    txt = re.sub(r'\b\d+(?:\.\d+)?\s+', '', text)
    return txt
tweets['text'] = tweets['text'].apply(remove_numbers)

Токенизация

Процесс разбиения текста на более мелкие единицы называется токенами. Если у нас есть предложение, идея состоит в том, чтобы отделить каждое слово и создать словарь таким образом, чтобы мы могли однозначно представлять все слова в списке. Числа, слова и т. д. — все они подпадают под токены. У NLTK есть разные методы для выполнения таких задач. В нашем случае мы будем использовать sent_tokenize для выполнения токенизации.

nltk.download('punkt')
from nltk.tokenize import sent_tokenize
tweets['text'] = sent_tokenize(tweets['text'])

Создание историй и визуализация из твитов

Взгляните на визуализации, чтобы ответить на некоторые вопросы или рассказать такие истории, как

  • Какие самые распространенные слова во всем наборе данных?
  • Каковы наиболее распространенные слова в наборе данных для каждого класса соответственно?
  • Какие тенденции связаны с тем или иным из настроений? Совместимы ли они с чувствами?

Мы будем использовать облако слов для визуализации наших твитов.

# create text from all tweets
all_words = ' '.join([text for text in tweets['text']])
wordcloud = WordCloud(width=900, height=500, random_state=21, max_font_size=110).generate(all_words)
plt.figure(figsize=(15, 7))
plt.imshow(wordcloud, interpolation="bilinear")
plt.axis('off')
plt.show()

Визуализация облака слов для твитов

Слева визуализация облака слов всех твитов, посередине визуализация твитов о Covid и с последней (справа) визуализация твитов с содержанием, не связанным с Covid.

Извлечение признаков и классификация

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

мы собираемся использовать методы NLTK для извлечения признаков

# Extracting word features
def get_words_in_tweets(tweets):
    all = []
    for (words, target) in tweets:
        all.extend(words)
    return all
def get_word_features(wordlist):
    wordlist = nltk.FreqDist(wordlist)
    features = wordlist.keys()
    return features
w_features = get_word_features(get_words_in_tweets(tweets))
def extract_features(document):
    document_words = set(document)
    features = {}
    for word in w_features:
        features['containts(%s)' % word] = (word in document_words)

Затем давайте воспользуемся наивным байесовским классификатором NLTK, чтобы классифицировать извлеченные признаки слова твита.

from nltk.classify import SklearnClassifier
training_set = nltk.classify.apply_features(extract_features,tweets)
classifier = nltk.NaiveBayesClassifier.train(training_set)

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

noncovid_cnt = 0
covid_cnt = 0
for obj in test_nocovid:
    res =  classifier.classify(extract_features(obj.split()))
    if(res == 0):
        noncovid_cnt = noncovid_cnt + 1
for obj in test_covid:
    res =  classifier.classify(extract_features(obj.split()))
    if(res == 1):
        covid_cnt = covid_cnt + 1
print('[Non Covid]: %s/%s '  % (len(test_nocovid),noncovid_cnt))
print('[Covid]: %s/%s '  % (len(test_covid),covid_cnt))

Окончательная модель с NLTK смогла предсказать сбор 530 твитов с содержанием, не связанным с Covid, из 581, что эквивалентно 91%, и 410 твитов с содержанием, не связанным с Covid, из 477, что эквивалентно 85%.

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

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

Связь между нейротехнологиями и обработкой естественного языка (НЛП)

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

Надеюсь, эта статья окажется для вас полезной, делиться — значит заботиться.