Как использовать собственный алгоритм стемминга с пакетом tm в R?

Как я могу заменить стеммер на основе портера в пакете R tm другим, который лучше соответствует моим потребностям? В данном случае это cistem (https://github.com/FlorianSchwendinger/cistem/). Однако Cistem принимает отдельные слова (или вектор) в качестве аргумента:

install_github("FlorianSchwendinger/cistem")
library("cistem")
> cistem("arbeiten")
[1] "arbei"
> cistem(c("arbeiten", "Arbeit"))
[1] "arbei"  "arbeit"

тогда как встроенный стеммер берет весь документ

corpus <- tm_map(corpus, stemDocument, language = "german") 

Как интегрировать стеммер CISTEM в пакет tm?

Любая помощь приветствуется.


person kabauter    schedule 05.08.2019    source источник


Ответы (1)


Вы можете интегрировать другие функции с content_transformer, которые затем можно использовать в вызове tm_map. Вам просто нужно знать, что нужно принимающей функции. В этом случае cistem нужны слова, поэтому вы можете использовать функцию words из пакета NLP, чтобы добраться туда (автоматически загружается при загрузке библиотеки tm). Также необходимы unlist и lapply.

* Примечание. * cistem возвращает слова в нижнем регистре, поэтому имейте в виду этот факт.

library(cistem)
library(tm)

# Some text
txt <- c("Dies ist ein deutscher Text.", 
  "Dies ist ein anderer deutscher Text.")

# the stemmer based on cistem
my_stemmer <- content_transformer(function(x) {
  unlist(lapply(x, function(line) {    # unlist the corpus and lapply over the list
    paste(cistem(words(line)), collapse = " "))  # paste the words back together.
    }
    )
  })

my_corpus <- VCorpus(VectorSource(txt))

# stem the corpus
my_stemmed_corpus <- tm_map(my_corpus, my_stemmer)


# check output
inspect(my_stemmed_corpus[[1]])
<<PlainTextDocument>>
Metadata:  7
Content:  chars: 26

dies ist ein deutsch text.

inspect(my_stemmed_corpus[[2]])  
<<PlainTextDocument>>
Metadata:  7
Content:  chars: 32

dies ist ein ander deutsch text.
person phiver    schedule 05.08.2019
comment
Большое спасибо! Была только небольшая опечатка: paste(cistem(words(line)), collapse = " ")) } должно быть paste(cistem(words(line)), collapse = " ")} ) - person kabauter; 07.08.2019
comment
Спасибо, что указали, что cistem возвращает текст в нижнем регистре. Следует отметить, что стеммер cistem следует применять перед переводом текста в нижний регистр, поскольку его основа чувствительна к регистру. - person kabauter; 07.08.2019