ФГБОУ ВО «ПЕТРОЗАВОДСКИЙ ГОСУДАРСТВЕННЫЙ УНИВЕРСИТЕТ»
ИНСТИТУТ МАТЕМАТИКИ И ИНФОРМАЦИОННЫХ ТЕХНОЛОГИЙ
КАФЕДРА ТЕОРИИ ВЕРОЯТНОСТЕЙ И АНАЛИЗА ДАННЫХ
(
подпись соискателя
)
Голубев Андрей Алексеевич
Выпускная квалификационная работа
Исследование периодов мира и войны стран
с помощью SPARQL-запросов
и анализа данных в Python
Направление09.03.02— Информационные системы и технологии
Научный руководитель:
к.т.н., рук.
Лаборатории информационных компьютерных технологий
Институт прикладных математических исследований,
Федеральный исследовательский центр
"Карельский научный центр Российской академии наук"
А. А. Крижановский
__________________
(подпись руководителя)
Петрозаводск — 2018
Введение
3
Глава 1. Инструменты для исследования
1.1 SPARQL
1.2. Python
4
4
7
Глава 2. Определения военного и мирного периодов для страны Х.
8
Глава 3. Поиск военных и мирных периодов стран.
3.1 Получение списков войн стран.
3.2 Получение даты основания стран.
3.3 Выборка данных из полученных файлов
3.4 Построение графиков военных и мирных периодов.
11
11
13
15
16
Глава 4. Анализ зависимостей мирных и военных периодов от значения ε.
19
4.1 Построение графиков зависимостей
19
4.2 Сравнительный анализ графика военных и мирных периодов для России и США.
21
4.3 Сравнительный анализ Twar(ε) и Tpeace(ε) для России и США.
22
Заключение
25
Литература
26
2
Введение
В рамках данной работы будет проведено исследование периодов
мира и войны нескольких стран, основываясь на информацию, которая
храниться в Викиданных.
Викиданные (англ., Wikidata, далее ВД) – это проект фонда Викимедиа,
официально запущенный в октябре 2012, для структурирования данных
Википедии.[1] Это свободная и открытая база знаний. Для хранения
структурированных данных ВД используют следующую модель данных.
Данные описываются парами «свойство-значение», которые можно извлечь
с помощью языка запросов SPARQL. Например, статье в Русской
Википедии о Советско-японской войне соответствует объект Викиданных
«Soviet–Japanese War». Объект «Soviet–Japanese War» имеет свойство
«instance of» («экземпляр») со значением «war» (война). Свойства являются
объектами и имеют собственные страницы в Викиданных с метками и
описаниями. Каждый объект Wikidata идентифицируется уникальным IRI
(например, https://www.wikidata.org/wiki/Q220602 для элемента Q220602,
Soviet–Japanese War).
Целью работы является сравнительный анализ периодов мира и войны
России, США, а также выявление сходств и различий в характере кривых
периодов войны и мира для этих стран.
3
Глава 1. Инструменты для исследования
1.1 SPARQL
SPARQL - это язык запросов для доступа к протоколу RDF,
разработанный рабочей группой W3C RDF Data Access Working Group.[2]
[3]
RDF - стандартная модель обмена данными.
Она
ситуаций,
когда
информация
предназначена для
в Интернете должна обрабатываться
приложениями. Ресурсом в RDF может быть любая сущность — как
информационная (например, изображение), так и не информационная
(например, страна). Утверждение, которое высказывается о ресурсе, имеет
вид «субъект — предикат — объект», называется триплетом (тройкой) и
[4]
образует ориентированный граф.
В графе вершинами являются субъекты и
объекты, а ребра отображают отношения. Таким образом, SPARQL является
языком запросов для сопоставления графов. Большая часть запросов
SPARQL включает набор шаблонов триплетов, который называется
основным
графовым
шаблоном.
Шаблоны
триплетов
похожи
на
RDF-триплеты, за исключением того, что каждый субъект, предикат и
объект может быть переменной, а над переменными могут выполняться
операции конъюнкции и дизъюнкции. Например, N-триплет (N-триплет
предоставляет простой линейный, текстовый способ для разложения графов
RDF
по
частям.)
Советско-японской
войны
(см.
Рис
1),
где
Советско-японская война является субъектом, война - объектом, а частный
случай - это предикат.
4
Рис. 1. N-триплет для Советско-японской войны
SPARQL также поддерживает тестирование расширенного значения и
ограничение запросов посредством исходного RDF-графа. Результаты
запросов SPARQL могут быть представлены результирующими наборами
(results sets) или RDF-графами.
IRI
(сокращение
Интернациональный
от
«International
идентификатор
Resource
ресурса)
-
Identifier»
или
последовательность
символов, которая используются для идентификации ресурсов, таких как
документы, люди, физические объекты и абстрактные понятия. Например,
объекту Викиданных “Советско-японская война” соответствует IRI равный
Q220602 (см. https://www.wikidata.org/wiki/Q220602
).
Программа
(Листинг
1)
демонстрирует
SPARQL-запрос,
позволяющий определить название книги из заданного графа данных.
Запрос состоит из двух частей: условие SELECT задает переменные,
5
которые должны отображаться в результатах запроса, а условие WHERE
предоставляет основной шаблон
, которому должны соответствовать
данные.
Запрос:
#List of battle with 'coordinate location'
#defaultView:Map
SELECT
?battle?battleLabel
?location
WHERE
{
?battlewdt:P31wd:Q178561. #instance of battle
?battlewdt:P625?location#display location
SERVICEwikibase:label{ bd:serviceParamwikibase:language"ru"}
}
Листинг 1: SPARQL-скрипт для получения карты с битвами, имеющими точную
географическую привязку
На рис. 2 представлен результат выполнения скрипта (Листинг 1).
Рис. 2. Карта с 4628 битвами, имеющими точную географическую привязку
6
1.2. Python
Python – это один из наиболее популярных современных языков
программирования.[5] Он пригоден для решения разнообразных задач и
предлагает те же возможности, что и другие языки программирования:
динамичность, поддержку ООП и кросс-платформенность. Язык Python, как
и любой другой язык состоит из двух частей – словаря и синтаксиса.
Синтаксис нужен для формирования выражений, образующих исполняемые
программы, и словарь – это набор функциональности в виде стандартной
библиотеки и подключаемых модулей. Python является языком общего
назначения, поэтому может применяться практически в любой области
разработки ПО и в любой предметной области.
7
Глава 2. Определения военного и мирного периодов
для страны Х.
Мирный период (Tpeace) страны Х (неформальное определение) - это
суммарный период, в который страна X не является участником военных
действий по версии Викиданных.
Мирный период (Tpeaceε) страны X от ε (формальное определение) - это
сумма таких периодов, когда мир в стране Х длится больше значения ε или
равен ε.
Военный период (T
war) страны Х (неформальное определение) - это
суммарный период (день, неделя или год), в который страна Х является
участником военных действий по версии Викиданных.
Военный период (Twarε) страны Х от ε (формальное определение) - это
суммарный период всех войн (битв) для страны Х и мирных периодов,
которые меньше значения меньше ε.
Формальное определение для нахождения мирного периода страны Х
можно представить в виде следующего математического выражения:
Tpeaceε = {UTpeace i : |Tpeace i| ≥ ε}
Ниже на графике (см. Рис. 3) представлен пример зависимости Tpeace
от ε для России. Как можно увидеть, значение ε изменяется от 1 до 10, при
8
этом Tpeace уменьшается от 197 до 192 лет за весь период существования
страны.
Рис. 3. График зависимости периода мира Tpeace(ε) от значения периода ε (1; 10) для
России с 1721 года по 2018 год, с учетом данных о 31 войне , в которых участвовала
Россия
Аналогично
можно
составить математическое выражение для
нахождения военного периода, исходя из формального определения.
Twarε = {(UTwar i )U(|T
| < ε)}
peace i
На графике (см. Рис. 4) можно наблюдать изменения T
war от 101 года
до 106 военных лет при тех же значениях ε.
9
Рис. 4. График зависимости периода войны Twar(ε) от значения периода ε (1; 10) для
России с 1721 года по 2018 год, с учетом данных о 31 войне , в которых участвовала
Россия
10
Глава 3. Поиск военных и мирных периодов
стран.
Для исследования военных и мирных периодов были выбраны
следующие страны:
● Российская империя, СССР, Россия (ниже в тексте эти страны будут
называться как Россия)
● США
3.1 Получение списков войн стран.
Чтобы получить военные периоды были построены SPARQL-скрипты
для каждой страны, которые выводили списки войн с объектами свойств
«warLabel» («название»), «start time» («начало») и «end time» («конец»).
Участие страны в войне определялось по свойству
«participant»
(«участники») у самой войны, где страна является объектом. Ниже приведён
пример для Корейской войны (см. Рис. 5), которая началась 25 июня 1950
года, закончилась 27 июля 1953 года, а также одним из участников является
США.
11
Рис. 5. Изображение с Викиданными о Корейской войне. В красной области находятся
объекты “начало’ и “конец’ войны и их свойства, а в зелёной области объект
“участники” и его свойства.
Пример
SPARQL-скрипта
для
получения
списка
войн
Великобритании можно увидеть на Листинге 2.
#List of wars for the USA
SELECT
?war?warLabel
?start_time?end_timeWHERE{
{ ?war
wdt:
P710
wd
:
Q30
.}
?warwdt:P580?start_time.
12
?warwdt:P582?end_time.
SERVICEwikibase:label{ bd:serviceParamwikibase:language"ru". }
OPTIONAL{ ?warwdt:P585?start_time. }
OPTIONAL{ ?warwdt:P585?end_time. }
{?warwdt:P31wd:Q198
.}
UNION
{?warwdt:P31wd:Q178561.}
}
Листинг 2: SPARQL-скрипт для получения списк войн Великобритании
3.2 Получение даты основания стран.
С помощью SPARQL-скриптов были получены даты основания
необходимых стран. У каждой страны в Викиданных есть свойство
«inception» («начало»), объектом которого является дата основания.
Например, дата основания США - 4 июля 1776 года (см. Рис. 6.).
13
Рис. 6. Изображение с Викиданными о США.
Пример SPARQL-скрипта для получения даты основания США
показан на Листинге 3.
SELECT
?statement
?statementLabel?inception
WHERE
{
wd:Q30p:P571?statement.
?statementps:P571?inception.
SERVICEwikibase:label{ bd:serviceParamwikibase:language
"[AUTO_LANGUAGE],en". }
}
Листинг 3: SPARQL-скрипт для получения даты основания США
14
3.3 Выборка данных из полученных файлов
Результаты SPARQL-скриптов были получены в файлах формата
“.csv”. В дальнейшем исследовании использовался высокоуровневый язык
программирования “Python”.
Файл с данными был открыт с помощью функции “open”, а затем
построчно прочитан в цикле for, и все необходимые данные, а именно годы
войн для страны Х были выбраны и помещены в массив, как показано на
Листинге 4.
with io.open(filepath_RUS_war, "r", newline="", encoding='utf-8') as
file:
#читаем файл целиком
reader = csv.reader(file)
for row in reader:
#получаем 2 столбец start_time
cur_arr1 = row[1].split(',')
#берём строку
str1 = cur_arr1[0]
#получаем первые 4 символа (дату)
dat1 = str1[0:4]
cur_arr2 = row[
2
].split(',')
str2 = cur_arr2[
0
]
dat2 = str2[
0
:
4
]
#записываем в массив
arr1.extend([dat1])
#
print(arr1)
arr2.extend([dat2])
#удаляем первый элемент
del arr1[0]
del arr2[0]
#преобразуем элементы из str в int
for i in range(len(arr1)):
arr1[i] = int
(arr1[i])
for i in range(len(arr2)):
15
arr2[i] = int
(arr2[i])
for i in range(len(arr1)):
#если дата начала и конца битвы совпадают, добавляем дату начала
в новый массив
if arr1[i] == arr2[i] :
arr3.append(arr1[i])
#иначе добавляем каждую дату в интервале начала и конца битвы
else:
arr4.append(arr1[i])
while arr1[i] != arr2[i]:
arr1[i] = arr1[i] + 1
arr4.append(arr1[i])
arr7 = arr4 + arr3
arr7.sort()
print (arr7)
Листинг 4: Код для получения военных периодов России
3.4 Построение графиков военных и мирных периодов.
Для построения графика военных и мирных периодов одной страны в
“Python” необходимы следующие входные данные:
1. Массив с полным периодом существования страны
2. Массив с ежегодным количеством войн. (Если год был мирным, то
количество битв в массиве равно 0)
Для получения массива с полным периодом существования страны
был написан код (Листинг 5), который описывает следующие шаги:
1. Открыт и прочитан файл с датой основания страны
2. Получен год основания страны
3. Получен текущий год с помощью библиотеки “datetime”
4. Создан массив с полным периодом существования этих стран
16
#получаем дату основания
with
open(filepath_RUS_in, "r", newline="") as file:
# читаем файл целиком
reader = csv.reader(file)
for row in reader:
cur_arr3 = row[
0
].split(',')
str3 = cur_arr3[
0
]
dat3 = str3[
0
:
4
]
arr5.extend([dat3])
del arr5[0
]
arr5[
0] =
int
(arr5[
0
])
arr6.append(arr5[0
])
#получаем текущую дату
a = now_date.year
#получаем массив дат, начиная с даты основания до текущей
for i in range(
len
(arr5)):
while arr5[i] != a:
arr5[i] = arr5[i] + 1
arr6.append(arr5[i])
print
(arr6)
#Период существования страны
Tc =
len(arr6)
print
(Tc)
Листинг 5: Код для получения полного периода существования России
Массив с ежегодным количеством войн является результатом кода,
который представлен на Листинге 6.
#Получаем массив с ежегодным количеством битв
for j in range(
len
(arr6)):
a = 0;
for i in range(len(arr7)):
if arr6[j] == arr7[i]:
a = a +
1
arr8.append(a)
print
(arr8)
for i in range(
len
(arr8)):
if arr8[i] == 0:
arr13.append(arr8[i])
else:
17
arr13.append(
None
)
Листинг 6: Код для получения количества войн по годам, в которых участвовала Россия
По данным двух полученных массивов получается график периодов
мира и войны для России (см. Рис. 7.). На графике зелеными линиями
обозначены периоды мира, а красными “горками” периоды войны.
Рис. 7. График периодов мира и войны для России с 1721 года по 2018 год, с учетом
данных о 31 войне , в которых участвовала Россия
18
Глава 4. Анализ зависимостей мирных и военных
периодов от значения ε.
4.1 Построение графиков зависимостей
Для построения графиков зависимостей T
war(ε) и T
peace(ε) необходимо
найти количество мирных и военных периодов.
На листинге 7 показан код, который находит значения
Twar(ε) и
T
(ε):
peace
#Находим количество мирных периодов (Tpi) и добавляем их в массив
for i in range(len(arr8)):
if arr8[i] == 0:
n = n +
1
elif arr8[i] != 0 and n != 0:
arr9.append(n)
n =
0
arr9.append(n)
print(arr9)
#Значение E
e = 10
E = 0
#Находим мирный период
for i in range(e):
if i <= e :
E = E +
1
arr10.append(E)
TpE = 0
TwE = 0
for i in range(len(arr9)):
if arr9[i] >= E:
TpE = TpE + arr9[i]
arr12.append(TpE)
# Находим период войны
19
TwE = Tc - TpE
arr11.append(TwE)
Листинг 7: Код для получения Twar(ε) и Tpeace(ε) Россия
По результатам, полученным с помощью этого кода, был построен
график зависимости периода войны T
war(ε) и периода мира T
peace(ε) от
значения периода ε для России (см. Рис. 8).
Рис. 8. График зависимости периода войны Twar(ε) и периода мира Tpeace(ε) от значения
периода ε для России с 1721 года по 2018 год, с учетом данных о 31 войне , в которых
участвовала Россия
На графике (см. Рис. 8.) можно наблюдать изменение периодов мира и
войны при значениях ε в интервале [1, 50]. Как можно увидеть, кривая
периода мира убывает, а кривая периода войны возрастает. На Рис. 8 видно,
что при значении ε больше 40 лет, исследуемый период существования
20
России с 1721 года по 2018 год, что составляет 297 лет, содержит чуть более
50 мирных лет. Если же мы будем считать - сколько наберется мирных лет с
расстоянием между войнами 25-40 лет (значение ε), то будет всего 97 лет за
историю России, военных же целых 200. При ε равном 20 происходит
пересечение кривых мира и войны. В этой точке оба периода имеют
продолжительность 150 лет.
4.2 Сравнительный анализ графика военных и мирных периодов
для России и США.
Для сравнительного анализа был получен график периодов мира и
войны для России и США (см. Рис. 9.).
21
Рис. 9. Сравнительный график периодов мира и войны для России с 1721 года по 2018
год, с учетом данных о 31 войне , в которых участвовала Россия, и США с 1776 по 2108,
с учетом данных о 19 войнах, в которых участвовали США
По полученному графику можно сделать вывод, что наиболее
воинственный период у обеих стран начался в годы Второй мировой войны,
но несмотря на это количество войн у России приблизительно в 2 раза
превосходит количество войн США. Также можно увидеть, что один из
периодов войны у России начинается в 1936 году и продолжается вплоть до
2012 года.
22
4.3 Сравнительный анализ Twar(ε) и Tpeace(ε) для России и США.
Для сравнительного анализа были получены графики, на которых
отображаются зависимости T
war(ε) и T
peace(ε) сразу для двух стран России и
США (см. Рис. 10.).
23
Рис. 10. Сравнительный график зависимости периода войны Twar(ε) и периода мира
T
(ε) от значения периода ε для России и США с 1721 года по 2018 год, с учетом
peace
данных о 31 войне , в которых участвовала Россия и 19 войнах, в которых участвовали
США
По полученному графику можно сделать следующий вывод:
- Период мира.
Кривые периодов мира T
peace(ε) у России и США пересекаются
дважды: при ε = 4.5 и ε = 20; при изменении ε от 4.5 до 20 переменная
Tpeace принимает большие значения у России, чем у США. Также
можно заметить, что кривая мира у США стремительно убывает на
интервале (4,5; 10), а у России не претерпевает изменений, что
говорит о неконфликтном периоде. При ε больше 20, наоборот у США
можно наблюдать 2 стремительных изменения переменной Tpeace : от
150 до 132, при ε (20; 22), и от 132 до 100 , при ε (31; 32)
,
чем у России,
это говорит о том, что у России больше непродолжительных мирных
24
периодов. При ε больше 41 у США 100 мирных лет, что превосходит
почти в 2 раза показатель России (56 лет).
- Период войны.
Кривая военного периода T
war(ε) у России берёт начало в точке (1;
101).
Второе
значение
соответствует
суммарному
количеству
военного периода для страны при ε равному 1. Для США же значение
переменной T
war равно всего 37, а первое возрастание можно
наблюдать на интервале ε (3; 11), на котором военный период
увеличивается на 53 года. Из такого резкого возрастания можно
прийти к тому, что у США за время существования имеется много
коротких мирных периодов между войнами. У России в этом
промежутке изменений ε переменная T
war не изменяется, а крупные
изменения происходят на интервале ε (19; 24), T
war возрастает со 118
до 200. При ε больше 40 у России 241 военный год, когда у США на
100 меньше (141 год). На всём интервале ε кривые военного периода
США и России не пересекаются.
25
Заключение
В рамках данной выпускной работы с помощью SPARQL-запросов были
получены даты основания и списки всех войн для России, США и
Великобритании, которые
храняться в Викиданных. На основании
полученных списков войн и периодов существования стран, используя
высокоуровневый язык Python, построены графики периодов мира и войны,
графики зависимостей периодов войны T
war(ε) и периодов мира T
peace(ε), а
также проведен анализ по сравнительному графику зависимости периода
войны Twar(ε) и периода мира T
peace(ε) России и США.
Как оказалось, Россия является более воинственной страной по
отношению к США, а также имеет более продолжительные военные
периоды. У США наоборот преобладают непродолжительные войны. При
значении ε больше 41 мирный период США примерно в два раза дольше,
чем тот же период в России по данным 31 войны за 297 лет истории России
и 19 войн за 242 года истории США.
26
Литература
[1] Denny Vrandečić, Markus Krötzsch. Wikidata: a free collaborative
knowledgebase. [Электронный ресурс] // Communications of the ACM, Issue
10, October, 2014. Vol. 57, P. 78-85.
URL:
https://static.googleusercontent.com/media/research.google.com/ru//pubs/ar
chive/42240.pdf
[2] Jorge Perez, Marcelo Arenas, and Claudio Gutierrez. Semantics and
Complexity of SPARQL.[Электронный ресурс] // 2006.
URL:
https://link.springer.com/content/pdf/10.1007%2F11926078_3.pdf
.
[3] Frank Manola, Eric Miller. RDF Primer [Электронный ресурс] // 2004.
URL:
https://www.w3.org/TR/rdf-primer/
[4] Guus Schreiber,Yves Raimond. RDF 1.1 Prime [Электронный ресурс] //
2014.
URL: https://www.w3.org/TR/rdf11-primer/
[5] Иван Орехов. [Электронный ресурс]// 2010.
URL:
https://www.ibm.com/developerworks/ru/library/l-python_part_1/index.htm
l
27
Отзывы:
Авторизуйтесь, чтобы оставить отзыв