Футы, рамы, инстаграммы, Стулья, Бендер, вольный найм, В рамках выбранной программы - Дальше изучаем KNIME! И снова здравствуйте!  Данная статья является следующей в цикле статей про оперативную аналитику данных, начатую здесь: https://habr.com/ru/company/stc_spb/blog/594483/. В KNIME имеется множество ознакомительных примеров, позволяющих пользователю получить представление о принципе обработки данных того или иного типа. Доступ к этим примерам можно осуществить в окне KNIME Explorer. Но их реально много! Когда я просматривал их, с целью выбрать интересный вариант для рассмотрения в  очередной статье нашего цикла, я подумал, что уже сейчас и могу начать практическую часть изложения. То есть, для выбора темы – давайте-ка с вами иначнем препарировать KNIME средствами KNIME. Это будет  уроборос «оперативной аналитики данных», причем в конкретных прикладных целях. Итак, в KNIME нам доступен приведенный слева набор тем обучающих примеров. Этот же список доступен на хабе KNIME, по адресу https://hub.knime.com/knime/spaces/Examples/latest/. Сформулирую себе задачу так: «Для выбора темы следующей статьи я хочу получить полный список всех примеров, которые есть для KNIME, с описаниями, блэкджеком, и…»… эээ… ну, достаточно. Сначала в KNIME создается проект, workflow, в котором уже размещаются и настраиваются цепочки узлов-компонентов. Для доступа к web-странице я буду использовать элемент «Webpage Retriever». Этот элемент позволяет обратиться к интернет ресурсу по указанному адресу и получить соответствующее содержимое. Чтобы разместить его в рабочем поле проекта, я нахожу в репозитории узлов компонент с нужным мне функционалом по названию (для этого могу использовать окно фильтра) и перетаскиваю его на рабочее поле. Для получения оперативной подсказки по выбранному компоненту всегда можно использовать страницу «Description», отображающую контекстную помощь. Доступ к параметрам компонента осуществляется двойным кликом. Основной параметр – адрес страницы. После заполнения, закрываю окно параметров. На каждом узле внизу «светофор». Красный свет – означает, что компонент не настроен или настроен с ошибками. Желтый свет – настроен, но еще не был запущен на обработку данных. Зеленый свет – данные обработаны. Запускаю обработку нажатием клавиши F7 (или нажатием зеленого треугольничка на иконке управления, или через всплывающее меню узла). После считывания проверяю полученный результат. Сделать это можно либо при помощи того же всплывающего меню, либо на специальной странице/вкладке «Node Monitor». Далее надо извлечь необходимое содержимое. Для этого беру компонент XPath, умеющий формировать запросы к структурированным XML-данным и соединяю его вход с выходом первого узла. Открываю диалог настройки и визуально в окне парсера входного содержимого выбираю мышью необходимый мне элемент загруженной страницы, а именно гиперссылку раздела группы тематических примеров. Интерактивно можно выбрать только конкретный элемент исходного представления страницы, поэтому для получения списка таких элементов – вручную редактирую предложенный XPath запрос: /html/body/div/div/div/div/main/section[3]/div/div/table/tbody/tr/td[1]/a/@href Закрываю окно настройки, запускаю обработку данных. После обработки, на выходе получаю список гиперссылок, представляющих соответствующие разделы тематических примеров на сайте KNIME. Состав ссылок в точности соответствует группам, представленным в интерфейсе программы KNIME. Теперь я предполагаю последовательно обработать каждую из полученных ссылок, чтобы сформировать полное дерево примеров. Но сначала, я хочу извлечь названия групп из гиперссылок. Это можно сделать при помощи компонента «Regex Split», при помощи привычных регулярных выражений. Составляю стандартное regex-выражение, в котором скобками выделяю то содержимое, которое меня интересует и запускаю выполнение узла. После выполнения, выходная таблица данных дополняется новым столбцом «split_0» где находятся названия групп. Для обработки ссылок в цикле я делаю управляющий контур при помощи узла «Table Row To Variable Loop Start». Этот компонент поочередно запустит обработку для каждой строки нашей таблицы данных. Очевидно, в составе обработки будет присутствовать уже знакомый компонент получения содержимого www-страницы. Чтобы сообщить KNIME, где кончается цикл – используется узел «Loop End». Именно этот узел, в конечном итоге, соберет все данные, полученные в ходе цикла, в итоговую таблицу. Инициализация цикла производится при помощи пременной, определенной в начальном узле цикла. KNIME по очереди переберет строки начального узла цикла и подставит нужное нам значение переменной туда, куда мы ему укажем при настройке. Сделать это можно, например, на вкладке диалога настройки «Flow Variables». Узел ХPath в цикле настраивается аналогично предыдущему случаю. После настройки – запускаем обработку и смотрим результат. На контрольной вкладке видим, что KNIME извлек 155 строк со вторичными гиперссылками. Причем не все из них нам нужны. Если просмотреть всю таблицу то видно, что некоторые гиперссылки дублируются. В качестве варианта фильтрации, давайте устраним дубликаты при помощи элемента «Duplicate Row Filter». Настройка фильтра простейшая и после его отработки – из 155 строк остаются 144. Отфильтровались гиперссылки «возврата на предыдущую страницу». На следующем шаге получаю таким же образом гиперссылки третьего (и последнего) уровня. Здесь сделаю два небольших отступления. При частом использовании типового набора узлов, можно объединить их в гиперузел и использовать повторно уже в виде собственного компонента. Это также удобно для скрытия на экране крупных схем обработки.  Второе отступление – я заметил, что дублированные «возвраты на предыдущую страницу» - неудобны, когда постоянно выдаются ранее созданной схемой обработки. Поэтому я на этом шаге принял решение вернуться назад и скорректировать схему. А именно: применить другой фильтр – убирающий первую строку результатов цикла. При переделке схемы сбрасываются все данные, начинающиеся с точки разрыва цепочки обработки (загорается желтый светофор). Итак, переделываю, запускаю, жду. Через некоторое время, на оконечном узле загорается зеленый свет и контрольная таблица показывает, что извлечено 679 ссылок на учебные примеры KNIME. Я, кстати, могу посмотреть статистику времени исполнения любого компонента в окне монитора узла. Например, в актуальном случае сообщается, что узел обращения к веб страницы был вызван 141 раз, последнее обращение заняло 219 миллисекунд, а общее время исполнения составило 39 секунд. На этом шаге я получил все оконечные ссылки на учебные примеры с описаниями и теперь можно заняться каждым из примеров персонально. Считываем страницы каждого из 679 примеров и извлекаем оттуда описание примеров. Для доступа к полям структуры, названия и описания примера я использовал парсинг содержимого при помощи различных регулярных и строковых фильтров, которые объединил в общий гипер-узел «String Parser». После запуска парсера, получилась итоговая таблица примеров с описаниями, которую я далее буду использовать для поиска интересных тем для разбора в цикле статей про KNIME. И на этом – почти все. Осталось разобраться с объявленным выше «блэкджеком и …».В качестве этого, посчитаем банальную статистику найденных примеров и запишем все, что мы нашли – в Excel-файл. Для этого используем узлы «GroupBy» и «Excel Writer». Статистика по распределению примеров видна на рисунке, а файл Excel теперьсодержит два листа, с рассчитанной статистикой и описаниями каждого имеющегося в KNIME примера. И вот на этом, эта статья действительно заканчивается. Спасибо за внимание, жду ваших вопросов и комментариев. Продолжение? Следует! Можно визуализировать обрабатываемые данные различными способами. Для этого есть множество встроенных типов диаграмм, которые являются настраиваемыми и даже интерактивными.