r - Snowball Stemmer 只词干最后一个词

标签 r stemming tm

我想使用 R 中的 tm 包对纯文本文档语料库中的文档进行词干。当我将 SnowballStemmer 函数应用于语料库的所有文档时,只有每个文档的最后一个词会被词干。

library(tm)
library(Snowball)
library(RWeka)
library(rJava)
path <- c("C:/path/to/diretory")
corp <- Corpus(DirSource(path),
               readerControl = list(reader = readPlain, language = "en_US",
                                    load = TRUE))
tm_map(corp,SnowballStemmer) #stemDocument has the same problem

我认为这与将文档读入语料库的方式有关。用一些简单的例子来说明这一点:
> vec<-c("running runner runs","happyness happies")
> stemDocument(vec) 
   [1] "running runner run" "happyness happi" 

> vec2<-c("running","runner","runs","happyness","happies")
> stemDocument(vec2)
   [1] "run"    "runner" "run"    "happy"  "happi" <- 

> corp<-Corpus(VectorSource(vec))
> corp<-tm_map(corp, stemDocument)
> inspect(corp)
   A corpus with 2 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]]
   run runner run

   [[2]]
   happy happi

> corp2<-Corpus(DirSource(path),readerControl=list(reader=readPlain,language="en_US" ,  load=T))
> corp2<-tm_map(corp2, stemDocument)
> inspect(corp2)
   A corpus with 2 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.txt`
   running runner runs

   $`2.txt`
   happyness happies

最佳答案

加载所需的库

library(tm)
library(Snowball)

创建矢量
vec<-c("running runner runs","happyness happies")

从向量创建语料库
vec<-Corpus(VectorSource(vec))

非常重要的是检查我们的语料库的类并保留它,因为我们想要一个 R 函数理解的标准语料库
class(vec[[1]])

vec[[1]]
<<PlainTextDocument (metadata: 7)>>
running runner runs

这可能会告诉您纯文本文档

所以现在我们修改我们错误的stemDocument 函数。首先,我们将纯文本转换为字符,然后拆分文本,应用现在工作正常的 stemDocument 并将其粘贴回一起。最重要的是,我们将输出重新转换为 tm 包给出的 PlainTextDocument。
stemDocumentfix <- function(x)
{
    PlainTextDocument(paste(stemDocument(unlist(strsplit(as.character(x), " "))),collapse=' '))
}

现在我们可以在我们的语料库上使用标准的 tm_map
vec1 = tm_map(vec, stemDocumentfix)

结果是
vec1[[1]]
<<PlainTextDocument (metadata: 7)>>
run runner run

您需要记住的最重要的事情是始终保留语料库中的文档类别。
我希望这是使用加载的 2 个库中的函数来解决您的问题的简化解决方案。

关于r - Snowball Stemmer 只词干最后一个词,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7263478/

相关文章:

r - 使用 dplyr 为不同组选择不同数量的 top_n

r - ggplot2:将一行放在前面,但保存颜色

regex - 在 linux bash 中使用正则表达式更改输出文件名

c - 在 C 中使用 tm 时出现段错误

r - 使用 dplyr 汇总并统计分组 df 中唯一值的数量

java - 在 Lucene 中关闭词干提取

r - 如何使用 quanteda 提取 ngram 中所有单词的词干?

r - 如何删除 tm 包内带有单词的括号?

R tm 包 : utf-8 text

algorithm - 在 Porter Stemming 算法中,包含 SS -> SS 等身份规则的目的是什么?