【发布时间】:2013-02-13 16:31:51
【问题描述】:
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 对象...
使用默认标记器将参数传递到 tm_map 对象:
tm_map(d,flesch.kincaid,force.lang="en",tagger=tokenize)-
定义一个分词器,将其传入。
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 标记器相比)非常慢,并将其标记化进度输出到标准输出。无论如何,我尝试了以下方法:
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 库很好地配合的乐谱。除非有人看到一个简单的错误捕获解决方案,否则我可以将其夹在我的函数调用中以处理无法标记一些明显错误、格式错误的文档?
【问题讨论】:
-
你不能使用来自 koRpus 的
flesh.kincaid和来自 tm 的tm_map吗? -
我好像做不到。它说,“错误:未指定语言!”对于我能想到的
tm_map(dd,flesch.kincaid)的每一个变体,比如tm_map(dd,flesch.kincaid, "en")等 -
所以,我咨询了另一个关于如何将参数传递给嵌套函数的 SO 问题 (stackoverflow.com/questions/6827299/…)。我试过这个
tm_map(d,flesch.kincaid,force.lang="en",tagger=tokenize),但得到一个错误,它找不到“指定文件”,然后输出文档1的内容。