Я не думаю, что стемминг - это то, что вы хотите сделать здесь.Стеммеры специфичны для языка и основаны на общих инфлективных морфологических моделях в этом языке.Например, в английском языке у вас есть бесконечные формы глаголов (например, «ходить»), которые становятся склонными для времени, аспекта и лица / числа: я иду против Она идет (прогулка + с), я иду противходил (walk + ed), также ходил + ing и т. д. Stemmers кодифицирует эти стохастические распределения в «правила», которые затем применяются к «слову» для превращения в его основание.Другими словами, для ваших кодов операций не существует готового стеммера.
У вас есть два возможных решения: (1) создать словарь или (2) написать свой собственный стеммер.Если у вас не так много вариантов для сопоставления, вероятно, проще всего создать собственный словарь, в котором вы используете все свои варианты слов в качестве ключей, а значение имеет лемма / stem / canonical-form.
addi -> add
addf -> add
multi -> mult
multf -> mult
Если ваши потенциальные сопоставления слишком многочисленны, чтобы их можно было сделать вручную, тогда вы можете написать собственный модуль регулярных выражений для сопоставления и преобразования.Вот как вы можете сделать это в R. Следующая функция берет входное слово и пытается сопоставить его с шаблоном, представляющим все варианты основы для всех n
основ вашей коллекции.Он возвращает 1 x n
data.frame с 1, указывающим на наличие, или 0, указывающим на отсутствие совпадения вариантов.
#' Return word's stem data.frame with each column indicating presence (1) or
#' absence (0) of stem in that word.
map_to_stem_df <- function(word) {
## named list of patterns to match
stem_regex <- c(add = "^add[if]$",
mult = "^mult[if]$")
## iterate across the stem names
res <- lapply(names(stem_regex), function(stem) {
pat <- stem_regex[stem]
## if pattern matches word, then 1 else 0
if (grepl(pattern = pat, x = word)) {
pat_match <- 1
} else {
pat_match <- 0
}
## create 1x1 data.frame for stem
df <- data.frame(pat_match)
names(df) <- stem
return(df)
})
## bind all cols into single row data.frame 1 x length(stem_regex) & return
data.frame(res)
}
map_to_stem_df("addi")
# add mult
# 1 0
map_to_stem_df("additional")
# add mult
# 0 0