gpt4 book ai didi

r - 如何使用 tm 包计算 R 中的可读性

转载 作者:行者123 更新时间:2023-12-04 10:17:30 26 4
gpt4 key购买 nike

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",])

    我的意图是重新绑定(bind) 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函数无法处理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.kincaidreadability 的包装器,我会直接申请后者:
    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 slot 可以轻松访问此列表:
    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

    例如,您可以使用插槽 hyphen得到一个包含两列的数据框,word(连字符)和 syll(音节数)。在这里,使用 lattice ,我绑定(bind)所有的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')))

    enter image description here

    关于r - 如何使用 tm 包计算 R 中的可读性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14858267/

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