web-dev-qa-db-fra.com

Exploration de texte avec tm-package - Word stemming

Je suis en train d'explorer du texte dans R avec le package tm-. Tout fonctionne très bien. Cependant, un problème survient après avoir pris racine ( http://en.wikipedia.org/wiki/Stemming ). De toute évidence, certains mots ont la même racine, mais il est important qu'ils ne soient pas "jetés ensemble" (car ces mots signifient des choses différentes). 

Pour un exemple, voir les 4 textes ci-dessous. Ici, vous ne pouvez pas utiliser "conférencier" ou "lecture" ("association" et "associé") interchangeables. Cependant, c'est ce qui est fait à l'étape 4. 

Existe-t-il une solution élégante pour implémenter cela manuellement dans certains cas/mots (par exemple, "conférencier" et "conférencier" sont conservés sous deux aspects différents)?

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)
10
majom

Je ne suis pas à 100% ce que vous recherchez et je ne comprends pas tout à fait comment fonctionne tm_map. Si je comprends alors les travaux suivants. Si je comprends bien, vous souhaitez fournir une liste de mots qui ne devraient pas être écrasés. J'utilise le paquet qdap principalement parce que je suis paresseux et qu'il a une fonction mgsub que j'aime bien.

Notez que je suis frustré par l’utilisation de mgsub et tm_map car il continue de générer une erreur, aussi j’ai simplement utilisé lapply à la place.

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)

Fondamentalement, cela fonctionne par:

  1. remplacement d'une clé d'identification unique pour les mots "NO STEM" fournis (la mgsub)
  2. alors vous dérivez (en utilisant stemDocument
  3. ensuite, vous inversez et placez les clés d’identification avec les mots "NO STEM" (la mgsub)
  4. dernière compléter la tige (stemCompletion)

Voici le résultat:

## >     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
10
Tyler Rinker

Vous pouvez également utiliser le paquet suivant pour les mots suivis: https://cran.r-project.org/web/packages/SnowballC/SnowballC.pdf

Vous devez juste utiliser la fonction wordStem , en passant le vecteur de mots à tronquer ainsi que le langage que vous utilisez. Pour connaître exactement la chaîne de langue que vous devez utiliser, vous pouvez vous reporter à la méthode getStemLanguages ​​, qui renverra toutes les options possibles.

Sincères amitiés

0
brunoazev