Часть I. Получение и визуализация иерархий.

Введение

Данные, данные везде! В компании, в которой я работаю *, которая называется просто U, мы хотим знать, как другие компании внедряют новые технологии и какие. Для этого мы находимся под огромным потоком неструктурированных данных: текстов, содержащих много информации, которую мы считаем полезной, но не сразу пригодной для использования человеком, когда они поступают в огромных количествах. Вот почему нам необходимо извлекать информацию из текстов способом, полезным для дальнейшей алгоритмической обработки, а обработка естественного языка обеспечивает необходимую основу для решения этой проблемы.

Такие модели, как word2vec и gloVe, позволяют изучать вложения слов на основе информации об их совместном появлении и дают необыкновенные результаты. Но часто нам нужно знать не только о совпадении слов, но и о более широких предметах. При изучении вариантов достижения этой цели мне пришла в голову мысль. «Почему бы не воспользоваться обширным хранилищем знаний, которое легко доступно в Викиданных?» В конце концов, как только мы «узнаем», что «означает» данное слово, мы можем расширить его значение, добавив соответствующие свойства из базы знаний Викиданных. Действительно, Викиданные не только предоставляют буквальное выражение слова, но также и всю информацию, связанную с соответствующим объектом и его связями с другими объектами.

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

  1. Чтобы извлечь все элементы в древовидной структуре Викиданных с заданным корнем - (В двух прогонах я использовал 2 корня: Компьютерные науки и Программное обеспечение. Визуальную интерпретацию результатов можно увидеть здесь и здесь соответственно).
  2. Чтобы создать таблицу со всеми свойствами, которые я считаю подходящими - (Результаты для Информатика и Программное обеспечение можно увидеть здесь и здесь.

ПРИМЕЧАНИЕ. Код, используемый в последующем блокноте Jupyter, и класс за ним выпущены на Github под лицензией MIT. Не стесняйтесь экспериментировать.

С момента зарождения проекта Викиданных я был горячим сторонником его развития. Меня всегда восхищал его идеал, заключающийся в том, чтобы создать абстрактное представление всех знаний фонда Викимедиа (все языковые версии Википедии, Викимедиа и, в будущем, Викисловаря) в единой базе данных и предоставить эту колоссальную базу данных. хранилище знаний в общественное достояние. Викиданные также позволяют вам получить доступ к базе данных через ее конечную точку SparQL и, если хотите, загрузить весь дамп (›125 ГБ) в виде файла json и обрабатывать его локально на вашем компьютере. Последний подход требует больших вычислительных ресурсов и не требует дополнительных затрат.

Размер этой базы знаний также вызывает восхищение - в отличие от DBpedia, которая раньше была справочником для структурированных знаний, которая по состоянию на июль 2017 года насчитывала ~ 4,5 миллиона записей, Викиданные имеют гораздо больший объем, в настоящее время всего около 26. миллион записей.

Таким образом, Викиданные представляют собой базу знаний, модель которой можно кратко описать следующим образом: база состоит из сущностей, у которых есть отпечаток пальца (метка на нескольких языках; описания на нескольких языках; псевдонимы) и утверждения. База имеет структуру графа, что означает, что каждая запись (идентификатор, начинающийся с Q) связана с другими записями через свойства (идентификатор, начинающийся с P). Праймер по модели данных Викиданных можно найти здесь.

Чтобы представить некоторый контекст этой модели, вот образец подграфа, соединяющий «программное обеспечение» и «Ubuntu» и демонстрирующий свойства «Ubuntu»:

В итоге:

  1. Все объекты имеют уникальный идентификатор: «программное обеспечение» - Q7397.
  2. Объекты связаны с другими объектами посредством свойства. Свойства также идентифицируются уникальным образом. instance of является собственностью P31. Таким образом, «Ubuntu (Q381) является экземпляром операционной системы (Q9135)» означает, что элемент {"id": "Q381",…} будет иметь утверждение P31, связывающее его с Q9135.

II. Получение информации

Как я уже сказал, моя цель - получить все возможные программные технологии, существующие в Викиданных. Для этого я начну с заданного узла (например, Q7397: программное обеспечение) и рекурсивно исследую все подузлы. Обратите внимание, что в рекурсивном вызове нет ограничения глубины, кроме встроенного ограничения в python. Поскольку граф не обязательно является деревом (дерево - это граф без циклов), что приведет к бесконечному циклу повторения, по соглашению я решил остановить исследование графа, если узел уже посещен текущий путь. Конкретный путь, который рекурсивная функция использует для достижения конечного узла, также может представлять интерес: например, может быть полезно знать, что для перехода от программного обеспечения к C ++ нужно пройти один путь. проходит через узел Объектно-ориентированный язык программирования. Это полезно, если, например, нужно подсчитать все упоминания _any_ OOPL в документе.)

Кроме того, в зависимости от приложения, мы можем запретить рекурсивной функции исследовать узлы за пределами области действия данного приложения. Этого можно достичь с помощью параметра forbiddenparameter, который принимает список узлов, которые нужно игнорировать. (В нашем примере мы не исследуем Q28923 = Диаграмма и Q7889 = Видеоигра, поскольку эти узлы находятся вне нашей области.)

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

III. Вывод

Давайте закончим примером и посмотрим на информацию, которую мы извлекли для scikit-learn из файла ComputerScienceTable.xlsx.

В строке 18 мы обнаруживаем, что для достижения "scikit-learn" мы прошли узлы Компьютерные науки и машинное обучение, и его французское описание librairie Python d'apprentissage statistique, псевдонимы: scikits.learn, sklearn и scikit, последняя версия 0.18.1 выпущен 15 ноября 2016 года, это экземпляр библиотеки, библиотеки Python и машинного обучения. , что он написан на Python, Cython, C и C ++, выпущен под лицензия BSD, вы можете найти ее на github по адресу https://github.com/scikit-learn/scikit-learn. Все это значимая информация о scikit-learn, которую вы можете использовать для расширения текстовых данных. Этот подход также может иметь потенциальное применение в активном обучении, где он может помочь увеличить размер корпуса за счет обнаружения новых примеров для обучающего набора. Не стесняйтесь играть с файлами и записными книжками, предоставленными в этом посте, и комментировать, если сочтете это полезным.

В дальнейшем я предоставлю пример использования этого подхода. Быть в курсе!

Благодарности: за помощь с этой публикацией и за проделанную работу я хотел бы поблагодарить Кари Бхимайя, Ари Баджо Рувинен и Гуангуань Чжан.

* Заявление об ограничении ответственности: мысли, изложенные здесь, являются моим личным мнением и не представляют моего работодателя U.

Найдите меня в LinkedIn: https://www.linkedin.com/in/petar-todorov-ph-d-13326949/