¿Cuál es un buen formato de datos de texto plano de propósito general como el utilizado para Bibtex? [cerrado]

8

Contexto

Estoy escribiendo algunas preguntas de práctica de opción múltiple y me gustaría almacenarlas en un formato de datos de texto plano simple. Anteriormente he usado tabulación delimitada, pero eso hace que la edición en un editor de texto sea un poco incómoda. Me gustaría usar un formato un poco como bibtex.

P.ej,

@Article{journals/aim/Sloman99,
  title =   "Review of Affective Computing",
  author =  "Aaron Sloman",
  journal = "AI Magazine",
  year =    "1999",
  number =  "1",
  volume =  "20",
  url = "http://dblp.uni-trier.de/db/journals/aim/aim20.html#Sloman99",
  pages =   "127--133",
}

Las propiedades importantes parecen ser:

  • Los datos están formados por registros.
  • Cada registro tiene múltiples pares de atributos-valores
  • Cada par de atributo-valor puede registrarse en una nueva línea, pero puede abarcar varias líneas
  • Fácil de ingresar manualmente datos de texto en un editor de texto
  • Herramientas fácilmente disponibles para convertir en datos tabulares

Por ejemplo, aquí hay algo parecido a lo que podría funcionar

@
id: 1
question: 1 + 1
a: 1
b: 2
c: 3
d: 4
correct: b

@
id: 2
question: What is the capital city of the country renowned for koalas, 
          emus, and kangaroos?
a: Canberra
b: Melbourne
c: Sydney
d: Australia
correct: a

Si bien estoy interesado en el contexto específico de escribir preguntas de opción múltiple, también estoy interesado en el tema más amplio de representar datos en este u otro tipo de formato similar.

Pensamientos iniciales

Mis pensamientos iniciales incluyeron lo siguiente:

  • Ñame
  • JSON
  • Datos delimitados con delimitadores de campo y registro personalizados que permiten registros de varias líneas
  • Un formato de archivo personalizado con algún tipo de analizador personalizado

Solo he echado un vistazo rápido a YAML y JSON; Mis primeras impresiones son que podrían ser excesivos. La delimitación personalizada puede ser buena, pero probablemente requerirá que todos los campos estén presentes en un orden consistente para todos los registros. Escribir mi propio analizador suena un poco incómodo.

Jeromy Anglim
fuente
1
Estoy de acuerdo con thias, que XML podría ser una buena opción. Tenía un proyecto en el que tenía que interactuar con R con el servidor web. Exportar datos en formato xml fue muy conveniente. El único problema es que no encontré ninguna buena documentación del paquete XML, así que recurrí a escribir mi propio escritor xml. El análisis se realizó con javascript y fue un placer usarlo.
mpiktas
1
Hm, retiro mi declaración sobre buena documentación. Esto se parece mucho a lo que quieres lograr.
mpiktas
solo un pensamiento (no del todo serio): en realidad podría usar bibtex con campos personalizados para sus datos. Todo lo que necesita hacer es escribir un archivo .bst personalizado. Entonces es solo cuestión de poner \ bibliography {multiplechoice} en su documento de látex. Sin embargo, escribir el .bst es engorroso y solo tienes acceso desde el látex ...
thias
@macias Admito que esto no es demasiado sobre el tema, pero también está demasiado establecido para ser migrado.

Respuestas:

9

