2016-04-07 16 views
0

これは私がしばらくの間取り組んできた問題のフォローアップの質問です。私には2つの質問があります。 1つは2つのつぶやきに作用するアルゴリズムを考慮し、10つのつぶやきを測定するように改訂しました。私は私の改訂版が何を測定しているのか疑問に思います。私は結果を得るが、ただ一つの価値を返すだけでなく、いくつかのツイートのジャカードの距離を測定したい。それは1つの価値を返すので、私はすべてを追加するだけだと思います。もう1つの質問は、For Loopを作成してクラスタを割り当てる試みです。KmeansのつぶやきとクラスタのJaccard距離を見つける

私はつぶやきのデータセットの間にJaccard距離を見つけようとしています。そして、それらのつぶやきをKmeansアルゴリズムでクラスタリングしようとしています。私はこれまでのところ、この

install.packages("rjson") 
library("rjson") 


#download JSON File and put into a dataframe 
download.file("http://www3.nd.edu/~dwang5/courses/spring15/assignments/A2/Tweets.json", tf<-tempfile());library(jsonlite);json_alldata <- fromJSON(sprintf("[%s]", paste(readLines(file(tf)),collapse=","))) 

# get rid of geo column 
tweet.features = json_alldata 
tweet.features$geo <- NULL 

# *Works. Compares two tweets and measures Jaccard Distance 

tweetText <- list(tweet1 = tweet.features$text[1]:tweet.features$text[2]) 

jaccard_i <- function(tw1, tw2){ 
    tw1 <- unlist(strsplit(tw1, " |\\.")) 
    tw2 <- unlist(strsplit(tw2, " |\\.")) 
    i <- length(intersect(tw1, tw2)) 
    u <- length(union(tw1, tw2)) 

    list(i=i, u=u, j=i/u) 
} 

jaccard_i(tweetText[[1]], tweetText[[2]]) 

ことのすべてが指定された2人のつぶやきのジャカード距離を測定されている何 http://www3.nd.edu/~dwang5/courses/spring15/assignments/A2/Tweets.json

:私はからデータを取得していますどこ

です。それは素晴らしいです。

しかし今、私はいくつかのつぶやきの間の距離を比較するために修正しようとしています。今度はRのサンプルコマンドから取得したランダムな10個のつぶやき

# Generates two sets of 5 random tweets 
tweetText <- list(sample(tweet.features$text, replace = FALSE, size = 5), sample(tweet.features$text, replace = FALSE, size = 5)) 

jaccard_i <- function(tw1, tw2){ 
    tw1 <- unlist(strsplit(tw1, " |\\.")) 
    tw2 <- unlist(strsplit(tw2, " |\\.")) 
    i <- length(intersect(tw1, tw2)) 
    u <- length(union(tw1, tw2)) 

    list(i=i, u=u, j=i/u) 
} 

jaccard_i(tweetText[[1]], tweetText[[2]]) 

これは私には結果が出るが、正しいとは言えない。

私はすべてのつぶやきを測定し、jaccardの距離を比較し、次にJacmeの距離に基づいてKmeansに基づいてクラスタリングするアルゴリズムを構築しようとしています。

別の試みのために、私はFor Loopを作成すると考えました。

私は今、私はループのために、私は私が

#Algorithm attempt 
for(i in tweet.features$text){ 
    for (j in c){ 
    i <- length(intersect(i, j)) 
    u <- length(union(i, j)) 
    j = i/u 
    } 
    #assign(my.array) 
} 
配列およびクラスタに割り当てることができます考え出しツイートを測定することを期待してなかった10件のランダムツイート

c <- sample(tweet.features$text, replace = FALSE, size = 10) 

で10のクラスタ中心を作ることにしました

これは役に立つとは思えませんが、Jaccard距離を測定するループを作成しようとしています。

ご迷惑をおかけして申し訳ありません。私は少し失われているので、どんな助けも高く評価されます。

