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

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

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

LDA - это широко используемый алгоритм для поиска темы. Тем не менее, по моему опыту, LDA может выдать некоторые трудные для понимания тематические группы. Другим подходом может быть кластеризация на основе векторов tf-idf, но поскольку Word2Vec и Doc2Vec показали отличные результаты в сцене обработки естественного языка, мы решили попробовать их просто для удовольствия.

Word2Vec - это неконтролируемый алгоритм, разработанный Google, который пытается изучить значимые векторные представления слов из набора данных текста. Это делается на основе гипотезы распределения, которая гласит, что слова, встречающиеся в одном контексте, вероятно, имеют одинаковое значение.
С этими векторами слов можно делать интересные вещи, например выполнять следующий расчет вектора: Король - Мужчина + Женщина даст вам вектор, очень близкий к вектору слов Королевы. Если хотите попробовать сами, можете сделать это здесь. Кроме того, Google предоставил здесь предварительно обученную модель Word2Vec. Doc2Vec (также называемый векторами абзацев) - это расширение Word2Vec, которое изучает значение документов, а не слов.

Эта статья показывает, что при совместном обучении Word2Vec и Doc2Vec вектор документов размещается рядом со словами, описывающими тематику этих документов. Это дало нам следующую идею: что, если мы сгруппируем документы, возьмем среднее значение этих кластеров и посмотрим на слова, похожие на векторное представление этих средств? Возможно, это даст нам несколько слов, описывающих кластеры.

Мы начали с совместного обучения Doc2Vec и Word2Vec на наборе данных, предоставленном KPMG и Owlin, с использованием библиотеки Python Gensim. Этот набор данных содержал около 100 тысяч новостных статей за последние 200 дней. Поскольку в нем было много дубликатов, нам пришлось сначала удалить их. Кроме того, мы также удалили специальные символы и URL-адреса и сделали все в нижнем регистре перед обучением, чтобы убрать шум.

После обучения мы взяли новостные статьи за последние 3 дня и получили векторное представление тех, которые использовали обученную модель Doc2Vec. Затем мы использовали алгоритм K-средних (из библиотеки Python nltk) для кластеризации векторов. Поскольку подобие обычно измеряется с помощью косинусного расстояния, мы использовали косинусное расстояние вместо евклидова расстояния.

Это дало нам отличные результаты. Вот некоторые примеры созданных им кластеров:

  • Трамп уволил директора ФБР Джеймса Коми
  • Выпуск телефона Samsung Z4
  • Распространение программы-вымогателя WannaCry
  • Wannacry поражает множество больниц
  • Microsoft выпускает патч для Windows XP

Что было интересно, так это то, что он поместил статьи о кейлоггере в ноутбуках HP в кластер со статьями о выпуске смартфона Samsung. Может быть, стало известно, что обе компании разрабатывают потребительское оборудование? Кроме того, было создано несколько кластеров о WannaCry: один о его распространении, один о том, что он поразил множество больниц, и третий о выпуске исправления для Windows XP Microsoft.

К сожалению, наша идея об использовании Word2Vec для суммирования кластеров не сработала. Он произвел слова, которые вообще не суммировали кластеры. Вместо этого мы попробовали гораздо более простой подход: мы взяли все заголовки в кластере, удалили стоп-слова и цифры и подсчитали количество вхождений каждого слова. Затем мы выбрали 5 наиболее часто встречающихся слов в кластере в качестве ключевых слов для этого кластера. Этот подход сработал на удивление хорошо.
Вот несколько примеров:

  • samsung, tizen, android, hp, z4
  • трамп, коми, фбр, wikileaks, президент
  • программы-вымогатели, атака, вредоносное ПО, wannacry, атаки
  • вымогатели, атаки, страны, больницы, хит
  • рынок, безопасность, отчет, глобальный, исследование

В итоге мы создали модель, которая смогла сгруппировать похожие статьи с помощью Doc2Vec и сгенерировать ключевые слова, описывающие содержимое этих кластеров, менее чем за 24 часа. Мы разместили наш код на Github здесь, так что вы можете поиграть с ним сами. Кластеры, сгенерированные им за выходные, можно найти в этом файле JSON.