5

ブログ間の「ソーシャルネットワーク」を反映するために、ブログ間のリンクマップを作成して視覚化する方法についてアドバイスをお願いします。

これが私がそれをすることを考えている方法です:

  1. 1つ(または複数)のブログホームページから始めて、そのページ上のすべてのリンクを収集します
  2. 内部リンクであるすべてのリンクを削除します(つまり、www.website.comから開始した場合。次に、図形「www.website.com/***」からすべてのリンクを削除します)。ただし、すべての外部リンクを保存してください。
  3. これらの各リンクに移動し(まだアクセスしていない場合)、手順1を繰り返します。
  4. Xが最初のページからジャンプするまで(たとえば)続けます。
  5. 収集したデータをプロットします。

Rでこれを行うには、RCurl / XML(ここで回答してくれたShaneに感謝します)を.のようなものと組み合わせて使用​​すると思いigraphます。

しかし、私はどちらも経験がないので、重要なステップを逃した場合に私を訂正したり、このタスクを許可するための有用なコードスニペットを添付したりする人がいますか?

ps:この質問の私の動機は、1週間でuseR 2010について「ブログとR」について講演することです。これは、聴衆に何か楽しいことを与えると同時に、彼らにやる気を起こさせる良い方法かもしれないと思いました。このようなもの自体。

どうもありがとう!

タル

4

2 に答える 2

7

注意: この例は、リンクを取得するための非常に基本的な方法であるため、より堅牢にするために微調整する必要があります。:)

このコードがどれほど役立つかはわかりませんが、進むべき方向についてのアイデアが得られることを願っています (コピーして R に貼り付けるだけです。パッケージ RCurl と XML をインストールすると、自己完結型の例になります)。 :

library(RCurl)
library(XML)

get.links.on.page <- function(u) {
  doc <- getURL(u)
  html <- htmlTreeParse(doc, useInternalNodes = TRUE)
  nodes <- getNodeSet(html, "//html//body//a[@href]")
  urls <- sapply(nodes, function(x) x <- xmlAttrs(x)[[1]])
  urls <- sort(urls)
  return(urls)
}

# a naieve way of doing it. Python has 'urlparse' which is suppose to be rather good at this
get.root.domain <- function(u) {
  root <- unlist(strsplit(u, "/"))[3]
  return(root)
}

# a naieve method to filter out duplicated, invalid and self-referecing urls. 
filter.links <- function(seed, urls) {
  urls <- unique(urls)
  urls <- urls[which(substr(urls, start = 1, stop = 1) == "h")]
  urls <- urls[grep("http", urls, fixed = TRUE)]
  seed.root <- get.root.domain(seed)
  urls <- urls[-grep(seed.root, urls, fixed = TRUE)]
  return(urls)
}

# pass each url to this function
main.fn <- function(seed) {
  raw.urls <- get.links.on.page(seed)
  filtered.urls <- filter.links(seed, raw.urls)
  return(filtered.urls)
}

### example  ###
seed <- "http://www.r-bloggers.com/blogs-list/"
urls <- main.fn(seed)

# crawl first 3 links and get urls for each, put in a list 
x <- lapply(as.list(urls[1:3]), main.fn)
names(x) <- urls[1:3]
x

コピペしてRに貼り付けてxを見るとわかると思います。

いずれにせよ、頑張ってください!トニー・ブレイアル

于 2010-07-13T15:17:59.097 に答える
4

タル、

このタイプのデータ収集は、ネットワーク理論ではk-snowball検索と呼ばれ、Rではかなり簡単なはずです。ご存知のように、これを実現する最も簡単な方法は、XMlパッケージとhtmlTreeParseコマンドを使用することです。これにより、ブログからツリーにHTMLが解析され、関心のあるリンク抽出をより簡単に実行できるようになります。

また、igraphグラフを完全に表現することができますが、2つのグラフを取得し、それらのエッジセットの構成を返すための便利な関数graph.composeもあります。「雪玉を転がす」ことを続けるときにデータを組み合わせるためにこれが必要になります。プロセスの基本的な手順は次のとおりです。

  1. シードブログを探す
  2. シードのすべてのネイバーを見つけ、そのネイバーに接続された中央のシードを使用してエゴネット(スターグラフ)を作成します
  3. シードのすべてのネイバーに対して、エゴネットを作成し、元のシードグラフを使用してそれらのグラフを繰り返し作成します。
  4. 収集したいk度のステップをいくつでも繰り返します。

Rにはこのためのコードはありませんが、GoogleのSocialGraph APIを使用して、Pythonで非常によく似たプロセスを実行するコードを生成しました

幸運を!

于 2010-07-11T20:19:09.743 に答える