Используйте этот важный строительный блок НЛП для проведения анализа «Голос клиента».
Что такое Часть речи?
Часть речи (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 долларов в месяц, что дает вам неограниченный доступ к тысячам статей. Если вы зарегистрируетесь по моей ссылке, я получу небольшую комиссию без каких-либо дополнительных затрат для вас.