【问题标题】:Longest line in text dataset文本数据集中最长的行
【发布时间】:2016-04-20 08:38:21
【问题描述】:

我正在寻找一种方法来查找文本文件中最长行的长度。

例如考虑一个来自tm 包的简单数据集。

install.packages("tm")
library(tm)
txt <- system.file("texts", "txt", package = "tm") 

ovid <- VCorpus(DirSource(txt, encoding = "UTF-8"), readerControl = 
list(language = "lat"))

length(ovid)
[1] 5

ovid 由五个文档组成,每个文档由n 元素(从 16 到 18)组成的字符向量组成,我想找出其中最长的一个。 我找到了pythonC#bash shell 的文档,但令人惊讶的是,我没有找到任何关于 R 的内容。因此,我的尝试非常天真,其中:

max(nchar(ovid))
[1] 5410
max(length(ovid))
[1] 5

【问题讨论】:

  • which.max(nchar(ovid)) ?
  • 感谢您的建议,但恐怕它没有返回正确的答案。
  • 您想要五个元素中的最大length? IE。 maxlengths(lapply(ovid, as.character))?
  • 实际上该命令返回的是列表中最长字符向量的长度,即ovid。对象ovid是一个字符向量列表,列表的第五个元素有18个元素,其中三个是空字符串。看看lapply(ovid, as.character))就清楚了。
  • @KenBenoit 你是对的。现在我明白我的错误了。伙计们,我为错误地陈述问题而道歉。我非常感谢您的努力。

标签: r text-mining tm


【解决方案1】:

实际上它是最长的第四个文本,一旦我们从空白中删除填充。就是这样。请注意,这在很大程度上来自于从 tm (V)Corpus 对象中获取文本的困难,之前已经(多次)询问过该对象,例如 here

请注意,我将您关于“行”的问题解释为指的是五个文档,每个文档超过五行,但包含多行(每行长度在 16 到 18 个字符向量之间)。我希望我的解释正确。

texts <- sapply(ovid$content, "[[", "content")
str(texts)
## List of 5
## $ : chr [1:16] "    Si quis in hoc artem populo non novit amandi," "         hoc legat et lecto carmine doctus amet." "    arte citae veloque rates remoque moventur," "         arte leves currus: arte regendus amor." ...
## $ : chr [1:17] "    quas Hector sensurus erat, poscente magistro" "         verberibus iussas praebuit ille manus." "    Aeacidae Chiron, ego sum praeceptor Amoris:" "         saevus uterque puer, natus uterque dea." ...
## $ : chr [1:17] "    vera canam: coeptis, mater Amoris, ades!" "    este procul, vittae tenues, insigne pudoris," "         quaeque tegis medios, instita longa, pedes." "    nos venerem tutam concessaque furta canemus," ...
## $ : chr [1:17] "    scit bene venator, cervis ubi retia tendat," "         scit bene, qua frendens valle moretur aper;" "    aucupibus noti frutices; qui sustinet hamos," "         novit quae multo pisce natentur aquae:" ...
## $ : chr [1:18] "    mater in Aeneae constitit urbe sui." "    seu caperis primis et adhuc crescentibus annis," "         ante oculos veniet vera puella tuos:" "    sive cupis iuvenem, iuvenes tibi mille placebunt." ...

所以这里我们提取了文本,但它们位于多行上,由每个“文档”包含的每个字符向量的一个元素表示,并且因为它们是诗句,所以在开头和结尾有可变的空白填充其中一些元素。让我们使用 stringistri_trim_both 函数修剪这些内容并留下文本。

# need to trim leading and trailing whitespace
texts <- lapply(texts, stringi::stri_trim_both)
## texts[1]
## [[1]]
## [1] "Si quis in hoc artem populo non novit amandi,"     "hoc legat et lecto carmine doctus amet."          
## [3] "arte citae veloque rates remoque moventur,"        "arte leves currus: arte regendus amor."           
## [5] ""                                                  "curribus Automedon lentisque erat aptus habenis," 
## [7] "Tiphys in Haemonia puppe magister erat:"           "me Venus artificem tenero praefecit Amori;"       
## [9] "Tiphys et Automedon dicar Amoris ego."             "ille quidem ferus est et qui mihi saepe repugnet:"
## [11] ""                                                  "sed puer est, aetas mollis et apta regi."         
## [13] "Phillyrides puerum cithara perfecit Achillem,"     "atque animos placida contudit arte feros."        
## [15] "qui totiens socios, totiens exterruit hostes,"     "creditur annosum pertimuisse senem."              

# now paste them together to make a single character vector of the five documents
texts <- sapply(texts, paste, collapse = "\n")
str(texts)
##  chr [1:5] "Si quis in hoc artem populo non novit amandi,\nhoc legat et lecto carmine doctus amet.\narte citae veloque rates remoque movent"| __truncated__ ...
cat(texts[1])
## Si quis in hoc artem populo non novit amandi,
## hoc legat et lecto carmine doctus amet.
## arte citae veloque rates remoque moventur,
## arte leves currus: arte regendus amor.
## 
## curribus Automedon lentisque erat aptus habenis,
## Tiphys in Haemonia puppe magister erat:
## me Venus artificem tenero praefecit Amori;
## Tiphys et Automedon dicar Amoris ego.
## ille quidem ferus est et qui mihi saepe repugnet:
##     
## sed puer est, aetas mollis et apta regi.
## Phillyrides puerum cithara perfecit Achillem,
## atque animos placida contudit arte feros.
## qui totiens socios, totiens exterruit hostes,
## creditur annosum pertimuisse senem.

看起来更像。现在我们可以找出哪个是最长的。

nchar(texts)
## [1] 600 621 644 668 622
which.max(nchar(texts))
## [1] 4

【讨论】:

  • 您的解释正确。这是我的错。我实际上混淆了这五个文件,认为它们是长度为 16、18 ecc 的“行”。因此,问题的真正对象是组成五个文档的字符向量的长度。谢谢你让我明白。我真的很感谢你的努力。
  • 不客气。听起来像是一个值得接受的答案:-)。
  • 当然。也有一点。它帮助我在数据挖掘领域迈出了重要的一步!
猜你喜欢
  • 1970-01-01
  • 2020-03-03
  • 1970-01-01
  • 2021-10-28
  • 2010-12-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-07-05
相关资源
最近更新 更多