我正在尝试不同的东西,使用R语言中的不同技术来对大量词汇进行词汇化。最后,我设法使用了一个包koRpus
,它是TreeTagger
应用程序的包装器。
content.cc
是我的语料库,包含近7000个文档,平均字数约为300字。我设置了函数:
lemmatizeCorpus <- function(x) {
if (x != "") {
words.cc <- treetag(x, treetagger="manual", format="obj",
TT.tknz=FALSE, lang="en",
TT.options=list(path="c:/TreeTagger", preset="en"))
words.lm <- ifelse(words.cc@TT.res$token != words.cc@TT.res$lemma,
ifelse(words.cc@TT.res$lemma != "<unknown>", words.cc@TT.res$lemma, words.cc@TT.res$token),
words.cc@TT.res$token)
content.w <- toString(paste(words.lm, collapse = " "))
}
}
以这种方式执行:
content.lw <- sapply(X = content.cc$content, FUN = function(x) lemmatizeCorpus(x), USE.NAMES = F)
它带来了预期的效果 - 更改在TT词典中有根的单词,以及在此重要的是,使层次结构与语料库中的相同(文档数,单词位置,单词数)。问题是这可以工作大约一个小时(在我相当慢的机器上,但它运行的cp并不重要。)
我尝试将整个语料库合并到一个char矩阵中:stri_extract_all_words(content.cc$content)
并将语料库作为一个整体应用于treetag
函数中。它在大约5倍(相同的函数体)中更快,但是我迷失了尝试查找哪些单词属于哪个文档的索引,因为stri
提取的单词数量由treetag
执行并且相当不同一点点。那个循环是稳定的。
另一个尝试是使用来自tm
包的词干分析器,它很受欢迎,帮助和解决方案也可以在这个论坛上找到,但是它非常快地达到正则表达式内存限制并且进入循环抛出与当前方法相同的效果
我需要的是一些建议我可以用它做什么?我可以吗?也许不可能加快速度,因为TreeTagger
只是以这种方式工作而且速度不快。我知道这很有挑战性。例如,使用sapply
结果比纯循环快约2倍,因此它有一些改进。