2015-02-25 10 views
9

Đang cố gắng tìm các cộng đồng trong dữ liệu tweet. Sự tương tự cosin giữa các từ khác nhau tạo thành ma trận kề. Sau đó, tôi tạo ra đồ thị ra khỏi ma trận kề. Hình ảnh biểu đồ là nhiệm vụ ở đây:Làm thế nào để phát tán biểu đồ cộng đồng được thực hiện bằng cách sử dụng gói igraph trong R

# Document Term Matrix 
dtm = DocumentTermMatrix(tweets) 

### adjust threshold here 
dtms = removeSparseTerms(dtm, 0.998) 
dim(dtms) 

# cosine similarity matrix 
t = as.matrix(dtms) 

# comparing two word feature vectors 
#cosine(t[,"yesterday"], t[,"yet"]) 

numWords = dim(t)[2] 

# cosine measure between all column vectors of a matrix. 
adjMat = cosine(t) 

r = 3 
for(i in 1:numWords) 
{ 
    highElement = sort(adjMat[i,], partial=numWords-r)[numWords-r] 
    adjMat[i,][adjMat[i,] < highElement] = 0 
} 

# build graph from the adjacency matrix 
g = graph.adjacency(adjMat, weighted=TRUE, mode="undirected", diag=FALSE) 
V(g)$name 

# remove loop and multiple edges 
g = simplify(g) 
wt = walktrap.community(g, steps=5) # default steps=2 
    table(membership(wt)) 

# set vertex color & size 
nodecolor = rainbow(length(table(membership(wt))))[as.vector(membership(wt))] 
nodesize = as.matrix(round((log2(10*membership(wt))))) 
nodelayout = layout.fruchterman.reingold(g,niter=1000,area=vcount(g)^1.1,repulserad=vcount(g)^10.0, weights=NULL) 

par(mai=c(0,0,1,0)) 
plot(g, 
    layout=nodelayout, 
    vertex.size = nodesize, 
    vertex.label=NA, 
    vertex.color = nodecolor, 
    edge.arrow.size=0.2, 
    edge.color="grey", 
    edge.width=1) 

Tôi chỉ muốn có thêm khoảng cách giữa các cụm/cộng đồng riêng biệt.

different communities are shown by different colors

+0

xin vui lòng giới thiệu g hoặc một ví dụ về nó –

+0

Bạn đã thử thay đổi diện tích ô? Mặc định là 'area = vcount (graph)^2' (http://www.inside-r.org/packages/cran/igraph/docs/layout) –

+0

Chỉ cần cập nhật với mã và đồ thị mới nhất. – magarwal

Trả lời

5

Để theo sự hiểu biết của tôi, bạn không thể đỉnh bố trí cùng một cộng đồng chặt chẽ với nhau, sử dụng igraph chỉ. Tôi đã thực hiện chức năng này trong gói của tôi NetPathMiner. Có vẻ như hơi khó để cài đặt gói chỉ dành cho chức năng trực quan hóa. Tôi sẽ viết một phiên bản đơn giản của nó ở đây và giải thích những gì nó làm.

layout.by.attr <- function(graph, wc, cluster.strength=1,layout=layout.auto) { 
     g <- graph.edgelist(get.edgelist(graph)) # create a lightweight copy of graph w/o the attributes. 
     E(g)$weight <- 1 

     attr <- cbind(id=1:vcount(g), val=wc) 
     g <- g + vertices(unique(attr[,2])) + igraph::edges(unlist(t(attr)), weight=cluster.strength) 

     l <- layout(g, weights=E(g)$weight)[1:vcount(graph),] 
     return(l) 
} 

Về cơ bản, hàm này thêm một đỉnh phụ được kết nối với tất cả các đỉnh thuộc cùng một cộng đồng. Bố cục được tính toán dựa trên biểu đồ mới. Vì mỗi cộng đồng hiện được kết nối bởi một đỉnh chung, chúng có xu hướng tập hợp lại với nhau.

Như Gabor đã nói trong nhận xét, tăng trọng số cạnh cũng sẽ có tác dụng tương tự. Hàm này sử dụng thông tin này, bằng cách tăng một số cluster.strength, các cạnh giữa các đỉnh được tạo ra và các cộng đồng của chúng được đặt trọng số cao hơn.

Nếu điều này vẫn chưa đủ, bạn mở rộng nguyên tắc này (tính toán bố cục trên biểu đồ được kết nối nhiều hơn) bằng cách thêm cạnh giữa tất cả các đỉnh của cùng một cộng đồng (tạo thành một khối). Từ kinh nghiệm của tôi, đây là một chút quá mức cần thiết.

Các vấn đề liên quan