Графики - отличный способ кодировать знания предметной области для ваших бизнес-данных. Одна из популярных баз данных для графиков - Neo4j, и я написал несколько сообщений в блогах и видео по этой теме.

Но всегда было проблемой, как мы можем использовать знания, закодированные в графе знаний, для использования в моделях машинного обучения. Этого можно добиться с помощью алгоритма node2vec. Node2vec берет граф и его ребра и кодирует эту информацию графа во вложениях узлов. Я знаю, о чем вы думаете, и вы правы, встраивание узлов основано на слове embeddings и создается с использованием модели skipgram, которая является одним из основных алгоритмов в word2vec и fasttext. Модели скипграммы просты, для каждого целевого слова обучение выполняется с учетом вывода окружающих слов. Предыдущее предложение, конечно же, не дает должного представления о мощности алгоритма, поэтому, пожалуйста, взгляните на прекрасную ссылку ниже.



В связи с этим, если вас интересуют НЛП и fasttext, я работал над книгой по этой теме, которую вы можете купить здесь.



В этом посте мы построим простой график из набора данных объектива фильма, а затем воспользуемся этим графом для построения модели node2vec. Затем мы поймем, как использовать модель для ответа на простые вопросы, основанные на сходстве.

Создать узлы и края

Сначала нам нужно прочитать наборы данных и создать узлы и отношения. Ниже приведен код, в котором мы читаем файл movies.csv и затем создаем BELONGSTO связь между фильмом и его жанрами. Остальную часть кода сборки узла вы можете получить в этой записной книжке.

Давайте посмотрим, как выглядит график. Когда импорт завершится, мы можем открыть браузер Neo4j, затем щелкнуть MovieIdlabel и затем развернуть любой из узлов (или напрямую щелкнуть отношение BELONGS_TO).

Красные узлы - это жанры, а синие узлы - фильмы.

Node2vec

После создания узлов и ребер мы создадим вложения узлов с помощью программы node2vec. Для этого мы создадим файл edgelist, используя приведенный ниже код.

Вы должны иметь возможность запускать node2vec для файлов.

$ ./node2vec -i:graph/movies.edgelist -o:emb/movies.emb -l:80 -d:100 -p:0.3 -dr -v

Понимание приведенной выше команды можно увидеть с помощью команды справки.

$ ./node2vec -h
An algorithmic framework for representational learning on graphs. [Oct 27 2018]
================================================================================
Input graph path (-i:)=graph/karate.edgelist
Output graph path (-o:)=emb/karate.emb
Number of dimensions. Default is 128 (-d:)=128
Length of walk per source. Default is 80 (-l:)=80
Number of walks per source. Default is 10 (-r:)=10
Context size for optimization. Default is 10 (-k:)=10
Number of epochs in SGD. Default is 1 (-e:)=1
Return hyperparameter. Default is 1 (-p:)=1
Inout hyperparameter. Default is 1 (-q:)=1
Verbose output. (-v)=NO
Graph is directed. (-dr)=NO
Graph is weighted. (-w)=NO
Output random walks instead of embeddings. (-ow)=NO

Вы можете скачать и скомпилировать высокопроизводительный пакет node2vec по этой ссылке. Для справки существует также реализация node2vec python, но она невероятно медленная, поэтому не используйте ее.



Формат файла вложений аналогичен тому, что выводит word2vec.

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

➜  head emb/movies.emb
27299 100
260169 -0.0833466 ... -0.00598206
278634 -0.0338385 ... -0.0756388
0 -1.29378 ... -0.093047
270464 -0.161561 ... -0.0193972

Когда вы закончите создавать вложения, вы должны сохранить вложения обратно в график для дальнейшего использования и обновления.

Используйте вложения

Теперь, поскольку вложения имеют формат word2vec, мы можем загрузить их с помощью инструмента моделирования тем gensim. В Gensim есть множество функций, которые мы можем использовать для разных задач. Вот некоторые из методов, которые мы можем использовать:

  • ближе_тем,
  • расстояние,
  • не совпадает,
  • оценивать_слово_аналоги,
  • оценивать_слово_пары,
  • get_keras_embedding,
  • get_vector,
  • most_similar,
  • most_similar_to_given,
  • n_similarity

и так далее. Вы можете получить документацию по методам по ссылке gensim.



В этом случае мы посмотрим, сможем ли мы получить наиболее похожие узлы для данного узла.

Здесь, в этом коде, мы передаем модели идентификатор узла в виде строки. Вывод приведенного выше кода ниже.

[('252573', 0.9870771169662476),  ('276773', 0.984420895576477),  ('260679', 0.9837837219238281),  ('263498', 0.983630895614624),  ('254262', 0.9832301735877991),  ('253096', 0.9815400242805481),  ('274147', 0.981526255607605),  ('263074', 0.9814952611923218),  ('270921', 0.9811148047447205),  ('270035', 0.9809507131576538)]

Таким образом, мы видим, что получаем список похожих узлов. Это отличные новости. Таким образом, мы смогли создать вложения из графа с помощью node2vec, а затем смогли сделать некоторые прогнозы на основе графа.

Теперь вы можете продолжить и реализовать это на своем графике. Конечно, если вы еще не построили граф в своем домене, продолжайте и создайте его.

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

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

Мы передаем фильм «Денежный поезд», и ниже приведены результаты работы функции.

Waco: The Rules of Engagement (1997) 0.9953966736793518
Five Wives, Three Secretaries and Me (1998) 0.9936010837554932
Dark Matter (2007) 0.9935312271118164
Old Man and the Sea, The (1958) 0.9933647513389587
Pop Redemption (2013) 0.9931492805480957
Woman Next Door, The (Femme d'à côté, La) (1981) 0.9930013418197632
Brainstorm (1965) 0.9929700493812561
Suddenly (Tan de Repente) (2002) 0.9929301142692566
Springsteen & I (2013) 0.9922378659248352
Fly Away (Bis zum Horizont, dann links!) (2012) 0.9920598864555359

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

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

Уэйко: Правила взаимодействия: этот документальный фильм о столкновении между ФБР и отделением Давидианцев в 1993 году в Уэйко, штат Техас, представляет альтернативную теорию трагедии. Правительство давно утверждает, что эта маргинальная христианская группа представляет опасность, и что осада ее территории привела к гибели 70 человек.

источник: википедия

Я оставлю это на ваше усмотрение, считаете ли вы результаты хорошими или нет.

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



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

Использованная литература: