常见问题标记到R数据结构

时间:2012-05-26 03:39:16

标签: r parsing markdown markup r-faq

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

  • 财富包

  • bibtex条目

  • Rd文件

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

在我看来,常见问题解答在R社区中使用不足,因为它们缺乏i)从R命令行轻松访问(即通过R包); ii)强大的搜索功能; iii)交叉引用; iv)贡献包的扩展。从包bibtexfortunes中提取想法,我们可以设想一个新的系统:

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

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

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

问题

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

将R语法与嵌套列表树(或ad hoc S3 / S4 / ref classstructure

一起使用相当麻烦
\list(title = "Something to be \\escaped", entry = "long text with quotes, links and broken characters", category = c("windows", "mac", "test"))

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

那里还有别的东西,可能是将降价文件解析为R结构的例子吗?将Rd文件偏离其预期目的的一个例子是什么?

总结

我想提出:

1-一个R结构(可能是类)的优秀设计,它将fortune包扩展到更常见的条目,例如FAQ项

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

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

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

2 个答案:

答案 0 :(得分: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")

答案 1 :(得分: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 Software Reengineering Toolkit是另一个;解析后的DMS将直接使用解析树导出XML文档(但它不一定是您理想的那种统一表示)。这些工具可能会使读取标记变得相对容易,并以XML格式表示。

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