在 tm
库中是否有预先构建的函数,或者与之兼容的函数可用?
我的当前语料库已经加载到 tm 中,类似以下内容:
s1 <- "This is a long, informative document with real words and sentence structure: introduction to teaching third-graders to read. Vocabulary is key, as is a good book. Excellent authors can be hard to find."
s2 <- "This is a short jibberish lorem ipsum document. Selling anything to strangers and get money! Woody equal ask saw sir weeks aware decay. Entrance prospect removing we packages strictly is no smallest he. For hopes may chief get hours day rooms. Oh no turned behind polite piqued enough at. "
stuff <- rbind(s1,s2)
d <- Corpus(VectorSource(stuff[,1]))
我尝试使用 koRpus , 但在不同的软件包中重新分词似乎很愚蠢,我还遇到了问题,无法将其返回对象向量化,以使我能够将结果重新合并到
tm
中。(即,由于错误,它通常会返回比我的集合中的文档数更多或更少的可读性评分。)我知道我可以通过将元音解析为音节进行朴素计算,但想要一个更彻底的软件包,已经考虑了边缘情况(如处理静默e等)。
我选择的可读性评分是Flesch-Kincaid或Fry。
我最初尝试的方法是,其中d是我的100个文档的语料库:
f <- function(x) tokenize(x, format="obj", lang='en')
g <- function(x) flesch.kincaid(x)
x <- foreach(i=1:length(d), .combine='c',.errorhandling='remove') %do% g(f(d[[i]]))
很不幸,x返回少于100个文档,因此我无法将成功与正确的文档关联起来。(这部分是我对R中foreach和lapply的误解,但我发现文本对象的结构足够困难,以至于我无法适当地进行分词、应用flesch.kincaid,并在一系列的应用语句中成功检查错误。)
更新:
我尝试了另外两件事,试图将koRpus函数应用于tm对象...
Pass arguments into the tm_map object, using the default tokenizer:
tm_map(d,flesch.kincaid,force.lang="en",tagger=tokenize)
Define a tokenizer, pass that in.
f <- function(x) tokenize(x, format="obj", lang='en') tm_map(d,flesch.kincaid,force.lang="en",tagger=f)
这两个都返回:
Error: Specified file cannot be found:
然后列出d[1]的完整文本。看起来已经找到了?我应该怎么做才能正确地通过函数?
更新2
当我尝试使用lapply直接映射koRpus函数时,出现了以下错误:
> lapply(d,tokenize,lang="en")
Error: Unable to locate
Introduction to teaching third-graders to read. Vocabulary is key, as is a good book. Excellent authors can be hard to find.
这似乎是一个奇怪的错误——我几乎不认为它意味着找不到文本,而是找不到一些空白的错误代码(比如“tokenizer”),然后转储定位到的文本。 更新3 使用
koRpus
重新标记化的另一个问题是,与tm标记器相比,重新标记化非常缓慢,并将其分词进度输出到stdout。无论如何,我尝试了以下操作:f <- function(x) capture.output(tokenize(x, format="obj", lang='en'),file=NULL)
g <- function(x) flesch.kincaid(x)
x <- foreach(i=1:length(d), .combine='c',.errorhandling='pass') %do% g(f(d[[i]]))
y <- unlist(sapply(x,slot,"Flesch.Kincaid")["age",])
我想要做的是将上面的y
对象重新绑定到我的tm(d)
语料库作为元数据,meta(d, "F-KScore") <- y
。
不幸的是,应用于我的实际数据集时,出现了错误消息:
Error in FUN(X[[1L]], ...) :
cannot get a slot ("Flesch.Kincaid") from an object of type "character"
我认为我的语料库中必须有一个NA元素,或者是太长,或者是其他禁止因素 --- 由于嵌套的函数化,我很难确定具体是哪一个。目前看来,似乎没有预构建的函数可以很好地与tm库一起使用来读取分数。除非有人看到了一种简单的错误捕捉解决方案,我可以将其嵌入到我的函数调用中以处理无法标记某些明显错误的形式不规范的文档。
flesh.kincaid
和tm中的tm_map
吗? - Tyler Rinkertm_map(dd,flesch.kincaid)
变体,例如tm_map(dd,flesch.kincaid, "en")
等,它都会显示“错误:未指定语言!” - Mittenchopstm_map(d,flesch.kincaid,force.lang="en",tagger=tokenize)
但是出现错误,无法找到“指定的文件”,然后输出文档1的内容。 - Mittenchops