Используйте этот важный строительный блок НЛП для проведения анализа «Голос клиента».

Что такое Часть речи?

Часть речи (POS) — это способ описать грамматическую функцию слова. В обработке естественного языка (NLP) POS является важным строительным блоком языковых моделей и интерпретации текста. Хотя теги POS используются в высокоуровневых функциях НЛП, важно понимать их сами по себе, и их можно использовать в полезных целях при анализе текста.

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

Существительное. Существительное – это имя человека, места, предмета или идеи.
Местоимение. Местоимение – это слово, которое используется вместо существительного.
Глагол: глагол выражает действие или существо.
Прилагательное: прилагательное изменяет или описывает существительное или местоимение.
Наречие. Наречие изменяет или описывает глагол, прилагательное или другое наречие.
Предлог. Предлог – это слово, которое ставится перед существительным или местоимением, чтобы сформировать модифицирующую фразу. другое слово в предложении.
Союз: Союз соединяет слова, словосочетания или предложения.
Междометие: Междометие — это слово, используемое для выражения эмоция.
Определитель или артикль: грамматический маркер определенности (the) или неопределенности (a, an). Они не всегда считаются POS, но часто включаются в библиотеки тегов POS.

Основы маркировки POS

Давайте начнем с нескольких простых примеров тегирования POS с помощью трех распространенных библиотек Python: NLTK, TextBlob и Spacy. Мы сделаем абсолютные основы для каждого и сравним результаты.

Начните с импорта всех необходимых библиотек.

import nltk

from textblob import TextBlob
from textblob.taggers import PatternTagger

import spacy

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

  • Пожалуйста, забронируйте мой рейс в Калифорнию
  • Я прочитал очень хорошую книгу

НЛТК

Начнем с самой распространенной библиотеки для НЛП на Python; Natural Language Toolkit или NLTK.

tokenized_sent = nltk.sent_tokenize("Please book my flight to California")
[nltk.pos_tag(nltk.word_tokenize(word)) for word in tokenized_sent]
[[('Please', 'NNP'),
  ('book', 'NN'),
  ('my', 'PRP$'),
  ('flight', 'NN'),
  ('to', 'TO'),
  ('California', 'NNP')]]
tokenized_sent = nltk.sent_tokenize("I read a very good book")
[nltk.pos_tag(nltk.word_tokenize(word)) for word in tokenized_sent]
[[('I', 'PRP'),
  ('read', 'VBP'),
  ('a', 'DT'),
  ('very', 'RB'),
  ('good', 'JJ'),
  ('book', 'NN')]]

Здесь мы замечаем, что по большей части NLTK правильно распознает слово в контексте; однако некоторые ошибки, такие как Пожалуйста, помечены как Существительное собственное (NNP), а книга помечено как Существительное (NN ) в нашем первом предложении, когда оно должно быть глаголом (VB).

Примечание. Список значений тегов см. в разделе Проект Penn Treebank.

TextBlob

Давайте попробуем другую библиотеку под названием TextBlob, которая предоставляет простой API для погружения в стандартные задачи обработки естественного языка (NLP) . Это очень хорошая реализация библиотеки НЛП на языке Python, которая упрощает некоторые распространенные задачи НЛП. Большая часть того, что делает TextBlob, — это обертка NLTK и других популярных библиотек NLP, чтобы упростить их использование.

blob = TextBlob("Please book my flight to California", pos_tagger=PatternTagger())
blob.tags
[('Please', 'VB'),
 ('book', 'NN'),
 ('my', 'PRP$'),
 ('flight', 'NN'),
 ('to', 'TO'),
 ('California', 'NNP')]
blob = TextBlob("I read a very good book", pos_tagger=PatternTagger())
blob.tags
[('I', 'PRP'),
 ('read', 'VB'),
 ('a', 'DT'),
 ('very', 'RB'),
 ('good', 'JJ'),
 ('book', 'NN')]

Обратите внимание на использование PatternTagger при инициализации BLOB-объекта. По умолчанию используется тегировщик NLTK, что дает те же результаты, что и выше. Это позволяет нам попробовать другой POS Tagger и проверить его производительность. Мы видим, что TextBlob правильно идентифицирует Пожалуйста как Глагол на этот раз, но по-прежнему пропускает Книгу как Глагол в первом предложении.

