R Snowball词干分析器只对最后一个词进行词干处理

R Snowball词干分析器只对最后一个词进行词干处理,r,stemming,tm,R,Stemming,Tm,我想使用R中的tm包在纯文本文档的语料库中对文档进行词干分析。当我将Snowballstember函数应用于语料库的所有文档时,只对每个文档的最后一个单词进行词干分析 library(tm) library(Snowball) library(RWeka) library(rJava) path <- c("C:/path/to/diretory") corp <- Corpus(DirSource(path), readerControl = list

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

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
library(tm)
图书馆(雪球)
图书馆(鲁韦卡)
图书馆(rJava)
路径vec2 stemDocument(vec2)
[1] “跑步者”“跑步者”“快乐”“快乐”公司检查(公司)
包含两个文本文档的语料库
元数据由2个标记值对和一个数据帧组成
可用的标签有:
创建日期创建者
数据框中的可用变量包括:
梅泰德
[[1]]
跑步
[[2]]
幸福快乐
>corp2 corp2检查(corp2)
包含两个文本文档的语料库
元数据由2个标记值对和一个数据帧组成
可用的标签有:
创建日期创建者
数据框中的可用变量包括:
梅泰德
$`1.txt`
跑步者跑步
$`2.txt`
快乐快乐

我看到的问题是wordStem接受了一个词向量,但语料库明文阅读器假设在它读取的文档中,每个词都在自己的行上。换句话说,这会使明文阅读器感到困惑,因为您的文档中会有3个“单词”

From ancient grudge break to new mutiny,
Where civil blood makes civil hands unclean.
From forth the fatal loins of these two foes
相反,文档应该是

From
ancient
grudge
break
to
new
mutiny
where 
civil
...etc...
还要注意的是,标点符号也会混淆词干,所以你也必须把它们去掉

不修改实际文档的另一种方法是定义一个函数,该函数将进行分隔并删除出现在单词之前或之后的非字母数字。这里有一个简单的例子:

wordStem2 <- function(x) {
    mywords <- unlist(strsplit(x, " "))
    mycleanwords <- gsub("^\\W+|\\W+$", "", mywords, perl=T)
    mycleanwords <- mycleanwords[mycleanwords != ""]
    wordStem(mycleanwords)
}

corpA <- tm_map(mycorpus, wordStem2);
corpB <- Corpus(VectorSource(corpA));

wordStem2加载所需库

library(tm)
library(Snowball)
创建向量

vec<-c("running runner runs","happyness happies")
结果是

vec1[[1]]
<<PlainTextDocument (metadata: 7)>>
run runner run
vec1[[1]]
跑步
您需要记住的最重要的事情是始终在语料库中呈现文档类。
我希望这是使用加载的两个库中的函数来解决您的问题的简化解决方案。

Rstem不是Snowball的R接口吗?因此,您应该使用图书馆(Rstem)和tm_地图(corp,wordStem)。谢谢您的评论。我试过了,结果是一样的。我将在上面举一个更好的例子来进一步说明这个问题。谢谢,词干现在起作用了。然而,应用wordStem和SnowballStemmer的结果是单独的字符向量。这导致函数DocumentTermMatrix在生成的语料库上不再起作用。“我怎样才能让它起作用呢?”克里斯蒂安我编辑了我的答案。如果有更简单的方法,我不知道。
vec<-Corpus(VectorSource(vec))
class(vec[[1]])

vec[[1]]
<<PlainTextDocument (metadata: 7)>>
running runner runs
stemDocumentfix <- function(x)
{
    PlainTextDocument(paste(stemDocument(unlist(strsplit(as.character(x), " "))),collapse=' '))
}
vec1 = tm_map(vec, stemDocumentfix)
vec1[[1]]
<<PlainTextDocument (metadata: 7)>>
run runner run