¿Por qué no usar XML? Hay muchos buenos analizadores que traducen directamente archivos XML a estructuras de datos, incluso uno para R ( http://cran.r-project.org/web/packages/XML/index.html ).

El formato se ve así (ejemplo tomado de http://www.w3schools.com/xml/default.asp ).

<? xml version = "1.0"?>
<notas>
    <nota>
        <to> Tove </to>
        <from> Jani </from>
        <heading> Recordatorio </heading>
        <body> ¡No me olvides este fin de semana! </body>
    </note>
    <nota>
        <to> Janis </to>
        <from> Cardenal </from>
        <heading> Recordatorio </heading>
        <body> ¡No me olvides el próximo fin de semana! </body>
    </note>
</notes>

Por ejemplo, usando el paquete XML:

z=xmlTreeParse("test.xml")
z$doc$children$notes

da acceso al cuerpo completo de notas,

z$doc$children$notes[1]

es solo el primer nodo y así sucesivamente ...

thias
fuente
1
si pudiera dar un ejemplo de cómo escribir y leer los datos con el paquete R XML, sería genial.
mpiktas
buena idea; Ha pasado un tiempo desde que usé xml. Voy a intentarlo XML parece bastante detallado, pero imagino que podría mejorar la situación con algunas características del editor de texto.
Jeromy Anglim
@mpiktas ok, agregó un ejemplo
thias
@JeromyAnglim Estoy de acuerdo que XML no es tan fácil de leer, pero con resaltado de sintaxis, que debe estar bien, al menos para la estructura simple que vas a necesidad
thias
XML es genial. Al igual que con la violencia, si no resuelve tu problema, no estás usando suficiente ;-)
xmjx
6

Yo iría con YAML. Fácil de editar y tiene muchos analizadores en diferentes idiomas:

---
- 
  question: 1 + 1
  incorrect:
    - 1
    - 3
    - 4
  correct: 2
-
 question: What is the capital city of the country renowned for koalas, emus, and kangaroos?
 incorrect:
   - Melbourne
   - Sydney
   - Australia
 correct: Canberra

Luego, podría escribir un pequeño script para mezclar aleatoriamente lo incorrecto con las respuestas correctas y generar el LaTeX sugerido en la respuesta de DQdlM.

EDITAR : Este script ruby:

require 'yaml'

questions = YAML.load(File.read(ARGV.first))
questions.each_with_index do |question,index|
  answers = question['incorrect'].map{|i| '    \choice ' + i.to_s }
  answers << '    \CorrectChoice ' + question['correct'].to_s

  output = ["\\question{#{index + 1}}"]
  output << question['question']
  output << "  \\begin{choices}"
  output << answers.sort_by{rand}
  output << "  \\end{choices}"
  output << "\n"

  puts output.flatten.join("\n")
end

Producirá el siguiente resultado

\question{1}
1 + 1
  \begin{choices}
    \choice 4
    \choice 1
    \choice 3
    \CorrectChoice 2
  \end{choices}

\question{2}
What is the capital city of the country renowned for koalas, emus, and kangaroos?
  \begin{choices}
    \choice Melbourne
    \choice Sydney
    \CorrectChoice Canberra
    \choice Australia
  \end{choices}
Michael Barton
fuente
4

Es posible que esto no aborde completamente las aplicaciones más allá de sus preguntas de opción múltiple, pero hay una clase de examen disponible para LaTeX.

Las preguntas de opción múltiple se forman así:

\question[2]
The fascile of a nerve is surrounded by what connective tissue layer?
  \begin{choices}
    \choice endoneurium
    \choice epineurium
    \CorrectChoice perineruium
    \choice neurolemma
    \choice none of the above
  \end{choices}

Al incluir \printanswersen su preámbulo, resalta la respuesta correcta.

DQdlM
fuente
@DQdIM gracias. En realidad, eso es lo que uso para mostrar el producto final, pero tengo el código R para seleccionar artículos de una base de datos de artículos y escribir los artículos individuales en formato de látex.
Jeromy Anglim
4

El modo Org puede hacer eso. Una forma sería así:

#+COLUMNS: %id %a %b %c %d %correct

* 1 + 1  
    :PROPERTIES:
    :id:       1
    :a:        1
    :b:        2
    :c:        3
    :d:        4
    :correct:  b
    :END:

* What is the capital city of the country renowned for koalas, emus, and kangaroos?
    :PROPERTIES:
    :id:       2
    :a:        Canberra
    :b:        Melbourne
    :c:        Sydney
    :d:        Australia
    :correct:  a
    :END:

Si desea inspeccionar visualmente una tabla de resumen rápido, inserte lo siguiente

* The column view

  #+BEGIN: columnview :hlines 1 :id global

  #+END:

Coloca el cursor en el #+BEGINbloque y hazlo C-c C-x C-upara obtener

#+BEGIN: columnview :hlines 1 :id global
| id | a        | b         | c      | d         | correct |
|----+----------+-----------+--------+-----------+---------|
|  1 | 1        | 2         | 3      | 4         | b       |
|  2 | Canberra | Melbourne | Sydney | Australia | a       |
|    |          |           |        |           |         |
#+END:

y si desea importar (a R, por ejemplo), inserte un nombre de tabla como este:

#+BEGIN: columnview :hlines 1 :id global
#+tblname: simpleDF
| id | a        | b         | c      | d         | correct |
|----+----------+-----------+--------+-----------+---------|
|  1 | 1        | 2         | 3      | 4         | b       |
|  2 | Canberra | Melbourne | Sydney | Australia | a       |
#+END:

luego inserte y ejecute el siguiente bloque de código R con C-c C-c:

#+begin_src R :session *R* :var df=simpleDF :colnames yes
head(df)
#+end_src

esto da

#+results:
| id | a        | b         | c      | d         | correct |
|----+----------+-----------+--------+-----------+---------|
|  1 | 1        | 2         | 3      | 4         | b       |
|  2 | Canberra | Melbourne | Sydney | Australia | a       |

La buena noticia es que el marco de datos dfahora está almacenado en la *R*sesión activa y está disponible para procesarlo como desee. Dicho todo esto, si fuera yo, probablemente comenzaría con el paquete de exámenes (en R) para la aplicación específica de almacenar / escribir preguntas de opción múltiple, aunque ese ejemplo de YAML se ve realmente genial.


fuente
+1 buena respuesta. Estaba seguro de que el modo de organización podría hacer esto, pero no sabía cómo
DQdlM
4

Aquí hay un par de ideas adicionales:

  1. Use R en sí mismo:

    exam = list(question1 = list(
                            question='Here is the first question',
                            answers = list('a' = 'Here is the first answer',
                                           'b' = 'here is the second answer',
                                           'c' = 'Here is the third answer'
                                           )
                                 )
               )
    
    > exam$question1
    > exam$question1$question
    > exam$question1$answers
    > exam$question1$answers$a
    
  2. Utilice reStructuredText , que es un lenguaje de marcado ligero, similar al markdown, que se puede analizar en un DOM (Python), por ejemplo:

    Here is the first question.
    
    * First answer.
    * Second answer.
    * Third answer.
    

Hay un escritor rst2xml que convierte lo anterior a:

<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE document PUBLIC "+//IDN docutils.sourceforge.net//DTD Docutils Generic//EN//XML" "http://docutils.sourceforge.net/docs/ref/docutils.dtd">
  <!-- Generated by Docutils 0.7 -->
  <document source="tmp.rst">
    <paragraph>Here is the first question.</paragraph>
    <bullet_list bullet="*">
      <list_item>
        <paragraph>First answer.</paragraph>
      </list_item>
      <list_item>
        <paragraph>Second answer.</paragraph>
      </list_item>
      <list_item>
        <paragraph>Third answer.</paragraph>
      </list_item>
    </bullet_list>
  </document>

También hay un escritor rst2latex, por lo que su prueba puede formatearse fácilmente para imprimir, y puede manejar los datos utilizando python y el modelo de objeto del documento.

La ventaja de esta opción es que primero es fácil de leer y escribir, a diferencia de XML, pero sus datos aún están estructurados para su uso en R, Python, etc.

Ed Hagen
fuente