проблемы в stemming в текстовом анализе (шведские данные) - PullRequest
0 голосов
/ 17 октября 2018

В следующих кодах моя цель - уменьшить количество слов с одинаковым основанием.Например, 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"   

Вы знаете, как это исправить?

Ответы [ 2 ]

0 голосов
/ 17 октября 2018

Вы почти там, но использование 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"   

Для такого рода работ я склонен использовать квантеду.Лучшая поддержка и работает намного лучше, чем тм.

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
0 голосов
/ 17 октября 2018

Использование 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

...