Экспорт данных из твиттера в Gephi с помощью R
Я собрал набор данных, состоящий из тысяч твитов, используя R.
Набор данных в основном выглядит следующим образом:
Data <- data.frame(
X = c(1,2),
text = c("Hello @User1 #hashtag1, hello @User2 and @User3, #hashtag2", "Hello @User2 #hashtag3, hello @User1 and @User3, #hashtag4"),
screenname = c("author1", "author2")
)
Теперь я хочу экспортировать этот набор данных в поддерживаемый Gephi формат графика (см.Поддерживаемые форматы графиков - Gephi)
Всякий раз, когда «автор» упоминает @user в тексте, должна быть прямая ссылка от автора на пользователя. В случае выше, результаты должны быть такими:
author1 -> @ User2
author1 -> @ User3
author2 -> @ User1
author2 -> @ User3
Как я могу манипулировать своим набором данных и экспортировать его в формат графика, поддерживаемый Gephi?
Если возможно, я бы предпочел формат GEXF или GraphML. Если это невозможно, я также могу работать с CSV или электронной таблицей.
Я думал о решении этой проблемы всю ночь и сделал несколько шагов в правильном направлении (по крайней мере, я на это надеюсь). Но мне нужна твоя помощь.
Как уже упоминалось выше, у меня есть в основном следующий набор данных:
Data <- data.frame(
X = c(1,2),
text = c("Hello @User1 #hashtag1, hello @User2 and @User3, #hashtag2", "Hello @User2 #hashtag3, hello @User1 and @User3, #hashtag4"),
screenname = c("author1", "author2")
)
Я хочу экспортировать его в формат GEXF, чтобы использовать его в Gephi.
Существует пакет r для экспорта данных r в GEXF, который называется rgexf (см.https://bitbucket.org/gvegayon/rgexf/wiki/Installation). Чтобы использоватьwrite.gexf
Функция пакета, мне нужно как минимум две вещи:
1) матрица всех узлов в сети (в моем случае авторы, пользователи и хэштеги)
2) матрица всех ребер между этими узлами (т.е. связи между авторами и пользователями, а также хэштеги).
В моих данных в Твиттере авторы никогда не печатаются с "@", хотя они также могут быть "пользователями". Поэтому сначала я должен добавить «@» к авторам, чтобы избежать дублирования узлов.
data$screenname <- sub("^", "@", data$screenname )
Затем мне нужна матрица, состоящая из всех узлов в моей сети (то есть авторов, пользователей и хэштегов). Согласно этому примеру вывод должен выглядеть следующим образом:
people <- data.frame(matrix(c(1:9, '@author1', '@author2', '@user1', '@user2', '@user3', '#hashtag1', '#hashtag2', '#hashtag3', '#hashtag4'),ncol=2))
Тогда мне нужна матрица всех ребер между этими узлами. Согласно этому примеру вывод должен выглядеть следующим образом:
relations <- data.frame(matrix(c(1,3,1,4,1,5,1,6,1,7,2,4,2,3,2,5,2,8,2,9), ncol=2, byrow=T))
Наконец, мне нужно только соединить эти две вещи:
write.gexf(people, relations)
чтобы получить следующий файл:
<?xml version="1.0" encoding="UTF-8"?>
<gexf xmlns="http://www.gexf.net/1.2draft" xmlns:viz="http://www.gexf.net/1.1draft/viz" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.gexf.net/1.2draft http://www.gexf.net/1.2draft/gexf.xsd" version="1.2">
<meta lastmodifieddate="2015-02-04">
<creator>NodosChile</creator>
<description>A graph file writing in R using "rgexf"</description>
<keywords>gexf graph, NodosChile, R, rgexf</keywords>
</meta>
<graph mode="static" defaultedgetype="undirected">
<nodes>
<node id="1" label="@author1"/>
<node id="2" label="@author2"/>
<node id="3" label="@user1"/>
<node id="4" label="@user2"/>
<node id="5" label="@user3"/>
<node id="6" label="#hashtag1"/>
<node id="7" label="#hashtag2"/>
<node id="8" label="#hashtag3"/>
<node id="9" label="#hashtag4"/>
</nodes>
<edges>
<edge id="0" source="1" target="3" weight="1"/>
<edge id="1" source="1" target="4" weight="1"/>
<edge id="2" source="1" target="5" weight="1"/>
<edge id="3" source="1" target="6" weight="1"/>
<edge id="4" source="1" target="7" weight="1"/>
<edge id="5" source="2" target="4" weight="1"/>
<edge id="6" source="2" target="3" weight="1"/>
<edge id="7" source="2" target="5" weight="1"/>
<edge id="8" source="2" target="8" weight="1"/>
<edge id="9" source="2" target="9" weight="1"/>
</edges>
</graph>
</gexf>
Но как я могу автоматически извлечь узлы и отношения между этими узлами (ребрами) из приведенного выше примера и записать их в две матрицы?
Никто не знает, как решить мою проблему?
Я попытался выяснить, как извлечь узлы из моего примера (то есть авторов, пользователей и хэштегов) и сохранить их в data.frame (я уверен, что есть более короткий и более элегантный способ сделать это!):
#extract Users and Hashtags from text, Authors from screenname (and add @ to Author-names)
Users <- stri_extract_all(Data$text, regex = "@[A-Za-z0-9]+")
Hash <- stri_extract_all(Data$text, regex = "#[A-Za-z0-9]+")
Data$screenname <- sub("^", "@", Data$screenname )
Authors <- stri_extract_all(Data$screenname, regex = "@[A-Za-z0-9]+")
# delete NAs
Users <- Users[!is.na(Users)]
Hash <- Hash[!is.na(Hash)]
# converting lists to vectors
Users <- unlist(Users)
Hash <- unlist(Hash)
Authors <- unlist(Authors)
# merging the vectors to a single vector and deleting the duplicates
nodes <- unique(c(Authors, Users, Hash))
# saving the vectors in a data.frame and giving each node a unique ID
nodes <- data.frame(matrix(c(1:length(nodes), nodes), ncol=2))
colnames(nodes) <- c("ID", "label")
Но как я могу построить data.frame для краев?
Должен быть способ написания функции, которая автоматически проверяет, упоминал ли автор пользователя и / или хэштег, построчно, и записывает результат в новый data.frame, используя идентификаторы авторов, пользователей и хэштеги. Каждое соединение должно отображаться в двух столбцах: исходный и целевой (1,2).