ABC анализ, мешок слов с помощью MyStem

15-09-2019
В статье мы рассматриваем возможность проведения ABC анализа, построения мешка слов с помощью программы MyStem. Статья не является руководством или обучающим материалом так как не описываем полностью весь процесс, а охыватыет только несколько ключевых моментов. R установлен на сервере Ubunta.
Используем
  • Программа Яндекса MyStem умеет строить гипотетические разборы для множества слов — включая те слова, которых нет в словаре;
  • R среда для статистических расчетов;
  • Bigquey - это облачная база данных;
  • Power BI - построение интерактивных отчетов
Последовательность действий:
  • Выгружаем данные в R с помощью пакета Алексея Селезнева RYM из Метрики;
  • Обрабатываем данные по ключевым словам (убираем спец символы, лишние пробелы) с помощью базовых функций R и дополнительного пакета по работе с текстом stringr;
  • Приводим ключевые слова к одной лемме;
  • Выгружаем данные в БД;
  • Забираем данные из БД в Power BI;
  • На основе выгруженных данных делаем интерактивный отчет
Используем
Для работы с API совместимы с Core API Google Analytics rym_get_ga
  • dimensions = "ga:date, ga:userAgeBracket, ga:userGender, ga:deviceCategory, ga:interestAffinityCategory, ga:city, ga:pageDepth, ga:keyword, ga:sourceMedium, ga:adContent"
  • metrics = "ga:users, ga:sessions, ga:bounces, ga:pageviews, ga:goal<222111444>Completions, ga:goal<11223344>Completions"
Обработка данных из Метрики
# Обрабатываем данные, приводим названия столцов к читаемому виду, добавляем столбец с индексом
names(ga.api.stat) <- str_remove_all(names(ga.api.stat), pattern = "ga\\:")                      
# Убираем из названий столбцов ga:
ga.api.stat$keyword <- stringr::str_replace_all(ga.api.stat$keyword, pattern = "[:punct:]", " ") 
# удаляем все знаки пунктуации
ga.api.stat$keyword <- stringr::str_replace_all(ga.api.stat$keyword, pattern = "\\+", " ")       
# удаляем +
ga.api.stat$keyword <- stringr::str_squish(ga.api.stat$keyword)                                  
# Удаление лишних пробелов
ga.api.stat$keyword <- stringr::str_trim(ga.api.stat$keyword, side = c("both"))                  
# Удаление лишних пробелов по краям
ga.api.stat$keyword <- stringr::str_to_lower(ga.api.stat$keyword)                                
# перевод в нижний регистр
metrika_ga <- ga.api.stat                                                                        
# Перезаписываем таблицу
metrika_ga <- as.data.table(metrika_ga)                                                          
# Переводим в формат data.table
setkey(metrika_ga, keyword)                                                                      
# key(metrika_ga) - проверить какие столбцы ключевые
metrika_ga <- metrika_ga[.("keyword"), keyword := NA]                                            
# присваиваем всем значениям (keyword) и keyword - NA
setkey(metrika_ga, keyword)                                                                      
# key(metrika_ga) - проверить какие столбцы ключевые
metrika_ga <- na.omit(metrika_ga)                                                                
# удаляем все строчки с NA
metrika_ga[, date := lubridate::ymd(date)]                                                       
# Переводим дату в формат год-месяц-день

Создаем функцию обработки "--"
# Функция замены "--" на "0" 
change_symbol <- function(x) { 
ifelse (x == "--", 0, x) 
} 


Обрабатываем таблицу созданной функцией
metrika_ga <- lapply(metrika_ga, as.character) 
# Переводим все колонки к типу character
metrika_ga <- lapply(metrika_ga, change_symbol) 
# заменяем "--" на "0" 
metrika_ga <- as.data.frame(metrika_ga) 
# сохраняем объект как дата фрейм 

