Часто задаваемые вопросы о разметке структуры данных R

Я читаю источник часто задаваемых вопросов по R в texinfo и думаю, что было бы проще для управления и расширения, если он был проанализирован как структура R. Есть несколько существующих примеров, связанных с этим:

  • пакет удачи

  • бибтекс записи

  • Rd файлы

каждый с некоторыми желаемыми функциями.

На мой взгляд, часто задаваемые вопросы недостаточно используются в сообществе 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 и т. д.

ВОПРОС

Однако я не уверен, какой формат ввода является лучшим. Либо для преобразования существующего FAQ, либо для добавления новых записей.

Довольно громоздко использовать синтаксис R с деревом вложенных списков (или специальным S3/S4/ref class или structure,

\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, а не на часто задаваемые вопросы. Его синтаксис тоже не идеален, я думаю, что более современная разметка, что-то вроде уценки, была бы более читабельной.

Есть ли что-то еще, может быть, примеры разбора файлов уценки в структуры R? Пример отклонения файлов Rd от их предназначения?

Подводя итоги

Я хотел бы придумать:

1- хороший дизайн для структуры R (возможно, класса), который расширил бы пакет fortune до более общих записей, таких как элементы часто задаваемых вопросов.

2- более удобный формат для ввода новых FAQ (вместо текущего формата texinfo)

3- синтаксический анализатор, написанный либо на R, либо на другом языке (bison?), чтобы преобразовать существующий FAQ в новую структуру (1) и/или новый формат ввода (2) в структуру R.

Обновление 2: за последние два дня периода вознаграждений я получил два ответа, оба интересные, но совершенно разные. Поскольку вопрос довольно обширен (возможно, некорректно поставлен), ни один из ответов не дает полного решения, поэтому я не буду (во всяком случае, пока) принимать ответ. Что касается вознаграждения, я отнесу его к ответу, за который проголосовали больше всего до истечения срока действия вознаграждения, желая, чтобы был способ разделить его более равномерно.


person baptiste    schedule 26.05.2012    source источник
comment
Не полный ответ, а отправная точка с использованием Knitr (github.com/yihui/knitr/issues/50 )   -  person Daniel H.    schedule 30.05.2012


Ответы (2)


(Это относится к пункту 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")
person Vincent Zoonekynd    schedule 02.06.2012
comment
Это переводит его в R в более или менее исходной форме. Если это то, чего хочет ОП, это отличный ответ. Если он хочет реструктурировать это, чтобы удовлетворить какие-то новые организационные требования, у него еще много работы впереди. [PS: что случилось со всеми этими красивыми перекрестными ссылками между темами texinfo?] - person Ira Baxter; 02.06.2012
comment
Это приятно, спасибо! Мне также нравится, как промежуточный формат открытого текста очень напоминает уценку. Действительно, это решает проблему №3, за исключением загадочного исчезновения перекрестных ссылок. - person baptiste; 03.06.2012
comment
... но ваша проблема № 1 остается нерешенной ... отчасти потому, что вы неясно, какую конкретную задачу вы хотите решить с помощью записей часто задаваемых вопросов. Как вы думаете, как должны быть закодированы записи часто задаваемых вопросов, чтобы быть совместимыми с пакетом Fortune? И этот ответ упаковывает их таким образом? Это создает структуру AN R... явно не ту структуру, которую вы хотели. - person Ira Baxter; 04.06.2012
comment
да, как мы обсуждаем ниже, № 1 остается без ответа. Я склоняюсь к классам S4, но их гибкость достигается за счет большого усложнения кода. Это также оставляет проблему работы с перекрестными ссылками, которые, вероятно, должны быть встроены в текст, а не перечислены как отдельное поле. - person baptiste; 04.06.2012

Я немного не понимаю ваших целей. Кажется, вы хотите, чтобы вся документация, связанная с R, была преобразована в какой-то формат, которым может манипулировать R, предположительно, чтобы можно было написать подпрограммы R для лучшего извлечения информации из документации.

Здесь, кажется, есть три предположения.

1) Эти различные форматы документов (файлы texinfo, RD и т. д.) будет легко преобразовать в некую стандартную форму с (подчеркиваю) некоторой неявной единой структурой и семантикой.
Потому что, если вы не можете сопоставить их все с единая структура, вам придется писать отдельные инструменты R для каждого типа и, возможно, для каждого отдельного документа, и тогда работа инструмента после преобразования будет подавлять преимущества.

2) что R является подходящим языком для написания таких инструментов обработки документов; подозреваю, что вы немного предвзято относитесь к R, потому что вы работаете в R и не хотите думать о том, чтобы «покинуть» среду разработки, чтобы получить информацию о работе с R лучше. Я не эксперт по R, но я думаю, что R — это в основном числовой язык и не предлагает никакой специальной помощи для обработки строк, распознавания образов, синтаксического анализа или вывода на естественном языке, все из которых, как я ожидаю, сыграют важную роль. в извлечении информации из преобразованных документов, которые в значительной степени содержат естественный язык. Я не предлагаю конкретный альтернативный язык (Пролог ??), но вам может быть лучше, если вы преуспеете в преобразовании в нормальную форму (задача 1), чтобы тщательно выбрать целевой язык для обработки.

