在R中使用带有lemmes的txt文件进行词形还原

Lemmatization using txt file with lemmes in R

我想使用波兰文词条结构如下的外部 txt 文件: (许多其他语言的引理来源 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.

简而言之:如何在任何已知的 CRAN R 文本挖掘包中使用 txt 文件中的引理进行词形还原?如果是这样,如何格式化这样的txt文件?

更新:亲爱的@DmitriySelivanov 我去掉了所有变音符号,现在我想将它应用到 tm 语料库 "docs"

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 

该函数使用文本矢量作为魅力。

我的猜测是,这里与此任务的文本挖掘包无关。您只需要用第一列中的单词替换第二列中的单词。您可以通过创建哈希图来实现(例如 https://github.com/nathan-russell/hashmap)。

下面是如何创建 "lemmatizing" 标记器的示例,您可以在 text2vec 中轻松使用它(我猜 quanteda)。

贡献 以创建这样的 "lemmatizing" 包非常受欢迎 - 将非常有用。

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"