2013-04-17 3 views
9

Я занимаюсь поиском текста в R с помощью tm -package. Все работает очень гладко. Однако одна проблема возникает после окончания (http://en.wikipedia.org/wiki/Stemming). Очевидно, что есть некоторые слова, которые имеют одинаковую основу, но важно, чтобы они не «сбивались» (поскольку эти слова означают разные вещи).Text-mining с tm-пакетом - word stemming

Для примера см. Ниже 4 текста. Здесь вы не можете использовать слова «лектор» или «лекция» («ассоциация» и «ассоциировать»). Однако это то, что делается на этапе 4.

Есть ли элегантное решение, как реализовать это для некоторых случаев/слов вручную (например, что «лектор» и «лекция» хранятся как две разные вещи)?

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

Это точка ствола. Вы делаете это, чтобы получить корневые слова. Если вы хотите сохранить различия, то не начинайте. –

+1

Я знаю. Но разве нет изящного способа изменить его для некоторых случаев? – majom

ответ

9

Я не 100%, что вы после этого и не полностью понимаете, как tm_map работы. Если я пойму, то последующие работы. Насколько я понимаю, вы хотите предоставить список слов, которые не должны быть исчерпаны. Я использую пакет qdap в основном потому, что я ленив, и у меня есть функция mgsub Мне нравится.

Обратите внимание, что я был расстроен с использованием mgsub и tm_map, поскольку он продолжал выдавать ошибку, поэтому я просто использовал lapply.

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) 

В основном это работает:

  1. заменял из уникального идентификатора ключа для поставляемых "NO STEM" слова (mgsub)
  2. то шток (используя stemDocument)
  3. затем вы меняете его и подставляете ключи идентификатора словом «NO STEM» (mgsub)
  4. Последний полный стебле (stemCompletion)

Вот результат:

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

Спасибо за помощь. Прекрасно работает. – majom

0

Вы также можете использовать следующий пакет для steeming слова: https://cran.r-project.org/web/packages/SnowballC/SnowballC.pdf.

Вам просто нужно использовать функцию wordStem, передавая вектор слов, которые должны выполняться, а также язык, с которым вы имеете дело. Чтобы точно знать строку языка, которую вы должны использовать, вы можете обратиться к методу getStemLanguages ​​, который вернет все возможные варианты для него.

С уважением

Смежные вопросы