Лемматизация с использованием txt файла с леммами в R
Я хотел бы использовать внешний текстовый файл с польскими леммами, структурированными следующим образом: (источник лемм для многих других языков http://www.lexiconista.com/datasets/lemmatization/)
Abadan Abadanem
Abadan Abadanie
Abadan Abadanowi
Abadan Abadanu
abadańczyk abadańczycy
abadańczyk abadańczyka
abadańczyk abadańczykach
abadańczyk abadańczykami
abadańczyk abadańczyki
abadańczyk abadańczykiem
abadańczyk abadańczykom
abadańczyk abadańczyków
abadańczyk abadańczykowi
abadańczyk abadańczyku
abadanka abadance
abadanka abadanek
abadanka abadanką
abadanka abadankach
abadanka abadankami
Какие пакеты и с каким синтаксисом позволят мне использовать такую базу данных txt, чтобы лемматизировать мою сумку слов. Я понимаю, что для английского языка есть Wordnet, но не повезло тем, кто хотел бы использовать эту функциональность для редких языков.
Если нет, может ли эта база данных быть преобразована для использования с любым пакетом, который обеспечивает лемматизацию? Возможно, преобразовав это в широкую форму? Например, форма, используемая бесплатным конкордером AntConc ( http://www.laurenceanthony.net/software/antconc/)
Abadan -> Abadanem, Abadanie, Abadanowi, Abadanu
abadańczyk -> abadańczycy, abadańczyka, abadańczykach
etc.
Вкратце: как можно выполнить лемматизацию с помощью лемм в txt-файле в любом из известных пакетов интеллектуального анализа текста CRAN R? Если так, как отформатировать такой текстовый файл?
ОБНОВЛЕНИЕ: Уважаемый @DmitriySelivanov Я избавился от всех диакритических знаков, теперь я хотел бы применить его к тм корпусу "документы"
docs <- tm_map(docs, function(x) lemma_tokenizer(x, lemma_hashmap="lemma_hm"))
и я попробовал это как токенизатор
LemmaTokenizer <- function(x) lemma_tokenizer(x, lemma_hashmap="lemma_hm")
docsTDM <-
DocumentTermMatrix(docs, control = list(wordLengths = c(4, 25), tokenize=LemmaTokenizer))
Это выдает у меня ошибку:
Error in lemma_hashmap[[tokens]] :
attempt to select more than one element in vectorIndex
Функция работает с вектором текстов как очарование, хотя.
1 ответ
Я предполагаю, что здесь нет ничего общего с пакетами интеллектуального анализа текста для этой задачи. Вам нужно просто заменить слово во втором столбце словом в первом столбце. Вы можете сделать это с помощью создания hashmap (например, https://github.com/nathan-russell/hashmap).
Ниже приведен пример того, как вы можете создать "лемматизирующий" токенайзер, который вы можете легко использовать в text2vec (и я думаю, что и quanteda).
Вклад в создание такого "лемматизирующего" пакета очень приветствуется - будет очень полезным.
library(hashmap)
library(data.table)
txt =
"Abadan Abadanem
Abadan Abadanie
Abadan Abadanowi
Abadan Abadanu
abadańczyk abadańczycy
abadańczyk abadańczykach
abadańczyk abadańczykami
"
dt = fread(txt, header = F, col.names = c("lemma", "word"))
lemma_hm = hashmap(dt$word, dt$lemma)
lemma_hm[["Abadanu"]]
#"Abadan"
lemma_tokenizer = function(x, lemma_hashmap,
tokenizer = text2vec::word_tokenizer) {
tokens_list = tokenizer(x)
for(i in seq_along(tokens_list)) {
tokens = tokens_list[[i]]
replacements = lemma_hashmap[[tokens]]
ind = !is.na(replacements)
tokens_list[[i]][ind] = replacements[ind]
}
tokens_list
}
texts = c("Abadanowi abadańczykach OutOfVocabulary",
"abadańczyk Abadan OutOfVocabulary")
lemma_tokenizer(texts, lemma_hm)
#[[1]]
#[1] "Abadan" "abadańczyk" "OutOfVocabulary"
#[[2]]
#[1] "abadańczyk" "Abadan" "OutOfVocabulary"