文本分析中的词干提取问题(瑞典数据)
problems in stemming in text analysis (Swedish data)
在下面的代码中,我的目标是减少具有相同词干的单词的数量。
例如瑞典语中的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"
你知道怎么解决吗?
使用 tidytext
,参见 issue #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
您快完成了,但是使用 PlainTextDocument
会干扰您的目标。
以下代码将 return 您的预期结果。我正在使用删除标点符号,否则词干将不适用于句子末尾的作品。您还会看到在两次 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
在下面的代码中,我的目标是减少具有相同词干的单词的数量。 例如瑞典语中的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"
你知道怎么解决吗?
使用 tidytext
,参见 issue #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
您快完成了,但是使用 PlainTextDocument
会干扰您的目标。
以下代码将 return 您的预期结果。我正在使用删除标点符号,否则词干将不适用于句子末尾的作品。您还会看到在两次 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