私の修士論文では、ネットワーク分析を行う必要があります。最初に Java を使用して、ツイート データをエッジと頂点の属性を持つエッジ リストに再構築します。
Java で作成した csv ファイルを RI にインポートした後、エッジ データから頂点データ フレームを作成し、最終的に igraph パッケージを使用してグラフを作成します。
write.graph でグラフを保存した後、後日再度インポートする必要があります。read.graph を使用すると、最初はデータが適切な UTF-8 ではないというエラー ( Graphml parse errorと同様) が発生したため、iconv() を使用してそれを防止しました。
今、私はエラーを受け取ります:
Error in .Call("R_igraph_read_graph_graphml", file, as.numeric(index), :
At foreign-graphml.c:1202 : PCDATA invalid Char value 3
, Parse error
どうやら、graphml ファイルに無効な XML 文字が含まれているようです。再構築プロセス中にこれらの文字を削除するはずだった Java プログラムで replaceAll() を使用して、最初に無効な文字を防止しようとしましたが、見つかったすべての正規表現は役に立ちませんでした。1 つの式がエラーを 3 ではなく 16 の char 値に変えましたが、残念ながらもう見つけることができません。
上記のエラーをそれぞれ防止する、すべての可能な無効な文字に一致する式を教えてもらえますか?
データを再構築する Java コードは次のとおりです。
public List<Edge> buildEdges(BufferedReader reader)
throws RestructurerException, IOException {
List<Edge> edges = new LinkedList<Edge>();
String line = null;
while ((line = reader.readLine()) != null) {
String[] values = line.split(" ; "); // split each tweet line by tweet elements
if (values.length == 14) {
if (values[7].equals("")) {
values[7] = "NULL";
} else {
values[7] = values[7].replaceAll(";", ""); // remove semicolon in that tweet element since it causes problems (seperator)
}
long timestamp = Timestamp.valueOf(values[4]).getTime()
- TWEET_EPOCH;
long profileAge = Timestamp.valueOf(values[12]).getTime()
- PROFILE_EPOCH;
String mentiontext = values[3];
String[] mentions = mentiontext.split(" "); // split the mentioned users seperated by whitespace
for (String mention : mentions) {
Edge edge = new Edge(mention, values[1],
values[2].replaceAll(";", ""), timestamp,
values[5], values[6], values[7], values[8],
values[9], values[10], values[11], profileAge,
values[13]);
edges.add(edge);
}
}
}
System.out.println("Anzahl Edges:" + edges.size());
return edges;
}
egde リストは別の方法で csv としてファイルに書き込まれますが、それを表示することはあまり重要ではありません。
エッジ リストをグラフに変換する R コード (デモンストレーションの目的のためにパスを短くしました):
library(igraph)
edges <- read.csv2("C:/.../Mentions_iwS_Edges.csv", header=TRUE, quote="");
amount <- nrow(edges);
amount;
sources <- data.frame(Vertexname = character(amount), Description = character(amount), Follower = numeric(amount), Friends = numeric(amount), Favourites = numeric(amount), Statuses = numeric(amount), ProfileAge = numeric(amount), Listed = numeric(amount), Timestamp = numeric(amount), OutDegree = numeric(amount), InDegree = numeric(amount), WOutDegree = numeric(amount), WInDegree = numeric(amount));
targets <- data.frame(Vertexname = character(amount), Description = character(amount), Follower = numeric(amount), Friends = numeric(amount), Favourites = numeric(amount), Statuses = numeric(amount), ProfileAge = numeric(amount), Listed = numeric(amount), Timestamp = numeric(amount), OutDegree = numeric(amount), InDegree = numeric(amount), WOutDegree = numeric(amount), WInDegree = numeric(amount));
for (i in 1:ncol(edges)) {
edges[,i] <- iconv(edges[,i], to = "UTF-8", sub = "");
}
print("REPORT: Data converted to UTF-8");
sources[,1] <- edges[,1];
sources[,2:8] <- NA;
sources[,9] <- edges[,4];
sources[,10:13] <- NA;
targets[,1] <- edges[,2];
targets[,2] <- edges[,7];
targets[,3] <- edges[,8];
targets[,4] <- edges[,9];
targets[,5] <- edges[,10];
targets[,6] <- edges[,11];
targets[,7] <- edges[,12];
targets[,8] <- edges[,13];
targets[,9:13] <- NA;
print("REPORT: vertices data frames filled")
sources <- unique(sources);
targets <- unique(targets);
print("REPORT: Duplicated sources and targets removed");
nodes <- within(merge(sources, targets, by="Vertexname", all=TRUE), {
Description <- ifelse(is.na(Description.x), paste(Description.y), Description.x); Description.x = NULL; Description.y = NULL;
Follower <- ifelse(is.na(Follower.x), Follower.y, Follower.x); Follower.x = NULL; Follower.y = NULL;
Friends <- ifelse(is.na(Friends.x), Friends.y, Friends.x); Friends.x = NULL; Friends.y = NULL;
Favourites <- ifelse(is.na(Favourites.x), Favourites.y, Favourites.x); Favourites.x = NULL; Favourites.y = NULL;
Statuses <- ifelse(is.na(Statuses.x), Statuses.y, Statuses.x); Statuses.x = NULL; Statuses.y = NULL;
ProfileAge <- ifelse(is.na(ProfileAge.x), ProfileAge.y, ProfileAge.x); ProfileAge.x = NULL; ProfileAge.y = NULL;
Listed <- ifelse(is.na(Listed.x), Listed.y, Listed.x); Listed.x = NULL; Listed.y = NULL;
Timestamp <- ifelse(is.na(Timestamp.y), Timestamp.x, Timestamp.y); Timestamp.x = NULL; Timestamp.y = NULL;
OutDegree <- ifelse(is.na(OutDegree.x), OutDegree.y, OutDegree.x); OutDegree.x = NULL; OutDegree.y = NULL;
InDegree <- ifelse(is.na(InDegree.x), InDegree.y, InDegree.x); InDegree.x = NULL; InDegree.y = NULL;
WOutDegree <- ifelse(is.na(WOutDegree.x), WOutDegree.y, WOutDegree.x); WOutDegree.x = NULL; WOutDegree.y = NULL;
WInDegree <- ifelse(is.na(WInDegree.x), WInDegree.y, WInDegree.x); WInDegree.x = NULL; WInDegree.y = NULL});
print("REPORT: Sources and Targets merged");
nodes <- subset(nodes, !duplicated(nodes$Vertexname));
print("REPORT: Duplicated vertices removed");
nrow(nodes);
edges <- edges[complete.cases(edges[,1:2]),];
nodes <- nodes[complete.cases(nodes[,1]),];
print("REPORT: Invalid edges and nodes removed");
g <- graph.data.frame(edges, directed=TRUE, nodes);
print("REPORT: Graph created");
outdegrees <- degree(g, v=V(g), mode="out");
indegrees <- degree(g, v=V(g), mode="in");
woutdegrees <- graph.strength(g, v=V(g), mode="out");
windegrees <- graph.strength(g, v=V(g), mode="in");
g <- set.vertex.attribute(g, "OutDegree", V(g), outdegrees);
g <- set.vertex.attribute(g, "InDegree", V(g), indegrees);
g <- set.vertex.attribute(g, "WOutDegree", V(g), woutdegrees);
g <- set.vertex.attribute(g, "WInDegree", V(g), windegrees);
print("REPORT: Degree calculated and added as vertex attribute");
write.graph(g, "C:/.../Mentions_iwS_Graph.graphml", format="graphml");
print("REPORT: Graph saved");
エラーをスローする R スクリプト:
library(igraph);
g <- read.graph("C:/.../Mentions_iwS_Graph.graphml", format="graphml");
length(E(g));
length(V(g));
すでに助けてくれてありがとう!