Просторный

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

doc = nlp("Please book my flight to California")
for token in doc:
    print(token.text, token.pos_)
Please INTJ
book VERB
my PRON
flight NOUN
to ADP
California PROPN
doc = nlp("I read a very good book")
for token in doc:
    print(token.text, token.pos_)
I PRON
read VERB
a DET
very ADV
good ADJ
book NOUN

Здесь мы видим, что Spacy правильно пометил все наши слова и идентифицировал Please как междометие, а не как глагол, что является более точным и также идентифицирует Book как глагол в первом предложении.

Каждая из этих библиотек имеет свои плюсы и минусы. Я считаю, что вам следует начать с NLTK, чтобы понять, как это работает, тем более, что в нем так много надежной поддержки различных корпусов. TextBlob отлично подходит, если вам нужна простота в нескольких задачах НЛП, и Spacy, если вам нужна одна из самых надежных библиотек НЛП.

Посмотрите эту замечательную серию NLTK с Python для естественного языка на сайте PythonProgramming.net.

Голос анализа клиентов с частями речи

Одной из наиболее распространенных задач, выполняемых с помощью НЛП, является анализ отзывов клиентов из различных источников и определение того, что клиенты говорят о вашем продукте или услуге. Этот тип анализа называется Voice of Customer Analysis или VOC.

Есть много способов выполнить анализ ЛОС. От Анализ тональности до Тематического моделирования один из методов, который вы можете использовать, — это тегирование частей речи, чтобы сузить о чем говорят клиенты и как они рассказывают о ваших продуктах и ​​услугах.

Текст для вашего анализа может быть получен из ответов на опросы, запросов в службу поддержки, комментариев Facebook, твитов, разговоров в чатах, электронных писем, расшифровок звонков и онлайн-отзывов. Допустим, у вас есть коллекция отзывов клиентов. Одна из вещей, которую вы, возможно, захотите определить, — это все продукты, о которых говорят люди. У вас может быть идеальная категоризация ваших продуктов в базе данных, но что, если у вас нет нужного вам уровня детализации? В этом примере мы будем использовать набор данных Обзоры женской одежды для электронной коммерции на Kaggle.

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

def pos_tag(text):
    df = pd.DataFrame(columns = ['WORD', 'POS'])
    doc = nlp(text)
    for token in doc:
        df = df.append({'WORD': token.text, 'POS': token.pos_}, ignore_index=True)
    return df

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

# Take a random sample of reviews
df2 = df.sample(10000, random_state=42).copy()
# Create an empty dataframe to store the results
df_pos = pd.DataFrame(columns = ['WORD', 'POS'])
# Iterate through the reviews and append each POS tag to the dataframe
df_pos = pos_tag(df2['Review Text'].to_string())
df_pos.shape
(144498, 2)

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

df_top_pos = df_pos.groupby('POS')['POS'].count().\
    reset_index(name='count').sort_values(['count'],ascending=False).head(15)

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

df_nn = df_pos[df_pos['POS'] == 'NOUN'].copy()
df_nn.groupby('WORD')['WORD'].count().reset_index(name='count').\
    sort_values(['count'], ascending=False).head(10)
         WORD  COUNT
667     dress   1779
2062      top   1176
1764    shirt    463
1971  sweater    437
453     color    383
1807     size    312
765    fabric    287
1922    store    274
1822    skirt    256
1416    pants    246

Посмотри на это! У нас есть 15 самых популярных слов, используемых в этом подмножестве обзоров, и большинство из них выглядят как категории продуктов. Что, если теперь мы посмотрим на самые популярные прилагательные для одного и того же подмножества отзывов?

df_adj = df_pos[df_pos['POS'] == 'ADJ'].copy()
df_adj.groupby('WORD')['WORD'].count().reset_index(name='count').\
    sort_values(['count'], ascending=False).head(15)
            WORD  COUNT
400        great    481
144    beautiful    405
248         cute    398
784         soft    321
218  comfortable    272
632      perfect    243
585         nice    196
776        small    176
41         Great    149
666       pretty    146
394     gorgeous    144
511       little    142
611        other    142
523       lovely    125
349   flattering    122

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

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

Весь код для этого анализа доступен на GitHub.

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

Рекомендации

Часть речи в Википедии

Каковы применения тегов в НЛП?

Восемь частей речи