2016-04-01 16 views
0

ich zur Zeit versucht, die Jaccard Entfernung zwischen Tweets in einem Datensatz zu messenJaccard Abstand zwischen Tweets

Dies ist, wo der Datensatz ist

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

ich ein paar Dinge ausprobiert habe zu messen der Abstand

Dies ist, was ich

bisher habe ich gespeichert die verknüpfte Datenmenge mit einer Tweets.json Datei namens

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

Dann konvertiert ich json_alldata zu tweet.features und bekam

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

Diese sind, was die ersten beiden Tweets wie

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" 

Das erste, was sehe ich versucht war unter Verwendung der Methode stringdist, die sich unter der Stringdist-Bibliothek befindet

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

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

Wenn ich laufen lasse, erhalte ich

[1] 0,1621622

Ich bin nicht sicher, das ist richtig, aber. Ein Schnittpunkt B = 23 und eine Vereinigung B = 25. Der Jaccard Abstand ist A Schnittpunkt B/A Union B - rechts? Also nach meiner Berechnung sollte der Jaccard Abstand 0,92 sein?

Also dachte ich, ich könnte es nach Sets machen. Einfach Durchschnitt und Vereinigung berechnen und teilen

Dies ist, was habe ich versucht,

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

Wenn ich versuche, Kreuzung zu tun ist, bekomme ich diese: Die Ausgabe nur Liste ist()

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

Als ich versuchen Union, bekomme ich diese:

Vereinigung (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" 

Dies scheint die Wörter nicht zu einem einzigen Satz zu gruppieren.

Ich dachte, ich wäre in der Lage, die Kreuzung durch die Union zu teilen. Aber ich denke, ich würde das Programm brauchen, um die Anzahl oder Wörter in jedem Satz zu zählen, und dann die Berechnungen durchführen.

Unnötig zu sagen, ich bin ein bisschen fest und ich bin mir nicht sicher, ob ich auf dem richtigen Weg bin.

Jede Hilfe wäre willkommen. Vielen Dank.

+2

'0.1621622' ist der Abstand in Bezug auf' 1 - Länge (Schnittpunkt (Spaltennamen (qgrams (tweet.features $ text [1])), Spaltennamen (qgrams (tweet.features $ text [2]))))/length (unique (c (Spaltennamen (qgrams (tweet.features $ text [1])), Spaltennamen (qgrams (tweet.features $ text [2]))))) '. Sie können N-Grams erstellen oder Ihre Tweets symbolisieren. Ich weiß am Ende nicht, was du willst. – lukeA

+0

Danke. Also ich denke, diese Funktion, die ich ausgeführt habe, ist diese lange Codezeile? Ich versuche die Anzahl der Wörter in jedem Tweet zu messen und berechne dann die Jaccard-Distanz. Es wäre wahrscheinlich einfacher, wenn ich zwei sehr unterschiedliche Tweets auswählen würde. Die, die ich ausgewählt habe, sind einander sehr ähnlich. – user3577397

Antwort

3

intersect und union erwarten Vektoren (as.set existiert nicht). Ich denke, dass Sie Wörter vergleichen möchten, so können Sie strsplit verwenden, aber die Art und Weise, wie der Split erledigt ist, gehört Ihnen.Ein Beispiel unter:

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 

Ist das wollen Sie wollen?

Die strsplit ist hier für jeden Raum oder Punkt. Sie können das split Argument von strsplit verfeinern und " |\\." für etwas spezifischere ersetzen (siehe ?regex).

+0

Danke. Das sieht so aus, als wäre es wirklich hilfreich. Ich werde es heute Abend testen. Also misst der Strspsplit die Räume, aber ich denke, es ist dasselbe wie die Anzahl der Wörter zu zählen? – user3577397

+1

Nun, es hängt hauptsächlich von Ihrer Frage ab. Nicht ein Experte der Textanalyse, aber es gibt einige hier. –

+0

Ich habe es getestet. Es funktioniert wirklich gut. Was ich versuche zu tun, ist Cluster-Tweets mit dem K-Means-Algorithmus basierend auf ihrer Jaccard Entfernung. Also denke ich, ich muss es modifizieren und herausfinden, wie man die Jaccard-Distanz über 251 Tweets testet. – user3577397