2013-04-17 4 views
9

Ich mache etwas Text-Mining in R mit dem tm-Paket. Alles funktioniert sehr glatt. Ein Problem tritt jedoch nach dem Stemmen (http://en.wikipedia.org/wiki/Stemming) auf. Offensichtlich gibt es einige Wörter, die den gleichen Stamm haben, aber es ist wichtig, dass sie nicht "zusammengewürfelt" werden (da diese Wörter verschiedene Dinge bedeuten).Text-Mining mit dem tm-Paket - Wort stemming

Für ein Beispiel siehe die folgenden 4 Texte. Hier dürfen Sie nicht "Dozent" oder "Vortrag" ("Assoziation" und "Associate") austauschbar verwenden. Dies ist jedoch, was in Schritt 4 getan wird.

Gibt es eine elegante Lösung, wie dies für einige Fälle/Wörter manuell implementieren (z. B. dass "Dozent" und "Vortrag" als zwei verschiedene Dinge gehalten werden)?

texts <- c("i am member of the XYZ association", 
"apply for our open associate position", 
"xyz memorial lecture takes place on wednesday", 
"vote for the most popular lecturer") 

# Step 1: Create corpus 
corpus <- Corpus(DataframeSource(data.frame(texts))) 

# Step 2: Keep a copy of corpus to use later as a dictionary for stem completion 
corpus.copy <- corpus 

# Step 3: Stem words in the corpus 
corpus.temp <- tm_map(corpus, stemDocument, language = "english") 

inspect(corpus.temp) 

# Step 4: Complete the stems to their original form 
corpus.final <- tm_map(corpus.temp, stemCompletion, dictionary = corpus.copy) 

inspect(corpus.final) 
+2

Dies ist der Punkt der Stemming. Du machst es um Wurzelwörter zu bekommen. Wenn Sie Unterschiede beibehalten wollen, dann stemmen Sie sich nicht. –

+1

Ich weiß. Aber gibt es nicht eine elegante Möglichkeit, es für einige Fälle zurück zu ändern? – majom

Antwort

9

Ich bin nicht 100%, was Sie nach und nicht total bekommen, wie tm_map funktioniert. Wenn ich das dann verstehe, funktioniert das. Wie ich verstehe, möchten Sie eine Liste von Wörtern liefern, die nicht aufgehalten werden sollten. Ich verwende das qdap-Paket hauptsächlich, weil ich faul bin und es eine Funktion mgsub hat, die ich mag.

Beachten Sie, dass ich mit der Verwendung mgsub und tm_map frustriert wurde, da es einen Fehler geworfen hat, so dass ich nur lapply stattdessen verwendet habe.

texts <- c("i am member of the XYZ association", 
    "apply for our open associate position", 
    "xyz memorial lecture takes place on wednesday", 
    "vote for the most popular lecturer") 

library(tm) 
# Step 1: Create corpus 
corpus.copy <- corpus <- Corpus(DataframeSource(data.frame(texts))) 

library(qdap) 
# Step 2: list to retain and indentifier keys 
retain <- c("lecturer", "lecture") 
replace <- paste(seq_len(length(retain)), "SPECIAL_WORD", sep="_") 

# Step 3: sub the words you want to retain with identifier keys 
corpus[seq_len(length(corpus))] <- lapply(corpus, mgsub, pattern=retain, replacement=replace) 

# Step 4: Stem it 
corpus.temp <- tm_map(corpus, stemDocument, language = "english") 

# Step 5: reverse -> sub the identifier keys with the words you want to retain 
corpus.temp[seq_len(length(corpus.temp))] <- lapply(corpus.temp, mgsub, pattern=replace, replacement=retain) 

inspect(corpus)  #inspect the pieces for the folks playing along at home 
inspect(corpus.copy) 
inspect(corpus.temp) 

# Step 6: complete the stem 
corpus.final <- tm_map(corpus.temp, stemCompletion, dictionary = corpus.copy) 
inspect(corpus.final) 

Im Grunde funktioniert es durch:

  1. eine eindeutige Kennung Schlüssel für die gelieferten "NO STEM" Worte die Haftung verbessernde aus (die mgsub)
  2. dann stammen die Sie (mit stemDocument)
  3. Als nächstes kehren Sie es um und unterlegen Sie die Identifier-Tasten mit den Worten "NO STEM" (mgsub)
  4. letzten runden das Stem (stemCompletion)

Hier ist die Ausgabe:

## >  inspect(corpus.final) 
## A corpus with 4 text documents 
## 
## The metadata consists of 2 tag-value pairs and a data frame 
## Available tags are: 
## create_date creator 
## Available variables in the data frame are: 
## MetaID 
## 
## $`1` 
## i am member of the XYZ associate 
## 
## $`2` 
## for our open associate position 
## 
## $`3` 
## xyz memorial lecture takes place on wednesday 
## 
## $`4` 
## vote for the most popular lecturer 
+0

Danke für Ihre Hilfe. Funktioniert super. – majom

0

Sie auch das folgende Paket für steeming Wörter verwenden können: https://cran.r-project.org/web/packages/SnowballC/SnowballC.pdf.

Sie müssen nur die Funktion wordStem verwenden, den Vektor der zu stemmenden Wörter übergeben und auch die Sprache, mit der Sie es zu tun haben. Um die genaue Sprachzeichenfolge zu kennen, die Sie verwenden müssen, können Sie sich auf die Methode getStemLanguages ​​ beziehen, die alle möglichen Optionen dafür zurückgibt.

Mit freundlichen Grüßen