Обрабатываем КФ в программе MyStem
keywords <- metrika_ga[,.(kw = keyword)]
# Выделяем столбец с ключевыми фразами 
dirpath <- "~/Clients/keyword_text"
write.table(keywords$kw, file.path(dirpath, "kw.txt") )  
# выгружаем все запросы из Метрики в файл kw.txt                                         
system("~/MyStem/mystem  -w -l -d -c -e utf-8 ~/Clients/keyword_text/kw.txt ~/Clients/keyword_text/output.txt")
# Приводим все запросы к одной лемме
output <- read.csv("~/Clients/keyword_text/output.txt", sep = " ", stringsAsFactors = F)
colnames(output) <- "keywords"
output$keywords <- stringr::str_remove_all(output$keywords, "\\?")                       
 # Убираем знаки вопроса
output$keywords <- stringr::str_remove_all(output$keywords, "\\{")                        
# Убираем фигурные скобки
output$keywords <- stringr::str_remove_all(output$keywords, "\\}")                        
# Убираем фигурные скобки
output$keywords <- stringr::str_replace_all(output$keywords, pattern = "резкий", "резка") 
# Резка была приведена к лемме "резкий", возвращаем обратно
output$keywords <- stringr::str_replace_all(output$keywords, pattern = "гибкий", "гибка") 
# Гибка была приведена к лемме "гибкий", возвращаем обратно
output$ind <- (1:length(output$keywords))                                                
 # делаем индексную колонку
metrika_ga <- merge(metrika_ga, output, by = "ind")                                       
# соединяем таблицу с леммами с основной
metrika_ga <- tidyr::separate_rows(metrika_ga, keywords, sep = " ")                       
# разбиваем таблицу по ключевым фразам

Опции MyStem
Опции надо указывать по правилам UNIX - до имен файлов, при этом можно склеивать, комбинировать, и т.д.
  • -n Построчный режим; каждое слово печатается на новой строке;
  • -c Копировать весь ввод на вывод. То есть, не только слова, но и межсловные промежутки. Опция необходима для возврата к полному представлению текста;
  • В случае построчного вывода (когда задана опция n) межсловные промежутки вытягиваются в одну строку, символы перевода строки заменяются на \r и/или \n;
  • Пробел для большей видимости заменяется на подчеркивание. Символ \ заменяется на \\, подчеркивание на \_. Таким образом можно однозначно восстановить исходный текст;
  • -w Печатать только словарные слова;
  • -l Не печатать исходные словоформы, только леммы и граммемы;
  • -i Печатать грамматическую информацию, расшифровка ниже;
  • -g Склеивать информацию словоформ при одной лемме (только при включенной опции -i);
  • -s Печатать маркер конца предложения (только при включенной опции -c);
  • -e Кодировка ввода/вывода. Возможные варианты: cp866, cp1251, koi8-r, utf-8 (по умолчанию);
  • -d Применить контекстное снятие омонимии;
  • --eng-gr Печатать английские обозначения граммем;
  • --filter-gram Строить разборы только с указанными граммемами;
  • --fixlist Использовать файл с пользовательским словарём;
  • --format Формат вывода. Возможные варианты: text, xml, json. Значение по умолчанию — text;
  • --generate-all Генерировать все возможные гипотезы для несловарных слов;
  • --weight Печатать бесконтекстную вероятность леммы

    Выгружаем данные в BigQuery
    # Выгружаем данные в BigQuery
    insert_upload_job("bigquery_data", "clients", "metrika_ga", metrika_ga, "bigquery_data", create_disposition = "CREATE_IF_NEEDED", write_disposition = "WRITE_TRUNCATE")
    Sys.time()       

    Пример отчета
    Можно связывать данные по частотности употребление слов в КФ с конверсиями, частотой употребления и т.д. выстраивая нужные данные и делая на их основе выводы. Приведенный пример просто показывает как это может выглядеть в отчете. Мешок слов выстраиваем в Power BI с помощью Word Cloud из маркетплейса Power BI Visuals