Недавно у меня появилась возможность пройти стажировку в UST Software (India) Pvt. Ltd. Это был замечательный опыт, и я многому научился. Во время стажировки моей команде был поручен проект «Анализ настроений в Twitter», но основная часть нашего проекта заключалась в анализе пространственных данных, а также в их визуализации.
В этом блоге я расскажу о подходах, которым мы следовали, а также о проблемах, с которыми мы столкнулись при этом. Если вы хотите присоединиться к нашему проекту, вы можете просмотреть код на Github, щелкнув следующую ссылку.
Я также поделился своим опытом в видео на Youtube, и если вы хотите продолжить, вы можете нажать на эту ссылку.
Методология
Оглядываясь назад на наши подходы, мы в основном столкнулись с двумя разными подходами, которые дали нам одинаковые результаты при использовании разных технологических стеков.
В нашем первом подходе мы продолжили сбор данных Twitter с помощью tweepy и использовали mysql для хранения данных. Затем использовали текстовый blob и nltk для предварительной обработки и анализа настроений, который дал нам два свойства - полярность (+ ve / -ve) и субъективность эмоции. И, наконец, использовались графически для визуализации данных.
Результат нашего первого подхода выглядел как следующие изображения. Мы следовали подходу из действительно отличной статьи о среде, и ссылка на этот код на github находится здесь.
Мы решили завершить наш проект вторым подходом, поскольку анализ настроений Vader лучше работает с текстами из социальных сетей и в целом. Также база данных MongoDB лучше работает с данными, с которыми мы имели дело.
В нашем втором подходе (который мы позже доработали) мы собирали и сохраняли данные Twitter в экземпляре MongoDB. Затем мы использовали VADER (Словарь Валентности для рассуждений о настроениях) для анализа тональности текста, который чувствителен как к противоречиям (+ ve / -ve), так и к силе эмоции текста. Анализ настроений VADER зависит от словаря, который рисует лексические атрибуты интенсивности эмоций, известные как оценка настроения. Затем мы получаем оценку настроения для каждого местоположения (страны), и, наконец, мы будем использовать тире и matplotlib для интерактивной визуализации данных.
Сбор данных
Изначально мы думали об использовании параметра геокодирования в API поиска в Twitter. Он передает широту и долготу, а также радиус и возвращает твиты в этом регионе. Однако мы обнаружили, что это не очень оптимальный результат, потому что менее 0,85% твитов имеют геотеги. Когда мы загрузили потоковые данные около 11700 твитов, только около 35 твитов были помечены геотегами.
Следовательно, мы записали местоположение пользователя, а не местоположение фактического твита. Это привело к гораздо большему количеству подходящих твитов, однако они по-прежнему содержали мусорные значения.
Теперь возникла другая проблема: местоположение, в которое входят пользователи, не было стандартизировано. Кто-то написал название страны, кто-то пошел по названию своего города. Хотя были люди, которые написали название галактики.
Чтобы обойти эту проблему, мы использовали модуль под названием pycountry. uПосле составления списка всех названий стран - они включают двух- и трехбуквенные коды для каждой страны, как в поле местоположения, многие пользователи вводят США для Соединенных Штатов Америки или IN для Индии. Нам нужно убедиться, что вся Индия, IN и IND едут в одну и ту же страну. Вот логика для этого.
if i in listofcountries: if (len(i) == 2): country = pycountry.countries.get(alpha_2=i.upper()) i = puncremover(country.name.lower()) elif(len(i) == 3): country = pycountry.countries.get(alpha_3=i.upper()) i = puncremover(country.name.lower()) collection = db[i] # print(i, status.text) try: collection.insert_one(status._json) except Exception as e: print(e) pass
Функция puncremover - это функция, которая удаляет знаки препинания из названия страны, если таковая имеется, и стандартизирует ее.
punc = '''!-[]{};:'"\,<>./?@#$%^&*_~''' def puncremover(test_str): for ele in test_str: if ele in punc: test_str = test_str.replace(ele, "") return test_str
Наконец, после всей предварительной обработки мы вставляем твиты в нашу базу данных MongoDb.
Анализ настроений и визуализация
Мы просто перебираем все коллекции и проводим анализ на основе лексики с помощью VADER. Работает очень быстро даже со всей коллекцией и документами.
Затем, наконец, мы используем модули панели инструментов Python для создания панели инструментов, которая в основном создает визуальные эффекты для сюжетного графика, который совместим с панелью инструментов. Итак, мы получили конечный результат.
fig = px.choropleth(df, geojson=countries, locations='country code', color='score', color_continuous_scale="sunset", range_color=(0, 1), scope="world", labels={'score':'sentiment score'}, projection="orthographic", hover_data=["number of tweets","country name"] ) fig.update_layout(margin={"r":0,"t":0,"l":0,"b":0}) fig.show()
Вот пример вывода, который мы получили после выполнения вышеуказанного кода.
topics = Untitled.topics app = dash.Dash() app.layout = html.Div([ html.H2("Sentiment Analysis"), html.Div( [ dcc.Dropdown( id="Topics", options=[{ 'label': i, 'value': i } for i in topics], value='All Topics'), ], style={'width': '25%', 'display': 'inline-block'}), dcc.Graph(id='funnel-graph'), ]) @app.callback( dash.dependencies.Output('funnel-graph', 'figure'), [dash.dependencies.Input('Topics', 'value')]) def update_graph(Topics): if Topics in topics: df_plot = Untitled.databases[Topics] else: df_plot = Untitled.databases['coronavirus_covid'] pv = pd.pivot_table( df_plot, index=['country'], ) trace1 = go.Bar(x=pv.index, y=pv['positive'], name='Positive') trace2 = go.Bar(x=pv.index, y=pv['neutral'], name='Neutral') trace3 = go.Bar(x=pv.index, y=pv['negative'], name='Negative') return { 'data': [trace1, trace2, trace3], 'layout': go.Layout( title='Sentiments for {}'.format(Topics), barmode='stack') } if __name__ == '__main__': app.run_server(debug=True)
После успешного выполнения вышеуказанного кода мы получили следующий результат.
Спасибо, что прочитали эту статью, и, надеюсь, вы получили некоторые положительные выводы из моего опыта. Вы можете прокомментировать мою статью, если у вас возникнут какие-либо отзывы или сомнения по поводу этой статьи, и я обязательно отвечу вам.