6

库中是否有为此预先构建的功能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 对象......

  1. 使用默认标记器将参数传递给 tm_map 对象: tm_map(d,flesch.kincaid,force.lang="en",tagger=tokenize)

  2. 定义一个分词器,将其传入。

     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图书馆很好地配合的乐谱。除非有人看到一个简单的错误捕获解决方案,否则我可以将其夹在我的函数调用中以处理无法标记一些明显错误、格式错误的文档?

4

3 回答 3

4

你会得到一个错误,因为koRpus函数不能处理corpus对象。最好先创建一个kRp.tagged对象,然后 koRpus在其上应用所有功能。在这里,我将展示如何使用包ovid的数据来做到这一点tm

list.files用来获取源文件列表。您只需要为源文本文件提供正确的路径。

ll.files <- list.files(path = system.file("texts", "txt", 
                                    package = "tm"),
                 full.names=T)

然后我构造一个kRp.tagged对象列表,使用tokenize它是包中给出的默认标记器koRpus(推荐使用TreeTagger,但您需要安装它)

ll.tagged <- lapply(ll.files, tokenize, lang="en") ## tm_map is just a wrapper of `lapply`

一旦我有了我的“标记”对象列表,我就可以对其应用可读性公式。由于flesch.kincaid是 的包装readability,我将直接应用后者:

ll.readability <- lapply(ll.tagged,readability)          ## readability
ll.freqanalysis <- lapply(ll.tagged,kRp.freq.analysis)   ## Conduct a frequency analysis
ll.hyphen <- lapply(ll.tagged,hyphen)                    ## word hyphenation

等等,....所有这些都会产生一个 S4 对象列表。该desc插槽可以轻松访问此列表:

lapply(lapply(ll.readability ,slot,'desc'),              ## I apply desc to get a list
         '[',c('sentences','words','syllables'))[[1]]    ## I subset to get some indexes
[[1]]
[[1]]$sentences
[1] 10

[[1]]$words
[1] 90

[[1]]$syllables
all  s1  s2  s3  s4 
196  25  32  25   8 

例如,您可以使用 slothyphen获取包含两个列的数据帧,word(连字符)和 syll(音节数)。在这里,lattice我使用 绑定所有 data.frames,dotplot为每个文档绘制一个。

library(lattice)
ll.words.syl <- lapply(ll.hyphen,slot,'hyphen')     ## get the list of data.frame
ll.words.syl <- lapply(seq_along(ll.words.syl),      ## add a  column to distinguish docs
       function(i)cbind(ll.words.syl[[i]],group=i))
dat.words.syl <- do.call(rbind,ll.words.syl)
dotplot(word~syll|group,dat.words.syl,
        scales=list(y=list(relation ='free')))

在此处输入图像描述

于 2013-02-16T08:07:54.553 回答
3

很抱歉,koRpus 包还没有与 tm 包顺利交互。几个月来,我一直在想办法在两个对象类之间进行转换,但还没有提出真正令人满意的解决方案。如果您对此有任何想法,请随时与我联系。

但是,我想向您summary()推荐 koRpus 生成的可读性对象的方法,该方法返回data.frame相关结果的浓缩。这可能比通过相当复杂的 S4 对象进行的替代爬网更容易访问;-) 您也可以尝试summary(x, flat=TRUE)

@agstudy:漂亮的图表 :-) 为了节省一些时间,您应该在hyphen()before运行readability(),这样您就可以通过“连字符”参数重新使用结果。或者您可以在readability()之后简单地访问结果的“连字符”插槽。如果需要,它会自动断字,并保留结果。仅当您需要hyphen()在下一步之前更改输出时,才需要手动调用连字符。我可能会补充一点,0.05-1在这方面比它的前辈快得多

于 2013-05-05T22:32:49.030 回答
2

qdap 版本 1.1.0开始,qdap 具有许多与 tm 包更兼容的功能。这是一种使用您提供的相同方法来解决您的问题的方法Corpus(请注意,Fry 最初是一个图形度量,并且 qdap 保留了这一点;也通过您的语料库和随机抽样 Fry 建议您的样本语料库不足以计算 Fry 的在):

library(qdap)
with(tm_corpus2df(d), flesch_kincaid(text, docs))

##   docs word.count sentence.count syllable.count FK_grd.lvl FK_read.ease
## 1   s1         33              1             54       16.6       34.904
## 2   s2         49              1             75       21.6       27.610

with(tm_corpus2df(d), fry(text, docs))

## To plot it
qheat(with(tm_corpus2df(d), flesch_kincaid(text, docs)), values=TRUE, high="red")

在此处输入图像描述

于 2014-02-28T04:59:27.557 回答