Яндекс Карты открывают крупнейший русскоязычный датасет отзывов на организации

в 7:00, , рубрики: machine learning, Алгоритмы, яндекс
Яндекс Карты открывают крупнейший русскоязычный датасет отзывов на организации - 1

Сегодня мы хотим поделиться новостью для всех, кто занимается анализом данных в области лингвистики и машинного обучения. Яндекс выкладывает в открытый доступ крупнейший русскоязычный датасет отзывов об организациях, опубликованных на Яндекс Картах. Это 500 тысяч отзывов со всей России с января по июль 2023 года.

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

Большая роль отзывов в создании продуктов

В сервисах Яндекса пользователи оставляют много оценок и отзывов в самых разных сферах: от товаров и услуг до развлечений. Это облегчает людям выбор, а нам позволяет лучше понимать их потребности и предпочтения, улучшать продукты и разрабатывать новые фичи.

Команда геосервисов Яндекса обрабатывает большой объём контента от пользователей про организации: отзывы, оценки, фотографии и даже видео. Это позволяет решать как минимум две ключевые задачи пользователей Карт: поиск и выбор мест.

Для поиска релевантных результатов по запросу «Где поесть вкусный борщ» нам нужно знать достаточно много информации об организациях рядом. Часть её хранится в справочнике — каталоге знаний, в котором содержатся фактические данные об организации (адрес, тип организации, режим работы и многое другое). Но чтобы дать по‑настоящему хороший ответ, мы также должны понимать, что в заведении посетители хорошо оценивают именно борщ. На этот вопрос мы можем ответить благодаря отзывам и оценкам посетителей ресторанов, анализируя их содержимое и выделяя ключевые слова.

Второй аспект — выбор места — связан с отображением на карточке организации самой полезной информации в контексте текущей задачи. Здесь можно выделить несколько моментов.

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

Пример отзыва, из которого мы поняли, что в заведении хвалят борщ

Пример отзыва, из которого мы поняли, что в заведении хвалят борщ

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

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

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

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

Особенности датасета организаций

Итак, наш датасет состоит из 500 тысяч записей, собранных с января по июнь 2023 года. В состав датасета входит адрес и название организации, список рубрик (например, кафе, ресторан), оценка пользователя и текст отзыва. Также датасет очищен от персональных данных, которые случайно могли оставить пользователи.

Пример работы с данными датасета

Самым очевидным применением датасета отзывов может быть сентимент‑анализ (статистический подход к определению эмоциональной окраски текста). Лингвистический анализ отзывов помогает понять, как люди говорят о различных типах организаций, какие слова, фразы или языковые конструкции они используют в своих отзывах, и как это изменяется в разных географических контекстах.

В качестве примера разберём, как с использованием этих данных и открытых библиотек для анализа текста можно получить характеристики или аспекты, которые пользователи считают важными при оценке организаций. То есть аналог того, что мы видели выше на примере Яндекс Карт.

Для этого мы будем использовать:

  • библиотеку PyMorphy для морфологического анализа текста, лемматизации и выделения частей речи;

  • метод TF‑IDF анализа, реализованный в модуле библиотеки SciPy для выделения важных слов.

import pymorphy2
import re
import pandas as pd
import nltk
from sklearn.feature_extraction.text import TfidfVectorizer

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

#Инициализируем экземпляр MorphAnalyzer
morph = pymorphy2.MorphAnalyzer(lang='ru')

#Скачаем словарь стоп-слов, который потребуется в функции лемматизации текста
nltk.download('stopwords')
stops = nltk.corpus.stopwords.words('russian')

# Можем также дополнить датасет дополнительными стоп-словами
stops.extend(['что', 'это', 'так', 'вот', 'быть', 'как', 'в', 'к', 'на', 'руб', 'мой', 'твой', 'его', 'её', 'наш', 'ваш', 'их', 'свой', 'еще', 'очень', 'поэтому', 'однако', 'конечно'])
unique_stops = set(stops)

