Экспорт данных из твиттера в 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).

Ответы на вопрос(0)

Ваш ответ на вопрос