gpt4 book ai didi

r - 使用哈希字典的词形还原函数不适用于 R 中的 tm 包

转载 作者:行者123 更新时间:2023-12-04 11:05:56 25 4
gpt4 key购买 nike

我想使用大型外部词典(格式如下面的 txt 变量)对波兰语文本进行词形还原。我不走运,有一个选项 Polish with popular text mining packages。答案https://stackoverflow.com/a/45790325/3480717 @DmitriySelivanov 的作品适用于简单的文本向量。 (我还从词典和语料库中删除了波兰语变音符号。)该函数适用于文本向量。

不幸的是,它不适用于 tm 生成的语料库格式。让我粘贴 Dmitriy 的代码:

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"

现在我想将它应用于 tm 语料库“文档”,这是我将在 tm 生成的语料库上与 tm 包一起使用的示例语法。

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

该函数适用于文本向量,但不适用于 tm 语料库。提前感谢您的建议(如果它不能与 tm 一起使用,甚至可以将此功能与其他文本挖掘包一起使用)。

最佳答案

我在这里看到两个问题。 1)您的自定义函数返回一个列表,而它应该返回一个字符串向量;和 2) 你传递了一个错误的 lemma_hashmap 参数。

解决第一个问题的快速解决方法是在返回函数结果之前使用 paste() 和 sapply()。

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]
}

# paste together, return a vector
sapply(tokens_list, (function(i){paste(i, collapse = " ")}))
}

我们可以运行您帖子的相同示例。

texts = c("Abadanowi abadańczykach OutOfVocabulary", 
"abadańczyk Abadan OutOfVocabulary")
lemma_tokenizer(texts, lemma_hm)
[1] "Abadan abadańczyk OutOfVocabulary" "abadańczyk Abadan OutOfVocabulary"

现在,我们可以使用 tm_map。只需确保使用 lemma_hm(即变量)而不是“lemma_hm”(字符串)作为参数。

docs <- SimpleCorpus(VectorSource(texts))
out <- tm_map(docs, (function(x) {lemma_tokenizer(x, lemma_hashmap=lemma_hm)}))
out[[1]]$content
[1] "Abadan abadańczyk OutOfVocabulary"

关于r - 使用哈希字典的词形还原函数不适用于 R 中的 tm 包,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46122591/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com