2016-03-31 10 views
1

Ich verwende findAssocs() des tm-Pakets in einer Dokument-Häufigkeitsmatrix, um Wörter zu identifizieren, die bestimmten Begriffen in verschiedenen Dokumenten in einem Korpus zugeordnet sind.findAssocs() von tm-Paketen unterdrückt Verknüpfungen

Mein Problem ist, dass ich unterschiedliche Ausgaben erhalte, wenn ich einen Vektor von Begriffen als Eingabe für die Funktion gebe, im Vergleich zu einem einzigen Begriff als Eingabe.

Hier ist mein Beispiel.

library(tm) 
txt <- c("alpha bravo", "alpha charlie", "alpha charlie", "zulu") 
corp <- Corpus(VectorSource(txt)) 
dtm <- DocumentTermMatrix(corp) 

Gibt die folgende dtm

> as.matrix(dtm) 
    Terms 
Docs alpha bravo charlie zulu 
    1  1  1  0 0 
    2  1  0  1 0 
    3  1  0  1 0 
    4  0  0  0 1 

Wenn ich möchte alle Begriffe mit "alpha" assoziiert identifizieren ich folgende Ausgabe (wie beabsichtigt):

> findAssocs(dtm, "alpha", 0.00) 
$alpha 
charlie bravo 
    0.58 0.33 

Ich könnte das tun Gleiches für "bravo" und erhalten Sie die folgende Ausgabe (wie vorgesehen):

> findAssocs(dtm, "bravo", 0.00) 
$bravo 
alpha 
0.33 

Da ich diese Zuordnungen für eine Anzahl von Begriffen finden möchte, habe ich einen Vektor an findAssocs übergeben, um die erforderliche Ausgabe zu erhalten. Wenn ich jedoch einen Vektor von Begriffen (chr) an die Funktion übergeben, ist die Ausgabe unterscheidet sich von der, die ich für einzelne Eingänge erhalten:

> findAssocs(dtm, c("alpha","bravo"), 0.00) 
$alpha 
charlie 
    0.58 

$bravo 
numeric(0) 

Eigentlich ist die assocation zwischen "alpha" und "bravo" weggelassen, welche nicht das Verhalten Das hätte ich hier erwartet. Die Funktion scheint die einzelnen Terme unabhängig voneinander zu behandeln und analysiert daher nicht die Korrelation zwischen "alpha" und "bravo", wenn sie beide an die Funktion in einem Vektor übergeben werden.

Kann jemand dieses Verhalten erklären und mir sagen, wie man es wegschmeißt? Ich konnte die Funktion für jeden einzelnen Begriff gelten als Abhilfe, aber das ist nicht wirklich praktisch ...

UPDATE

Was ich seltsam finde ist, dass die Korrelation zwischen "alpha" und "bravo" nicht weggelassen, wenn wir Plot die Verbände, z durch den folgenden Code:

> freqTerm <- findFreqTerms(dtm, 1) 
> freqTerm 
[1] "alpha" "bravo" "charlie" "zulu" 

plot(dtm, term=freqTerm, corThreshold=0.0, weighting=T, attrs=list(node=list(fixedsize=FALSE, shape="ellipse"))) 

Wie ist plot(dtm, term=freqTerm ... unterscheidet sich von "findAssocs()"?

+2

Es funktioniert nicht, weil 'findAssocs (dtm, c (" alpha "," bravo "), 0,00)' die Ausdrücke 'c (" alpha "," bravo ")' mit allen ** restlichen * vergleicht * * Begriffe im Korpus. Es berechnet nicht die paarweisen Korrelationen der Begriffe in dem Vektor, den Sie übergeben. –

+0

der richtige Weg, um zu tun, was Sie wollen, wäre 'sapply (c (" Alpha "," Bravo "), Funktion (x) findAssocs (dtm, x, 0.00)) ' – scoa

Antwort

0

tm::findAssocs() lässt direkte Vergleiche aus genau den Gründen aus, die im Kommentar von @Steven Beauport angegeben sind. Da Sie nach einer kleinen Menge von Begriffen suchen, die wahrscheinlich stark korreliert sind, scheint dies eher ein Fehler als ein Feature zu sein. Dies wird durch das Beispiel dieser Funktion veranschaulicht (siehe), wo die Begriffe oil und am ähnlichsten sind, aber dies wird durch das Weglassen jeder von dem anderen Assoziationsvektor maskiert.

Eine Alternative ist die äquivalente Funktion aus dem quanteda Paket zu verwenden:

library(quanteda) 
txt <- c("alpha bravo", "alpha charlie", "alpha charlie", "zulu") 
corp <- corpus(txt) 
dtm <- dfm(corp, verbose = FALSE) 
# this also works fine if you want to go straight from text: 
# dtm <- dfm(txt, verbose = FALSE) 

(simlist <- similarity(dtm, c("alpha","bravo"), margin = "features")) 
## similarity Matrix: 
## $alpha 
## charlie bravo zulu 
## 0.5774 0.3333 -1.0000 
## 
## $bravo 
## alpha zulu charlie 
## 0.3333 -0.3333 -0.5774 

Oder wenn Sie es als eine Matrix bevorzugen:

as.matrix(simlist) 
##    alpha  bravo 
## alpha 1.0000000 0.3333333 
## charlie 0.5773503 -0.5773503 
## bravo 0.3333333 1.0000000 
## zulu -1.0000000 -0.3333333 

similarity() als auch Cosinus Ähnlichkeiten tun kann, als andere Ähnlichkeiten, die in dem Proxy--Paket definiert sind, aber die (Pearson's) -Korrelations- und Cosinus-Methoden werden gegenwärtig in vollständig spärlicher Berechnung implementiert während die anderen (noch) nicht sind. Durch die Definition von margin = "documents" können Sie außerdem Dokumente anstelle von Begriffen vergleichen, zum Beispiel für Clustering.

+0

Jede Möglichkeit, die Sie auch wissen, warum die Plot-Funktion anders funktioniert (siehe mein Update in der obigen Frage) – BjoSch

+0

Es ist, weil die Plot-Methode für ein dtm-Objekt nichts mit findAssocs() zu tun hat - stattdessen ist es basierend auf der dtm, die die vollständige Matrix der Begriffe hat. –

Verwandte Themen