# 8. ССЫЛКИ МЕЖДУ ПРОФИЛЯМИ ПОЛЬЗОВАТЕЛЕЙ В РАЗНЫХ СОЦИАЛЬНЫХ СЕТЯХ

[назад](README.md)

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

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

## 1. Предобработка

Генерация графа на основе имеющихся данных. Вершины представляют собой сущность “человек” и хранят идентификаторы профилей, принадлежащих конкретному пользователю. Связь между вершинами устанавливается по следующему принципу: две вершины смежны, если связны профили соответствующих социальных сетей. Определим вес ребра между вершинами как
```math
w (A, B) = |\{i: i \in [0, n-1] \cup \exist A_i, B_i \cup rel(A_i, B_i)\}|,
``` 
где $`rel(A, B)`$ - функция, которая истинна тогда и только тогда, когда профили $`A`$ и $`B`$ взаимосвязаны (установлено отношение дружбы или проявление активности). 

К полученному графу применяется алгоритм машинного обучения Label Propagation, реализованный внутри программного решения GraphX API, который решает задачу кластеризации и находит сообщества в графе. 

Для каждого сообщества генерируется RDD (resilient distributed dataset, отказоустойчивый распределенный набор данных) с набором профилей ВКонтакте, Facebook, Instagram и Twitter, которые связаны с одним или несколькими членами исходного сообщества 

Таким образом, формируется набор данных (dataset), на основе которого мы можем строить предположения о принадлежности группы аккаунтов разных социальных сетей (без явного указания взаимосвязей) одному человеку. 

Далее к каждому набору данных из датасета применяется следующая процедура.

### 2. Построение полного многодольного графа

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

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

Для сравнения двух профилей используется многослойная нейронная сеть. На входной слой сети подаётся вектор размерности 12, содержащий следующие данные:
- Name $`\leftrightarrow`$ Name' 
- max(Name $`\rightarrow`$ Username', Name' $`\rightarrow`$ Username) 
- max(Name $`\rightarrow`$ E-mail', Name' $`\rightarrow`$ E-mail) 
- max(Name $`\rightarrow`$ Skype', Name' $`\rightarrow`$ Skype) 
- Username $`\leftrightarrow`$ Username' 
- max(Username $`\rightarrow`$ E-mail', Username' $`\rightarrow`$ E-mail) 
- Username $`\leftrightarrow`$ Skype' 
- max(Skype $`\rightarrow`$ Username', Skype' $`\rightarrow`$ Username) 
- max(Skype $`\rightarrow`$ E-mail', Skype' $`\rightarrow`$ E-mail) 
- E-mail $`\leftrightarrow`$ E-mail' 
- Phone $`\leftrightarrow`$ Phone' 
- Website $`\leftrightarrow`$ Website'

Определим операции $`a \rightarrow b`$ и $`a \leftrightarrow b`$: 
1. полнота вхождения $`a`$ в $`b`$:

```math
a \rightarrow b = 1 - \frac{d + r + s}{len(a)} \in [0,1],
```
где $`d`$ - количество операций удаления для преобразования $`a`$ в $`b`$; $`r`$ – количество операций замены для преобразования $`a`$ в $`b`$; $`s`$ – количество операций транспозиции для преобразования $`a`$ в $`b`$; $`len(x)`$ – функция вычисления длины аргумента.

2. Сравнение $`a`$ и $`b`$:

```math
\forall i,j \in [1, len(a)], j \in [1, len(b)], d[i,j] = 1 - \frac{dist(a[i], b[j])}{len(b[j])} \in [0, 1], \\
a \leftrightarrow b = \frac{\sum_{i=1}^{len(a)} d[i, fit(i)]}{\min(len(a), len(b))} \in [0, 1],
```
где $`dist(a, b)`$ – функция, вычисляющая расстояние Дамерау-Левенштейна для строк $`a`$ и $`b`$; $`fit(i)`$ - функция, возвращающая индекс слова строки b, поставленного в соответствие слову $`a[i]`$.

Операция сравнения не учитывает порядок слов. Все слова исходных строк попарно сравниваются, а затем, при помощи алгоритма Куна-Манкреса, каждому слову строки a ставится в соответствие слово строки $`b`$ так, чтобы сумма схожести по всем парам слов была максимальной. Также не учитываются знаки препинания и прочие символы (за исключением букв и цифр). 

Перед обработкой все символы входных данных приводятся к латинским по правилам транслитерации. Для этого используется сводная таблица основных алфавитов (русский, украинский, болгарский, индийский, арабский). 

Обучающая и контрольная выборки собраны на основе первичных данных. 

В качестве отрицательных примеров могут использоваться как случайные пары профилей, так и пары, найденные при помощи полнотекстового поиска по разным параметрам (name, username, email, skype).

### 3. Постобработка

В сгенерированной графе для каждой пары долей выполняется следующий алгоритм.

1. Рёбра сортируются в порядке убывания весов; 

2. Удаляются рёбра, вес которых меньше порогового значения или одна из инцидентных вершин уже связана с какой-либо вершиной противоположной доли. 

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

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

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

[назад](README.md)
