FAQ标记语言转换为R数据结构

43
我正在阅读texinfo中的R FAQ source,并思考如果将其解析为R结构,则管理和扩展会更加容易。已有几个相关示例,包括:
  • fortunes软件包

  • bibtex条目

  • Rd文件

每个示例都具有一些理想的特点。

在我看来,由于缺乏以下功能,R社区很少使用FAQ:i)可以轻松从R命令行访问(即通过R软件包); ii)强大的搜索功能; iii)交叉引用; iv)扩展贡献软件包。借鉴bibtexfortunes软件包的想法,我们可以构想一个新系统,其中:

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

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

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

问题

我不确定最好的输入格式是什么。无论是转换现有的FAQ还是添加新条目都是如此。

使用嵌套列表树(或自定义的S3/S4/ref classstructure)与R语法相当繁琐,

\list(title = "Something to be \\escaped", entry = "long text with quotes, links and broken characters", category = c("windows", "mac", "test"))
文档虽然不是R结构本身(它更像是一个具有自己解析器的LaTeX子集),但也许可以提供一个更吸引人的输入格式示例。它还有一组用于解析R中结构的工具。然而,它当前的目的相当特定和不同,是面向R函数的一般文档,而不是FAQ条目。我认为它的语法也不理想,更现代的标记语言,比如markdown,会更易读。

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

总之

我希望能够得出:

1- 一个良好的设计,用于扩展fortune包到更一般的条目,例如FAQ条目的R结构(类)

2- 一个更方便的格式来输入新的FAQ(而不是当前的texinfo格式)

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

更新2:在赏金期的最后两天,我得到了两个答案,都很有趣但完全不同。因为问题相当广泛(可以说是不明确的),所以没有一个答案提供完整的解决方案,因此我暂时不会接受任何答案。至于赏金,我将归因于在赏金到期前获得最多赞的答案,希望有一种更平等地分配它的方式。


1
不是完整的答案,但可以使用Knitr(https://github.com/yihui/knitr/issues/50)作为起点。 - Daniel H.
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")

这将以更多或更少的原始形式将其导入R中。如果这是OP想要的,那么这是一个很好的答案。如果他想要重新构建以满足一些新的组织需求,他仍然有很多工作要做。[附言:所有这些漂亮的texinfo主题之间的交叉链接都去哪了?] - Ira Baxter
很好,谢谢!我也喜欢中间的纯文本格式非常接近Markdown。确实,它解决了问题#3,除了交叉链接的神秘消失。 - baptiste
...但是你的问题#1仍未得到解决...部分原因是你不清楚想用FAQ条目解决哪些具体任务。 你认为FAQ条目应该如何编码才能与fortune包兼容?这个答案是否以这种方式打包?这会产生一个R结构...显然不是你想要的结构。 - Ira Baxter
是的,正如我们下面讨论的那样,问题#1仍未得到解答。我倾向于使用S4类,但它们的灵活性会以代码中的很多复杂性为代价。这也留下了处理交叉引用的问题,这些引用可能应该与文本内联,而不是作为单独的字段列出。 - baptiste

6
我对你的目标有些不明确。你似乎想要将所有与R相关的文档转换为一种R可以处理的格式,可能是为了能够编写R例程以更好地从文档中提取信息。
这里似乎有三个假设:
1)将这些不同的文档格式(texinfo、RD文件等)转换成具有某些隐含统一结构和语义的标准形式将很容易。因为如果无法将它们全部映射到单一结构,则必须为每种类型甚至每个单独的文档编写单独的R工具,然后后置转换工作将压倒收益。
2)R是编写此类文档处理工具的正确语言;我怀疑你对R有点偏见,因为你在R中工作,不想考虑“离开”开发环境以更好地了解如何使用R。我不是一个R专家,但我认为R主要是一种数值语言,没有为字符串处理、模式识别、自然语言解析或推理提供任何特殊帮助,而这些都是从包含自然语言的转换文档中提取信息所需的重要部分。我不建议使用特定的替代语言(Prolog?),但如果你成功完成转换为正常形式(任务1),那么你可能更好地选择目标语言进行处理。
3)你可以从这些结构中实际提取有用的信息。图书馆科学是20世纪试图推动的方向;现在我们都在研究“信息检索”和“数据融合”方法。但事实上,对于非正式文档的推理一直是难以攻克的。没有明显的系统可以组织原始文本并从中提取深层次价值(IBM赢得“危险边缘”竞赛的沃森系统似乎是个例外,但即使在那里也不清楚沃森“知道”什么;无论给它多少原始文本,你想要沃森回答“外科医生应该用刀开你吗?”的问题吗?)。重点是,你可能成功地将数据转换,但不清楚你可以成功地使用它做什么。
所有这些说法,大多数文本标记系统都有标记结构和原始文本。可以将它们“解析”成树形结构(或者如果您假定某些内容是可靠的交叉引用,则为图形结构;texinfo显然具有这些内容)。 XML被广泛推广为承载此类解析结构的载体,并且能够表示任意树或图形,因此对于捕获这些树或图形来说是可以接受的。[然后人们推动RDF或OWL或使用XML的其他知识编码系统,但这并没有改变问题;您选择一个规范目标,与R无关]。因此,您真正想要的是能够读取各种标记结构(texinfo、RD文件)并输出XML或等效树/图形的工具。在这里,我认为您注定要构建单独的O(N)解析器,以覆盖所有N个标记样式;否则,工具如何知道价值标记(因此解析)是什么? (您可以想象一个系统,当给出标记的描述时,可以读取带标记的文档,但即使这也是O(N):仍然必须有人描述标记)。一旦将此解析转换为统一的表示法,您就可以使用易于构建的R解析器读取XML(假设不存在),或者如果R不是正确的答案,则使用任何正确的答案进行解析。

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

但是我认为您真正的问题将是决定要提取/执行什么,并找到实现该目标的方法。除非您清楚地知道如何做后者,否则进行所有前期解析似乎只是很多工作且收益不明确。也许您有一个更简单的目标(“管理和扩展”,但这些词可能隐藏了很多内容),这更容易实现。


1
现在这很有趣,谢谢。在我仔细阅读之前,我想澄清两件事:i)问题的意图是创建一个“faq”包,其接口类似于“fortune”包(可能需要对其有一定的了解,以更好地构建我的问题的上下文,因为它可能只是其扩展);ii)它只针对R FAQ(而不仅仅是任何R文档),它已经具有一致的结构。 - baptiste
所以,你真正面临的是一种语言转换问题,将texinfo映射到(你新设计的)“faq”包中。这是“提取/执行”问题;你必须为每个TexInfo结构找出如何将其映射到“faq”结构中。也许这很容易。如果这是目标,那你为什么要提到Rd呢? - Ira Baxter
我会编辑原始问题以澄清这一点。谢谢! - baptiste
让我回答第二点:是的,理想情况下,所有这些都应该使用R语言完成,但唯一需要使用R语言的地方是最终用户界面(一个R包)。R语言比你想象的更灵活,有很多优秀的字符串处理、正则表达式等工具。我建议使用外部工具来进行对现有FAQ数据库的首次解析和转换。 - baptiste
1
几乎每种编程语言都有正则表达式,它非常有用。如果您的需求已经得到满足,那就很好,但是如果您想以更有趣的方式重新塑造答案(例如“将所有关于偏斜分布的texinfo答案分组在一起”),您可能需要比正则表达式更深入地处理文本。由于您对最终结果想要什么还不太清楚,我不知道如何判断。 - Ira Baxter
显示剩余6条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接