3) Что вы действительно можете извлечь полезную информацию из этих структур. Библиотечное дело было тем, что пытался продвигать 20-й век; теперь мы все занимаемся методами «Поиск информации» и «Слияние данных». Но на самом деле рассуждения о неофициальных документах отбили большинство попыток сделать это. Не существует очевидных систем, которые организуют необработанный текст и извлекают из него глубокую ценность (очевидным исключением является система IBM Watson, победившая в Jeopardy, но даже в этом случае неясно, что 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.

Но я думаю, что ваша настоящая проблема будет заключаться в том, чтобы решить, что вы хотите извлечь/сделать, а затем найти способ сделать это. Если у вас нет четкого представления о том, как сделать последнее, выполнение всех предварительных синтаксических анализаторов просто кажется большой работой с неясной отдачей. Возможно, у вас есть более простая цель («управлять и расширять», но за этими словами можно многое скрыть), но она более достижима.

person Ira Baxter    schedule 02.06.2012
comment
теперь интересно, спасибо. Прежде чем приступить к более внимательному чтению, я хотел бы прояснить две вещи: i) цель вопроса состоит в том, чтобы создать пакет faq, а его интерфейс будет аналогичен пакету fortune (вероятно, потребуется некоторое знакомство с ним, чтобы лучше понять контекст моего вопроса, поскольку он может быть просто его продолжением); ii) он нацелен только на часто задаваемые вопросы по R (а не только на любую документацию по R), которая уже имеет согласованную структуру. - person baptiste; 02.06.2012
comment
Итак, что у вас действительно есть в проблеме преобразования языка, чтобы отобразить texinfo в (ваш недавно разработанный) пакет часто задаваемых вопросов. Это проблема извлечения/исполнения; вы должны выяснить для каждой конструкции TexInfo, как отобразить ее в структуру faq. Может быть, это легко. Если это цель, то почему вы упомянули Rd? - person Ira Baxter; 02.06.2012
comment
Я отредактирую исходный вопрос, чтобы прояснить этот момент. Спасибо! - person baptiste; 02.06.2012
comment
Ваш документ об инструментах для анализа структуры (Rd) в R... разве это не тот пример, который вы ищете? Он даже содержит много интересной разметки в стиле латекса. Похоже, я представлял, что в моем ответе он будет выглядеть в комплекте с парсером Bison (а не ANTLR), но без XML. Что такого в этом примере, что вас не устраивает? - person Ira Baxter; 02.06.2012
comment
позвольте мне ответить на пункт 2): да, в идеале все это должно быть в R, но единственное место, где это требуется, — это окончательный пользовательский интерфейс (пакет R). R более гибок, чем вы думаете, и есть (много) хороших инструментов для обработки строк, регулярных выражений и т. д. Я бы рассмотрел внешние инструменты для первого анализа/преобразования существующей базы данных часто задаваемых вопросов. - person baptiste; 02.06.2012
comment
Почти в каждом языке где-то есть регулярное выражение; это слишком полезно. Если ваши потребности удовлетворены этим, то хорошо, но если вы хотите изменить форму ответа более интересным образом (сгруппировать все ответы texinfo об искаженных распределениях вместе), вы, вероятно, обнаружите необходимость обрабатывать текст гораздо глубже, чем регулярное выражение позволять. Поскольку вы все еще немного не понимаете, чего хотите от окончательного результата, я не знаю, как судить. - person Ira Baxter; 02.06.2012
comment
Мне снова следовало быть более конкретным: R имеет довольно мощные инструменты для обработка естественного языка тоже, вероятно, более чем достаточна для выполнения основных операций с этим ограниченным текстовым ресурсом. - person baptiste; 03.06.2012
comment
Хорошо, так что могут быть хорошие инструменты. А собственно цель что делать с информацией, чтобы систематизировать ее для faq? - person Ira Baxter; 03.06.2012
comment
это пункт № 1 в моем отредактированном вопросе: я не знаю, какая структура лучше всего подходит для хранения такого рода информации. Из базовых list, data.frame (что использует фортуна), структуры, класса S4, класса ссылок, внешней базы данных, ... - person baptiste; 04.06.2012
comment
Лучшая структура определяется тем, как вы собираетесь использовать данные FAQ. Вы намерены показывать texinfo только в форме, похожей на оригинал? Взять ключевые слова и сопоставить их с текстом в документах texinfo? Сделать перекрестные ссылки на темы, упомянутые во всех блоках документов texinfo, и предоставить доступ к перекрестным ссылкам? Привязать записи texinfo к существующим записям состояния? Хорошая структура данных выбирается по назначению; в противном случае мы могли бы хранить все как огромную неструктурированную текстовую строку или, что то же самое, огромную последовательность единиц и нулей. - person Ira Baxter; 04.06.2012
comment
Я предполагаю, что должно быть несколько отдельных полей: question, answer, links (возможно, проблематично), section, platform. Отображение результатов не зависит от внутренней структуры, так как вы можете определить свой собственный метод печати. Я предполагаю, что эту часть вопроса будет сложнее обсудить, если вы не так хорошо знакомы со структурами данных R, чего я не предусмотрел, когда публиковал несколько тегов, отличных от r. Кстати, я упомянул состояния только как связанный пример, но они имеют совершенно разное содержание (один представляет собой подборку забавных цитат из списков рассылки, другой — часто задаваемые вопросы). - person baptiste; 04.06.2012