这是我一直在研究的一个问题的后续问题我有两个问题其中一个是一个对两条tweets有效的算法,我将其修改为测量10条tweets。我想知道我的复习量是多少。我得到了结果,但我希望它能测量几个tweet的jaccard距离,而不仅仅是返回一个值。因为它返回一个值,所以我认为它只是把所有的东西加起来另一个问题是我试图创建for循环并分配集群。
我试图找到tweets数据集之间的Jaccard距离,然后使用Kmeans算法对这些tweets进行聚类。
这是我从中检索数据的位置:
http://www3.nd.edu/~dwang5/courses/spring15/assignments/A2/Tweets.json
到目前为止我得到的是

    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]])

所有这些都测量两条指定tweets的jaccard距离太好了。
但现在我正在尝试修改来比较几个tweet之间的距离。这一次我从r中的sample命令中检索到10条随机tweets。
# 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]])

这给了我结果,但不可能是正确的。
我试图构建一个算法,可以测量所有tweets,比较它们的jaccard距离,然后根据jaccard距离与kmeans进行聚类。
所以为了再次尝试,我想做一个for循环。
我决定用10条随机的tweets创建10个集群中心
c <- sample(tweet.features$text, replace = FALSE, size = 10)

现在我做了一个for循环,希望能够测量tweets,我想我可以将它分配给一个数组和集群
#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)
}

我不认为这样做有什么用处,但这是一个试图创建一个环来测量Jaccard距离的尝试。
很抱歉,这个问题太多了我有点迷路了,任何帮助都将不胜感激。

最佳答案

在第一个函数中,您正在对tweets中的单词列表执行unlist操作,因此在tw1tw2中具有全局单词列表,并且您不能通过tweet Jaccard将它们用于tweet您可以通过删除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)
}

愚蠢的例子:
> 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

当然,你应该跳过对角线中的值-就像我说的,只是一个起点。
希望有帮助。

08-19 23:16
查看更多