2016-04-01 3 views
0

я в настоящее время пытаюсь измерить Jaccard расстояния между твитами в наборе данныхJaccard расстояния между твитами

Это где набор данные

http://www3.nd.edu/~dwang5/courses/spring15/assignments/A2/Tweets.json

Я попробовал несколько вещей, чтобы измерить расстояние

Это то, что я до сих пор

Я сохранил связанный набор данных в файл с именем Tweets.json

json_alldata <- fromJSON(sprintf("[%s]", paste(readLines(file("Tweets.json")),collapse=","))) 

Тогда я преобразовал json_alldata в tweet.features и избавившись от колонки гео

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

Это то, что первые два твиты выглядеть

tweet.features$text[1] 
[1] "RT @ItsJennaMarbles: Reports of Marathon Runners that crossed finish line and continued to run to Mass General Hospital to give blood to victims. #PrayforBoston" 
> tweet.features$text[2] 
[1] "RT @NBCSN: Reports of Marathon Runners that crossed finish line and continued to run to Mass General Hospital to give blood to victims #PrayforBoston" 

Первое, что я попытался было используя метод stringdist, который находится под стеновой библиотекой

install.packages("stringdist") 
library(stringdist) 

#This works? 
# 
stringdist(tweet.features$text[1], tweet.features$text[2], method = "jaccard") 

Когда я бегу, что я получаю

[1] 0,1621622

Я не уверен, что это правильно, хотя. Пересечение B = 23 и A объединение B = 25. Расстояние Jaccard - это A пересечение B/A union B - right? Итак, по моим расчетам, расстояние до Джакарта должно быть 0,92?

Итак, я решил, что смогу сделать это с помощью комплектов. Просто вычислить пересечение и объединение и разделить

Это то, что я пытался

# Jaccard distance is the intersection of A and B divided by the Union of A and B 
# 
#create set for First Tweet 
A1 <- as.set(tweet.features$text[1]) 
A2 <- as.set(tweet.features$text[2]) 

Когда я пытаюсь сделать пересечение, я получаю это: Выход только список()

Intersection <- intersect(A1, A2) 
list() 

Когда я попробовать Союз, я получаю это:

союз (A1, A2)

[[1]] 
[1] "RT @ItsJennaMarbles: Reports of Marathon Runners that crossed finish line and continued to run to Mass General Hospital to give blood to victims. #PrayforBoston" 

[[2]] 
[1] "RT @NBCSN: Reports of Marathon Runners that crossed finish line and continued to run to Mass General Hospital to give blood to victims #PrayforBoston" 

Это не похоже на группировку слов в один набор.

Я понял, что смогу разделить перекресток на союз. Но я предполагаю, что мне понадобится программа для подсчета числа или слов в каждом наборе, а затем выполните вычисления.

Излишне говорить, что я немного застрял, и я не уверен, что я на правильном пути.

Любая помощь будет оценена по достоинству. Спасибо.

+2

«0.1621622» - расстояние в терминах «1 - длина (пересечение (colnames (qgrams (tweet.features $ text [1])), colnames (qgrams (tweet.features $ text [2]))))/length (уникальный (c (colnames (qgrams (tweet.features $ text [1])), colnames (qgrams (tweet.features $ text [2]))))) '. Вы можете создавать n-граммы или подписывать свои твиты. Я не знаю, чего ты хочешь в конце. – lukeA

+0

Спасибо. Итак, я полагаю, что эта функция, которую я запускал, - это длинная строка кода? Я пытаюсь измерить количество слов в каждом твитте, а затем вычислить расстояние до Джакарта. Вероятно, было бы легче, если бы я выбрал два совершенно разных твита. Те, что я выбрал, очень похожи друг на друга. – user3577397

ответ

3

intersect и union ожидать векторов (as.set не существует). Я думаю, что вы хотите сравнить слова, чтобы вы могли использовать strsplit, но способ, которым выполняется разделение, принадлежит вам.Пример ниже:

tweet.features <- list(tweet1="RT @ItsJennaMarbles: Reports of Marathon Runners that crossed finish line and continued to run to Mass General Hospital to give blood to victims. #PrayforBoston", 
         tweet2=   "RT @NBCSN: Reports of Marathon Runners that crossed finish line and continued to run to Mass General Hospital to give blood to victims #PrayforBoston") 

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(tweet.features[[1]], tweet.features[[2]]) 

$i 
[1] 20 

$u 
[1] 23 

$j 
[1] 0.8695652 

Хотите ли вы этого хотите?

strsplit здесь сделано для каждого пространства или точки. Вы можете уточнить аргумент split от strsplit и заменить " |\\." на что-то более конкретное (см. ?regex).

+0

Спасибо. Похоже, это будет очень полезно. Я проверю это сегодня вечером. Итак, strssplit измеряет пробелы, но я думаю, что это то же самое, что подсчитывать количество слов? – user3577397

+1

Ну, это в основном зависит от вашего вопроса. Не эксперт по анализу текста, но есть некоторые из них. –

+0

Я проверил его. Он работает очень хорошо. То, что я пытаюсь сделать, это кластерные твиты с алгоритмом K-mean, основанным на их Jaccard Distance. Поэтому я думаю, мне нужно изменить его и выяснить, как проверить расстояние Jaccard через 251 твитов. – user3577397

Смежные вопросы