Как заменить токены (слова) на версии слов из моей таблицы?
Я получил такие данные (упрощенно):
library(quanteda)
Пример данных
myText <- c("ala ma kotka", "kasia ma pieska")
myDF <- data.frame(myText)
myDF$myText <- as.character(myDF$myText)
лексический анализ
tokens <- tokens(myDF$myText, what = "word",
remove_numbers = TRUE, remove_punct = TRUE,
remove_symbols = TRUE, remove_hyphens = TRUE)
stemming с моим собственным словарем выборки данных
Origin <- c("kot", "pies")
Word <- c("kotek","piesek")
myDict <- data.frame(Origin, Word)
myDict$Origin <- as.character(myDict$Origin)
myDict$Word <- as.character(myDict$Word)
что я имею
tokens[1]
[1] "Ala" "ma" "kotka"
что я хотел бы получить
tokens[1]
[1] "Ala" "ma" "kot"
tokens[2]
[1] "Kasia" "ma" "pies"
1 ответ
Здесь был дан ответ на аналогичный вопрос, но поскольку заголовок этого вопроса (и принятый ответ) не дают очевидной ссылки, я покажу вам, как это относится конкретно к вашему вопросу. Я также предоставлю дополнительную информацию ниже для реализации вашего собственного базового стеммера с использованием подстановочных знаков для суффиксов.
Ручное сопоставление стеблей с перекошенными формами
Самый простой способ сделать это - использовать пользовательский словарь, в котором ключи - это ваши основы, а значения - это перекошенные формы. Вы можете использовать tokens_lookup()
с exclusive = FALSE, capkeys = FALSE
варианты для преобразования перекошенных терминов в их основы.
Обратите внимание, что я немного изменил ваш пример, чтобы упростить его и исправить ошибки.
library("quanteda")
packageVersion("quanteda")
[1] ‘0.99.9’
# no need for the data.frame() call
myText <- c("ala ma kotka", "kasia ma pieska")
toks <- tokens(myText,
remove_numbers = TRUE, remove_punct = TRUE,
remove_symbols = TRUE, remove_hyphens = TRUE)
Origin <- c("kot", "kot", "pies", "pies")
Word <- c("kotek", "kotka", "piesek", "pieska")
Затем мы создаем словарь следующим образом. Начиная с quanteda v0.99.9, значения с одинаковыми ключами объединяются, так что вы можете иметь список, отображающий несколько разных измененных форм на одни и те же ключи. Здесь я должен был добавить новые значения, так как формы перегиба в вашем оригинале Word
вектор не был найден в myText
пример.
temp_list <- as.list(Word)
names(temp_list) <- Origin
(stem_dict <- dictionary(temp_list))
## Dictionary object with 2 key entries.
## - [kot]:
## - kotek, kotka
## - [pies]:
## - piesek, pieska
затем tokens_lookup()
делает свое волшебство.
tokens_lookup(toks, dictionary = stem_dict, exclusive = FALSE, capkeys = FALSE)
## tokens from 2 documents.
## text1 :
## [1] "ala" "ma" "kot"
##
## text2 :
## [1] "kasia" "ma" "pies"
Подстановочные знаки всех основ от общих корней
Альтернативой является реализация вашего собственного стеммера с использованием подстановочного знака "glob" для представления всех суффиксов для вашего Origin
вектор, который (здесь, по крайней мере) дает одинаковые результаты:
temp_list <- lapply(unique(Origin), paste0, "*")
names(temp_list) <- unique(Origin)
(stem_dict2 <- dictionary(temp_list))
# Dictionary object with 2 key entries.
# - [kot]:
# - kot*
# - [pies]:
# - pies*
tokens_lookup(toks, dictionary = stem_dict, exclusive = FALSE, capkeys = FALSE)
## tokens from 2 documents.
## text1 :
## [1] "ala" "ma" "kot"
##
## text2 :
## [1] "kasia" "ma" "pies"