43

我正在阅读texinfo中的R FAQ源,并认为如果将其解析为R结构会更容易管理和扩展。有几个与此相关的现有示例:

  • 财富包

  • 中文条目

  • 文件

每个都有一些理想的功能。

在我看来,常见问题解答在 R 社区中没有得到充分利用,因为它们缺乏 i) 从 R 命令行轻松访问(即通过 R 包);ii) 强大的搜索功能;iii) 交叉引用;iv) 贡献包的扩展。从包bibtex和中汲取灵感fortunes,我们可以构想出一个新系统,其中:

  • 可以从 R 中搜索常见问题解答。典型的调用类似于fortune()界面:faq("lattice print")、 或faq() #surprise me!faq(51)faq(package="ggplot2")

  • 包可以提供自己的FAQ.rda,格式还不清楚(见下文)

  • Sweave/knitr提供驱动程序以输出格式良好的 Markdown/LaTeX 等。

问题

但是,我不确定最好的输入格式是什么。用于转换现有常见问题解答或添加新条目。

将 R 语法与嵌套列表树(或临时 S3/S4/refclassstructure,

\list(title = "Something to be \\escaped", entry = "long text with quotes, links and broken characters", category = c("windows", "mac", "test"))

Rd文档,即使本身不是 R 结构(它更像是 LaTeX 的一个子集,具有自己的解析器),也许可以提供一个更吸引人的输入格式示例。它还有一组工具来解析R 中的结构。然而,它目前的目的是相当具体和不同的,面向 R 函数的一般文档,而不是 FAQ 条目。它的语法也不理想,我认为更现代的标记,比如降价,会更具可读性。

还有其他东西吗,也许是将markdown文件解析为R结构的例子?将 Rd 文件偏离其预期目的的示例?

总结

我想提出:

1- R 结构(可能是类)的良好设计,可以将fortune包扩展到更一般的条目,例如常见问题解答项目

2- 一种更方便的格式来输入新的常见问题解答(而不是当前的 texinfo 格式)

3- 一个解析器,用 R 或其他语言(bison?)编写,用于将现有的常见问题解答转换为新的结构 (1),和/或将新的输入格式 (2) 转换为 R 结构。

更新 2:在赏金期的最后两天,我得到了两个答案,都很有趣但完全不同。因为这个问题非常广泛(可以说是不合适的),所以没有一个答案提供完整的解决方案,因此我(无论如何现在)不会接受答案。至于赏金,我将其归因于在赏金到期之前投票最多的答案,希望有一种方法可以更平均地分配它。

4

2 回答 2

8

(这涉及第 3 点。)

您可以将 texinfo 文件转换为 XML

wget http://cran.r-project.org/doc/FAQ/R-FAQ.texi
makeinfo --xml R-FAQ.texi 

然后用 XML 包读取它。

library(XML)
doc <- xmlParse("R-FAQ.xml")
r <- xpathSApply( doc, "//node", function(u) {
  list(list(
    title    = xpathSApply(u, "nodename", xmlValue),
    contents = as(u, "character")
  ))
} )
free(doc)

但是将其转换为文本要容易得多

makeinfo --plaintext R-FAQ.texi > R-FAQ.txt

并手动解析结果。

doc <- readLines("R-FAQ.txt")

# Split the document into questions
# i.e., around lines like ****** or ======.
i <- grep("[*=]{5}", doc) - 1
i <- c(1,i)
j <- rep(seq_along(i)[-length(i)], diff(i))
stopifnot(length(j) == length(doc))
faq <- split(doc, j)

# Clean the result: since the questions 
# are in the subsections, we can discard the sections.
faq <- faq[ sapply(faq, function(u) length(grep("[*]", u[2])) == 0) ]

# Use the result
cat(faq[[ sample(seq_along(faq),1) ]], sep="\n")
于 2012-06-02T10:30:00.127 回答
6

我有点不清楚你的目标。您似乎希望将所有与 R 相关的文档都转换为 R 可以操作的某种格式,大概这样人们就可以编写 R 例程来更好地从文档中提取信息。

这里似乎有三个假设。

1) 很容易将这些不同的文档格式(texinfo、RD 文件等)转换为具有(我强调)一些隐式统一结构和语义的标准形式。
因为如果你不能将它们全部映射到一个单一的结构,你将不得不为每种类型甚至可能为每个单独的文档编写单独的 R 工具,然后转换后工具的工作将压倒好处。

2) R 是编写此类文档处理工具的正确语言;怀疑您对 R 有点偏见,因为您在 R 中工作并且不想考虑“离开”开发环境以获取有关更好地使用 R 的信息。我不是 R 专家,但我认为 R 主要是一种数字语言,并没有为字符串处理、模式识别、自然语言解析或推理提供任何特殊帮助,我希望所有这些都发挥重要作用从主要包含自然语言的转换文档中提取信息。我不是建议使用特定的替代语言(Prolog??),但如果您成功转换为正常形式(任务 1)以仔细选择目标语言进行处理,您可能会更好。

3)您实际上可以从这些结构中提取有用的信息。图书馆学是 20 世纪试图推动的。现在我们都进入了“信息检索”和“数据融合”方法。但事实上,对非正式文件的推理已经挫败了大多数这样做的尝试。没有明显的系统可以组织原始文本并从中提取深层价值(IBM 赢得 Jeopardy 的 Watson 系统是一个明显的例外,但即使在那里,也不清楚 Watson “知道”什么;您是否希望 Watson 回答这个问题,“外科医生应该用刀打开你吗?”不管你给了多少原始文本)关键是你可能成功地转换了数据,但不清楚你能成功地用它做什么。

尽管如此,大多数文本标记系统都有标记结构和原始文本。人们可以将它们“解析”成树状结构(如果您假设某些事物是可靠的交叉引用,则可以将其“解析”成类似图的结构;texinfo 当然有这些)。XML 被广泛推动作为此类解析结构的载体,并且能够表示任意树或图,它是......好的......用于捕获这样的树或图。[然后人们推出 RDF 或 OWL 或其他使用 XML 的知识编码系统,但这并没有改变问题;您选择一个独立于 R] 的规范目标。所以你真正想要的是能够读取各种标记结构(texinfo、RD 文件)并输出 XML 或等效的树/图的东西。在这里,我认为您注定要构建单独的 O(N) 解析器来涵盖所有 N 标记样式;否则工具怎么会知道值标记(因此解析)是什么?(你可以想象一个系统在给出标记的描述时可以读取标记的文档,但即使这样也是 O(N):仍然必须有人描述标记)。这种解析是针对这种统一表示法,然后您可以使用易于构建的 R 解析器来读取 XML(假设尚不存在),或者如果 R 不是正确的答案,则使用正确的答案进行解析.

有一些工具可以帮助您为任意语言构建解析器和解析树(甚至是从解析树到其他形式的翻译器)。 ANTLR是一个;它已被足够多的人使用,因此您甚至可能会意外找到某人已经构建的 texinfo 解析器。我们的DMS 软件再造工具包是另一个;解析后的 DMS 将直接导出带有解析树的 XML 文档(但它不一定是您理想中想要的统一表示)。这些工具可能会使阅读标记和用 XML 表示它变得相对容易。

但我认为你真正的问题是决定你想要提取/做什么,然后找到一种方法来做到这一点。除非你对如何做后者有一个清晰的想法,否则做所有的前端解析器似乎是很多工作,但回报不明确。也许您有一个更简单的目标(“管理和扩展”,但这些词可以隐藏很多)更可行。

于 2012-06-02T02:21:30.687 回答