+1

'stringdist'または' vegan'パッケージを見てください。 – phiver

答えて

2

あなたの最初の関数では、あなたは、このようにtw1tw2で、あなたのつぶやきの中の単語のあなたのリストのunlistを行っている単語のグローバルなリストを持っていると、あなたのつぶやきごとのつぶやきジャカードのためにそれらを使用することはできません。あなたはunlistを削除してそれを達成することができます。次にtw1tw2は用語リストのリストであり、mapplyを使用して比較することができます。次のようなもの。

jaccard_i <- function(tw1, tw2){ 
    tw1 <- strsplit(tw1, " |\\.") 
    tw2 <- strsplit(tw2, " |\\.") 
    i <- mapply(function(tw1, tw2) { 
    length(intersect(tw1, tw2)) 
    }, tw1=tw1, tw2=tw2) 
    u <- mapply(function(tw1, tw2) { 
    length(union(tw1, tw2)) 
    }, tw1=tw1, tw2=tw2) 
    list(i=i, u=u, j=i/u) 
} 

愚かな例:あなたの質問の後半部分、二重のforループとして

> tw1 = c("we yes you no", "we are the people") 
> tw2= c("we are the people", "we yes you no") 
> tweetText = list(tw1, tw2) 
> jaccard_i(tweetText[[1]], tweetText[[2]]) 
$i 
[1] 1 1 

$u 
[1] 7 7 

$j 
[1] 0.1428571 0.1428571 

、それへの対処を開始する簡単な方法は、このようになる、と

tw = c("we yes you no", "we are the people") 
lapply(tw, function(tweet1) { 
    lapply(tw, function(tweet2) { 
    jaccard_i(tweet1, tweet2) 
    }) 
}) 

結果は次のようになります。

[[1]] 
[[1]][[1]] 
[[1]][[1]]$i 
[1] 4 

[[1]][[1]]$u 
[1] 4 

[[1]][[1]]$j 
[1] 1 


[[1]][[2]] 
[[1]][[2]]$i 
[1] 1 

[[1]][[2]]$u 
[1] 7 

[[1]][[2]]$j 
[1] 0.1428571 



[[2]] 
[[2]][[1]] 
[[2]][[1]]$i 
[1] 1 

[[2]][[1]]$u 
[1] 7 

[[2]][[1]]$j 
[1] 0.1428571 


[[2]][[2]] 
[[2]][[2]]$i 
[1] 4 

[[2]][[2]]$u 
[1] 4 

[[2]][[2]]$j 
[1] 1 

ここで、対角線の値をスキップする必要があります。私が言ったように、ちょうど出発点です。

希望します。

+0

非常に参考になりました、ありがとうございます。 tw1とtw2でつぶやきを指定する代わりに、私はこれを以前と同じように置き換えて、あなたが提供した最初の関数を使用しました。 (tweet.features $ text、replace = FALSE、size = 5))最初のツイートを比較/測定しているようです最初のサンプルと2番目の最初のツイートとのように続きます。あなたはそれを使用しても大丈夫だと思いますか、他に何かする必要がありますか? – user3577397

+1

まあ、私はちょうどあなたの質問に従っていて、答えようとしていました。私は実際には、2つのループであなたの2番目のアイデアが良いと思う、あなたはすべてのツイート対すべてのツイートを比較する必要がある、あなたはそれがクラスタリングのために必要になります。しかし、私はまた、あなたがそれを行う方法を学ぶことを試みていると推測しています。あなたのためにほとんどのことを行うことができるライブラリがあるからです。おかげさまで – lrnzcig

+0

私は第二のものと仕事をしようとします。そして、はい、私はこのことを学びたいと思っています。正直言って、圧倒している。これを手伝ってくれるライブラリは何ですか?私はこの質問をする前にビーガンのものを研究しましたが、私が望んだことをするためにどのように修正するかわかりませんでした。 – user3577397

関連する問題