#Объявим функцию для лемматизации текста и выделения частей речи
def extract_nouns(text):
    nouns = []

    #Очищаем текст от лишнего
    clean_text = re.sub(r's+', ' ', re.sub(r'[dW]', ' ', text))

    # Разбиваем текст на слова
    words = clean_text.split()

    for word in words:
        parsed_word = morph.parse(word)[0]

        # Приводим слово к нормальной форме
        normalized_word = parsed_word.normal_form
        if normalized_word not in unique_stops:

            # Определяем часть речи слова
            pos = parsed_word.tag.POS
            case = parsed_word.tag.case
            anim = parsed_word.tag.animacy

            # Выделяем существительные, но отфильтровываем имена собственные
            if pos == 'NOUN' and not (case == 'nomn' and anim == 'anim'):
                nouns.append(normalized_word)

    return ' '.join(nouns)

# Добавим в датасет колонку с обработанным текстом
df = pd.read_csv('reviews.csv')
df['aspects'] = df['text'].apply(extract_nouns)

Теперь мы можем выделить ключевые слова для каждой рубрики с помощью TF‑IDF‑анализа.

#Объявим функцию для обработки текстов и сохранения результата анализа
def find_top_words_by_rubric(vectorizer):

    result = {
        'rubrics': [],
        'words': [],
        'reviews': [],
        'scores': []
    }

    #Проходимся по рубрикам
    for rubric in df_flattened['rubrics'].unique():
        texts = df_flattened[df_flattened['rubrics'] == rubric]['aspects']
        total_count = texts.shape[0]

        # В анализ возьмём только те рубрики, у которых есть несколько текстов
        if total_count >= 5:
            tfidf_matrix = vectorizer.fit_transform(texts)
        else:
            continue

        result['rubrics'].append(rubric)
        result['reviews'].append(total_count)
        feature_names = vectorizer.get_feature_names()
        tfidf_scores = tfidf_matrix.max(axis=0).toarray().ravel()

        # Возьмём топ-20 слов для каждой рубрики
        top_words_indices = tfidf_scores.argsort()[-20:][::-1]
        top_words = [feature_names[i] for i in top_words_indices]
        result['words'].append(', '.join(top_words))
        top_scores = [str(tfidf_scores[i]) for i in top_words_indices]
        result['scores'].append(', '.join(top_scores))

    return result

# Развернём датасет по рубрикам, так как одна организация может принадлежать к списку рубрик
df['rubrics'] = df['rubrics'].apply(lambda x: x.split(";"))
df_flattened = df.explode('rubrics')

# Инициализируем TF-IDF-векторизатор
aspects_vectorizer = TfidfVectorizer(use_idf = True, max_df = 0.8, min_df = 0.1)

# Создадим датафрейм с результатами анализа
tf_idf_aspects = pd.DataFrame(find_top_words_by_rubric(aspects_vectorizer)).sort_values(by='reviews', ascending=False)

В результате мы видим, что выделяются слова, которые неплохо характеризуют рубрику. Например, для магазинов выделяется «ассортимент», для ресторанов — «атмосфера», а для рубрик, связанных с предоставлением услуг, — «мастер».

Пример вывода результатов TF-IDF анализа текстов отзывов в разрезе рубрик

Пример вывода результатов TF-IDF анализа текстов отзывов в разрезе рубрик

Получив важные слова для рубрик, мы можем дальше углублять наше исследование, используя дополнительные данные из датасета:

  • Оценить, какие слова коррелируют с отрицательными или положительными оценками пользователей, разбив тексты по рейтингу.

  • Проанализировать другие части речи: например, понять, какие прилагательные связаны с положительными или отрицательными отзывами на организации.

  • Перейти к анализу биграмм и попробовать понять, как оцениваются отдельные аспекты.

  • Узнать, есть ли какая‑то специфика в описании организаций в контексте географии.


Какие еще знания можно получить из отзывов читайте в недавнем исследовании Яндекса «Как хвалят и ругают рестораны и бары».

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

Чтобы узнать больше о датасете и начать им пользоваться, переходите в наш репозиторий на github.

Автор: Екатерина Каминская

Источник

* - обязательные к заполнению поля


https://ajax.googleapis.com/ajax/libs/jquery/3.4.1/jquery.min.js