web-dev-qa-db-ja.com

tm-packageによるテキストマイニング-Wordステミング

Rでtm- packageを使用してテキストマイニングを行っています。すべてが非常にスムーズに動作します。ただし、ステミング後に問題が1つ発生します( http://en.wikipedia.org/wiki/Stemming )。明らかに、同じ語幹を持ついくつかの単語がありますが、それらが「一緒にスローされない」ことが重要です(これらの単語は異なるものを意味するため)。

例については、以下の4つのテキストを参照してください。ここでは、「講師」または「講義」(「関連付け」と「関連付け」)を交換して使用することはできません。ただし、これはステップ4で行われることです。

いくつかのケース/単語に対してこれを手動で実装するエレガントなソリューションはありますか(たとえば、「講師」と「講義」は2つの異なるものとして保持されます)?

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

私はあなたが何をしているのか100%ではなく、tm_mapの動作を完全には理解していません。私が理解すれば、次の作品。私が理解しているように、語幹処理されるべきではない単語のリストを提供したいと考えています。 qdapパッケージを使用しているのは、主に私が怠惰で、mgsub関数が好きだからです。

mgsubtm_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
12
Tyler Rinker

単語のスティーミングに次のパッケージを使用することもできます: https://cran.r-project.org/web/packages/SnowballC/SnowballC.pdf

関数wordStemを使用して、語幹処理する単語のベクトルと処理する言語を渡すだけです。使用する必要がある正確な言語文字列を知るには、メソッドgetStemLanguagesを参照します。これにより、可能なすべてのオプションが返されます。

敬具

0
brunoazev