2016-08-25 3 views
1

Ich möchte Dokumente zählen, in denen zwei Strings innerhalb einer festgelegten Entfernung innerhalb von 10 Wörtern voneinander erscheinen. Sagen wir "Deutsch *" und "Krieg". Ich möchte nicht die Zeiten zählen, die sie insgesamt erscheinen, sondern nur die Anzahl der Dokumente, in denen das Set erscheint (wenn es einmal erscheint, zählt es als eins).Wie zähle man Dokumente, in denen zwei Wörter in unmittelbarer Nähe in R erscheinen?

Ich weiß, wie man Dokumente zählt, die ein Wort enthalten. Aber ich bin mir nicht sicher, ob ich 10-Gramm extrahieren muss, um zu sehen, ob die beiden Wörter erscheinen, und sie dann pro Dokument zählen, oder ob es einen effizienteren Weg gibt.

+0

Wie groß sind die Dokumente? Meine erste Idee ist, jedes Dokument in der Liste als eine einzige Zeichenfolge zu halten, und dann alle Frasen von Deutsch in den Krieg als Regex zu grep. Dann teilen Sie das Ergebnis in Wörter auf und zählen Sie sie. –

+0

Sie sind ziemlich groß (bis zu 500 MB). –

+0

Also denke ich jede Zeile des Dokuments in verschiedenen String? Dann grep deine Schlüsselwörter. Dann denke ich, dass deine Daten viel kleiner sein werden. Wenn Strings nahe beieinander sind, könntest du ihnen beitreten und Wörter zwischen Deutsch und Krieg zählen. –

Antwort

0

Im Folgenden finden Sie eine kleine Funktion, die prüft, ob zwei Wörter näher als 100 Zeichen in einem Text sind.

isclose = function(text){ 
    test <- FALSE 
    limit <- 100 # Interval in char counts 
    match1 <- gregexpr('war', text)[[1]] 
    match2 <- gregexpr('German', text)[[1]] 

    for(i in 1:length(match1)){ 
    for(j in 1:length(match2)){ 
     if(abs(match1[i]-match2[j]) < limit) test <- TRUE 
    } 
    } 
    return(test) 
} 

Es funktioniert gut, aber sollte verbessert werden, um die Anzahl der Wörter anstelle von Zeichen zu zählen.

+0

Ich verwende jetzt Regex, um es zu finden und das funktioniert gut, zum Beispiel: '\ b?: Ameri [k | c] a [az] * \ W + (?: \ W + \ W +) {1,10} [s | c] igaret [az] * | [s | c] igaret [az] * \ W + (?: \ w + \ W +) {1,10}? ameri [k | c] a [az] *) \ b' für Amerika und Zigaretten –

+0

Können Sie einen MWE veröffentlichen? – JohnBee

Verwandte Themen