0

私の修士論文では、ネットワーク分析を行う必要があります。最初に 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));

すでに助けてくれてありがとう!

4

0 に答える 0