Лемматизация с использованием 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"
Другие вопросы по тегам