Распространенная проблема, с которой сталкиваются фармацевтические компании, - это прогнозирование того, поменяет ли пациент фармацевтические препараты в зависимости от пути к нему. Информация, указывающая на то, что пациенты хотят поменять рецептурные лекарства, может присутствовать в сообщениях в социальных сетях. Анализ настроений пациентов, выраженных в твитах о лекарствах, отпускаемых по рецепту, может быть шагом в правильном направлении для решения этой проблемы.
В этом посте мы извлечем мнение пациентов о некоторых из наиболее назначаемых лекарств в США. Мы рассмотрим 5 из 10 лучших лекарств, назначаемых в США:
- Викодин: препарат, применяемый для снятия умеренной и сильной боли.
- Симвастатин: ингибитор HMG-CoA редуктазы (статин), используемый для снижения риска инсульта и сердечного приступа.
- Лизиноприл: ингибитор ангиотензинпревращающего фермента (АПФ), используемый для снижения высокого кровяного давления и предотвращения почечной недостаточности, вызванной диабетом.
- Липитор: статин, используемый для предотвращения инсульта и сердечного приступа у людей с ишемической болезнью сердца.
- Метформин: препарат, используемый для лечения диабета 2 типа.
Для начала вам необходимо подать заявку на создание учетной записи разработчика Twitter:
После того, как ваша учетная запись разработчика будет одобрена, вам необходимо создать приложение Twitter:
Шаги для подачи заявки на учетную запись разработчика Twitter и создания приложения Twitter описаны здесь.
Мы будем использовать бесплатную библиотеку Python tweepy для доступа к Twitter API. Документацию по tweepy можно найти здесь.
- УСТАНОВКА
Во-первых, убедитесь, что у вас установлен tweepy. Откройте командную строку и введите:
pip install tweepy
2. ИМПОРТ БИБЛИОТЕК
Затем откройте свой любимый редактор и импортируйте библиотеки tweepy и pandas:
import tweepy import pandas as pd
3. АУТЕНТИФИКАЦИЯ
Далее нам понадобится наш ключ потребителя и токен доступа:
Обратите внимание, что сайт предлагает вам хранить свой ключ и токен в секрете! Здесь мы определяем поддельный ключ и токен, но вы должны использовать свой настоящий ключ и токен при создании приложения Twitter, как показано выше:
consumer_key = '5GBi0dCerYpy2jJtkkU3UwqYtgJpRd' consumer_secret = 'Q88B4BDDAX0dCerYy2jJtkkU3UpwqY' access_token = 'X0dCerYpwi0dCerYpwy2jJtkkU3U' access_token_secret = 'kly2pwi0dCerYpjJtdCerYkkU3Um'
Следующим шагом является создание экземпляра OAuthHandler. Мы передаем наш ключ потребителя и токен доступа, которые мы определили выше:
auth = tweepy.OAuthHandler(consumer_key, consumer_secret) auth.set_access_token(access_token, access_token_secret)
Затем мы передаем экземпляр OAuthHandler в метод API:
api = tweepy.API(auth)
4. ЗАПРОСЫ TWITTER API
Затем мы инициализируем списки для полей, которые нам интересно анализировать. На данный момент мы можем посмотреть строки твита, пользователей и время твита. Затем мы пишем цикл for поверх тонкого объекта Cursor. В объекте «Курсор» мы передаем метод «api.search», устанавливаем строку запроса для того, что мы хотим найти, и устанавливаем «count» = 1000, чтобы мы не превышали лимит скорости твиттера. Здесь мы будем искать твиты о викодине, обезболивающем, используемом для лечения умеренной и сильной боли. Мы также используем метод «item ()» для преобразования объекта «Cursor» в итеративный.
Чтобы упростить запрос, мы можем удалить ретвиты и включать только твиты на английском языке. Чтобы понять, что возвращает этот запрос, мы можем также распечатать значения, добавляемые к каждому списку:
twitter_users = [] tweet_time = [] tweet_string = [] for tweet in tweepy.Cursor(api.search,q='Vicodin', count=1000).items(1000): if (not tweet.retweeted) and ('RT @' not in tweet.text): if tweet.lang == "en": twitter_users.append(tweet.user.name) tweet_time.append(tweet.created_at) tweet_string.append(tweet.text) print([tweet.user.name,tweet.created_at,tweet.text])
Также можно посмотреть твиты по Симвастатину:
twitter_users = [] tweet_time = [] tweet_string = [] for tweet in tweepy.Cursor(api.search,q='Simvastatin', count=1000).items(1000): if (not tweet.retweeted) and ('RT @' not in tweet.text): if tweet.lang == "en": twitter_users.append(tweet.user.name) tweet_time.append(tweet.created_at) tweet_string.append(tweet.text) print([tweet.user.name,tweet.created_at,tweet.text])
Для повторного использования мы можем обернуть все это функцией, которая принимает ключевое слово лекарства в качестве входных данных. Мы также можем сохранить результаты в кадре данных и вернуть значение:
def get_related_tweets(key_word): twitter_users = [] tweet_time = [] tweet_string = [] for tweet in tweepy.Cursor(api.search,q=key_word, count=1000).items(1000): if (not tweet.retweeted) and ('RT @' not in tweet.text): if tweet.lang == "en": twitter_users.append(tweet.user.name) tweet_time.append(tweet.created_at) tweet_string.append(tweet.text) print([tweet.user.name,tweet.created_at,tweet.text]) df = pd.DataFrame({'name':twitter_users, 'time': tweet_time, 'tweet': tweet_string}) return df
Когда мы можем вызвать функцию с названием препарата «Лизиноприл», мы получим:
get_related_tweets('Lisinopril')
А для «Липитора»:
get_related_tweets('Lipitor')
Наконец, для «Метформина»:
get_related_tweets('Metformin')
Чтобы получить оценку настроения, нам нужно импортировать пакет Python под названием textblob. Документацию для textblob можно найти здесь. Чтобы установить textblob, откройте командную строку и введите:
pip install textblob
Следующий импорт текстового блока:
from textblob import TextBlob
Мы будем использовать показатель полярности в качестве меры для положительного или отрицательного воздействия. Оценка полярности представляет собой число с плавающей запятой со значениями от -1 до +1.
Например, если мы определяем объект textblob и передаем предложение «Мне нравится мой план медицинского страхования с Aetna», мы должны получить оценку полярности с положительным значением:
sentiment_score = TextBlob(“I love my health insurance plan with Aetna”).sentiment.polarity print("Sentiment Polarity Score:", sentiment_score)
Давайте получим оценку полярности настроений для твитов о Викодине:
df = get_related_tweets("Vicodin") df['sentiment'] = df['tweet'].apply(lambda tweet: TextBlob(tweet).sentiment.polarity) print(df.head()
Мы также можем подсчитать количество положительных и отрицательных настроений:
df_pos = df[df['sentiment'] > 0.0] df_neg = df[df['sentiment'] < 0.0] print("Number of Positive Tweets", len(df_pos)) print("Number of Positive Tweets", len(df_neg))
Опять же, для повторного использования кода мы можем обернуть все это в функцию:
def get_sentiment(key_word): df = get_related_tweets(key_word) df['sentiment'] = df['tweet'].apply(lambda tweet: TextBlob(tweet).sentiment.polarity) df_pos = df[df['sentiment'] > 0.0] df_neg = df[df['sentiment'] < 0.0] print("Number of Positive Tweets about {}".format(key_word), len(df_pos)) print("Number of Negative Tweets about {}".format(key_word), len(df_neg))
Если мы вызовем эту функцию с помощью «Lipitor», мы получим:
get_sentiment(“Lipitor”)
Было бы удобно, если бы мы могли программно визуализировать эти результаты. Давайте импортируем seaborn и matplotlib и изменим нашу функцию get_sentiment:
import seaborn as sns import matplotlib.pyplot as plt def get_sentiment(key_word): df = get_related_tweets(key_word) df['sentiment'] = df['tweet'].apply(lambda tweet: TextBlob(tweet).sentiment.polarity) df_pos = df[df['sentiment'] > 0.0] df_neg = df[df['sentiment'] < 0.0] print("Number of Positive Tweets about {}".format(key_word), len(df_pos)) print("Number of Negative Tweets about {}".format(key_word), len(df_neg)) sns.set() labels = ['Postive', 'Negative'] heights = [len(df_pos), len(df_neg)] plt.bar(labels, heights, color = 'navy') plt.title(key_word) get_sentiment(“Lipitor”)
И результаты для остальных четырех препаратов:
Как видите, у Викодина, Симвастатина, Метформина и Липитора больше положительных эмоций, чем отрицательных, а у Лизиноприла немного больше отрицательных настроений, чем положительных. Я призываю читателя провести такой же анализ других наркотиков и посмотреть, каково общее мнение об этом препарате на основе твитов. Было бы интересно собрать данные за несколько лет, чтобы увидеть, есть ли временная зависимость (сезонность) в оценках настроений для определенных наркотиков. Возможно, я сохраню это для будущего поста!
Спасибо за чтение. Код из этого поста доступен на GitHub. Удачи и удачного машинного обучения!
Примечание редакторам Data Science. Хотя мы разрешаем независимым авторам публиковать статьи в соответствии с нашими правилами и рекомендациями, мы не поддерживаем вклад каждого автора. Не следует полагаться на работы автора без консультации с профессионалами. См. Подробности в наших Условиях для читателей.