1

在以下代码中,我的目标是减少具有相同词干的单词数量。比如瑞典语kompis在英语中指朋友,词根相近的词有kompisar、kompiserna。

rm(list=ls())
Sys.setlocale("LC_ALL","sv_SE.UTF-8")
library(tm)
library(SnowballC)
kompis <- c("kompisar", "kompis", "kompiserna")
stem_doc <- stemDocument(kompis, language="swedish")
stem_doc
1] "kompis" "kompis" "kompis"

我创建了一个包含单词 kompis、kompisar、kompiserna 的示例文本文件。然后,我通过以下代码在语料库中做了一些预处理:

        text <-  c("TV och vara med kompisar.",
               "Jobba på kompis huset",
               "Ta det lugnt, umgås med kompisar.",
               "Umgås med kompisar, vänner ",
               "kolla anime med kompiserna")
corpus.prep <- Corpus(VectorSource(text), readerControl    =list(reader=readPlain, language="swe"))
corpus.prep <- tm_map(corpus.prep, PlainTextDocument)
corpus.prep <- tm_map(corpus.prep, stemDocument,language = "swedish")
head(content(corpus.prep[[1]]))

结果如下。但是,它包含原始单词而不是相同的词干:kompis。

1] "TV och vara med kompisar."       
2] "Jobba på kompi huset"            
3] "Ta det lugnt, umgå med kompisar."
4] "Umgås med kompisar, vänner"      
5] "kolla anim med kompiserna"   

你知道如何解决吗?

4

2 回答 2

1

你快到了,但使用PlainTextDocument正在干扰你的目标。

以下代码将返回您的预期结果。我正在使用删除标点符号,否则词干将不适用于句末的作品。您还将看到在两次 tm_map 调用之后出现的警告消息。你可以忽略这些。

corpus.prep <- Corpus(VectorSource(text), readerControl    =list(reader=readPlain, language="swe"))
corpus.prep <- tm_map(corpus.prep, removePunctuation)
corpus.prep <- tm_map(corpus.prep, stemDocument, language = "swedish")

head(content(corpus.prep))

[1] "TV och var med kompis"         "Jobb på kompis huset"          "Ta det lugnt umgås med kompis" "Umgås med kompis vänn"        
[5] "koll anim med kompis"   

对于这类工作,我倾向于使用 quanteda。比 tm 更好的支持和更好的工作。

library(quanteda)

# remove_punct not really needed as quanteda treats the "." as a separate token.
my_dfm <- dfm(text, remove_punct = TRUE) 
dfm_wordstem(my_dfm, language = "swedish")

Document-feature matrix of: 5 documents, 15 features (69.3% sparse).
5 x 15 sparse Matrix of class "dfm"
       features
docs    tv och var med kompis jobb på huset ta det lugnt umgås vänn koll anim
  text1  1   1   1   1      1    0  0     0  0   0     0     0    0    0    0
  text2  0   0   0   0      1    1  1     1  0   0     0     0    0    0    0
  text3  0   0   0   1      1    0  0     0  1   1     1     1    0    0    0
  text4  0   0   0   1      1    0  0     0  0   0     0     1    1    0    0
  text5  0   0   0   1      1    0  0     0  0   0     0     0    0    1    1
于 2018-10-17T16:42:52.297 回答
1

使用tidytext,请参阅问题 #17

library(dplyr)
library(tidytext)
library(SnowballC)

txt <- c("TV och vara med kompisar.",
         "Jobba på kompis huset",
         "Ta det lugnt, umgås med kompisar.",
         "Umgås med kompisar, vänner ",
         "kolla anime med kompiserna")

data_frame(txt = txt) %>%
  unnest_tokens(word, txt) %>%
  mutate(word = wordStem(word, "swedish"))

wordStem功能snowballC来自多种语言的软件包,请参见getStemLanguages

于 2018-10-17T15:04:29.340 回答