Как заменить токены (слова) на версии слов из моей таблицы?

Я получил такие данные (упрощенно):

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" 
Другие вопросы по тегам