Регулярные выражения в Power Query

Задача

У нас есть выгрузка постов с инстаграма. Нужно найти самые популярные хештеги, которые можно найти в описании постов.

iddesc
COrE9jbBy2xSunset waves in #vladivostok and #sunset #sea
CH2bVuthgfxThe event, although extremely destructive, but how beautiful! Whoever you ask, no one remembers that this has ever happened in our city before. #icyrain #vladivostok
CHzhxyuhI-eScary beautiful November #snow #ice #coldrain
CGyazWDBqM4Park «White Lion». Part two. #zoo #safari #seaside #tiger
Таблица 1. Исходные данные

Решение

Если бы мы знали какие хештеги искать, можно было бы справиться условными столбцами. Но поскольку мы этого не знаем, нам нужно как-то вытащить все слова, которые начинаются на символ #.

Для тех кто раньше работал с подобными задачами ответ очевиден — нужно использовать регулярные выражения.
Вот только в Power Query, на момент написания статьи, нет встроенных регулярных выражений. Зато есть несколько способов как их использовать с помощью различных языков программирования.

Способ 1. Javascript

Power Query позволяет использовать Javascript через Web.Page.
Для этого нужно создать функцию fxJavaScript (пустой запрос — вставляем код ниже):

let fx=(txt as text, regex as text, delim as text)=> 
    Web.Page(" var x = '" & txt & "'; 
        var delim = '" & delim & "'; 
        var pattern = /" & regex & "/gi; 
        var result = x.match(pattern).join(delim); 
        document.write(result); ")[Data]{0}[Children]{0}[Children]{1}[Text]{0} in 
    fx

Далее в таблице, в которой нужно найти хештеги, нужно создать столбец «Invoke Custom Function» в котором выбрать нашу функцию fxJavaScript и параметры.
В качестве регулярного выражения — «#[A-Za-zА-Я-а-я]+».
В качестве разделителя — «;»
Функция найдет и выведет в отдельный столбец все найденные хештеги.

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

Далее остается только разбить получившийся столбец по разделителю и применить Unpivot на получившиеся колонки.

Способ 2. Python

На мой взгляд, самый простой способ, но требует настройки окружения. Как именно настроить работу Python для Power BI можно прочитать здесь.

Чтобы выбрать хештеги с помощью Python нам нужно в таблице с исходными данными создать новый столбец с помощью Transform — Run Python Script. И использовать данный код:

dataset['Tags'] = dataset['desc'].str.findall(r'#[a-zа-я0-9]*')

После извлечения данных и чистки мы получим точно такой же результат как и в первом способе.

Способ 3. R

Также как и способ с Python требуется настройка окружения. О ней можно прочитать здесь.

Аналогично способу с Python нам нужно в таблице с исходными данными создать новый столбец с помощью Transform — Run R Script. И использовать следующий код:

output <- dataset
patternTags <- "(^|[^#a-zа-я0-9])[a-zа-я0-9]*"
isHashTags <- function(x) {
    text1 = gsub(patternTags, replacement = "", as.character(x))
    text2 = gsub("#", replacement = ",#", text1)
    gsub("^,", replacement = "", text2)
}
tags <- isHashTags(dataset$desc)
output$tags <- tags

После извлечения получаем такой же столбец как и в предыдущих методах.

Ответ на задачу

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

#vladivostok - 17 (больше половины всех постов содержит данный хештег)
#sea - 13
#ig - 8
#sunset - 8
#russia - 7

А также:
Всего постов: 30
Всего хештегов: 161
Уникальных хештегов: 85

P/S

  1. Код скриптов и регулярных выражений в примерах не является оптимальным и приведен в демонстрационных целях.
  2. Если вы используете автообновление облачной версии отчета через стандартный шлюз (не персональный), то, вероятно, у вас будут проблемы с использованием Python и R.
  3. На гитхабе выложены исходные данные и настроенный pbi файл, если что-то непонятно в статье, можно скачать и посмотреть сам файл.

Ссылка на гитхаб

https://github.com/q-stat-ru/art05_pbi_regexp