Was ist ein gutes Allzweck-Klartextdatenformat wie das für Bibtex? [geschlossen]


8

Kontext

Ich schreibe ein paar Multiple-Choice-Übungsfragen und möchte sie in einem einfachen Nur-Text-Datenformat speichern. Ich habe zuvor tabulatorgetrennte verwendet, aber das macht das Bearbeiten in einem Texteditor etwas umständlich. Ich würde gerne ein Format wie bibtex verwenden.

Z.B,

@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",
}

Wichtige Eigenschaften scheinen zu sein:

  • Daten bestehen aus Datensätzen
  • Jeder Datensatz hat mehrere Attribut-Wert-Paare
  • Jedes Attribut-Wert-Paar kann in einer neuen Zeile aufgezeichnet werden, kann jedoch mehrere Zeilen umfassen
  • Einfache manuelle Eingabe von Textdaten in einen Texteditor
  • Sofort verfügbare Tools zum Konvertieren in tabellarische Daten

Zum Beispiel ist hier etwas wie das, was funktionieren könnte

@
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

Während ich mich für den spezifischen Kontext des Schreibens von Multiple-Choice-Fragen interessiere, interessiert mich auch das umfassendere Problem der Darstellung von Daten in diesem oder einem ähnlichen Format.

Erste Gedanken

Meine ersten Gedanken umfassten Folgendes:

  • YAML
  • JSON
  • Begrenzte Daten mit benutzerdefinierten Feld- und Datensatztrennzeichen, die mehrzeilige Datensätze ermöglichen
  • Ein benutzerdefiniertes Dateiformat mit einer Art benutzerdefiniertem Parser

Ich habe mir YAML und JSON nur kurz angesehen. Mein erster Eindruck ist, dass sie möglicherweise zu viel töten. Benutzerdefinierte Abgrenzung mag gut sein, aber es würde wahrscheinlich erfordern, dass alle Felder in einer einheitlichen Reihenfolge für alle Datensätze vorhanden sind. Das Schreiben meines eigenen Parsers klingt etwas fummelig.


1
Ich stimme dem zu, dass XML gut passen könnte. Ich hatte ein Projekt, in dem ich R mit dem Webserver verbinden musste. Das Exportieren von Daten im XML-Format war sehr praktisch. Das einzige Problem ist, dass ich keine gute XML-Paketdokumentation gefunden habe, also habe ich meinen eigenen XML-Writer geschrieben. Das Parsen wurde mit Javascript durchgeführt und es war eine Freude, es zu verwenden.
mpiktas

1
Hm, ich nehme meine Aussage über gute Dokumentation zurück. Dies sieht sehr ähnlich aus wie das, was Sie erreichen möchten.
mpiktas

Nur ein (nicht ganz ernsthafter) Gedanke: Sie könnten tatsächlich bibtex mit benutzerdefinierten Feldern für Ihre Daten verwenden. Alles, was Sie dann tun müssen, ist eine benutzerdefinierte .bst-Datei zu schreiben. Es geht dann nur noch darum, \ bibliography {multiplechoice} in Ihr Latex-Dokument aufzunehmen. Das Schreiben der .bst ist jedoch umständlich und Sie haben nur Zugriff von Latex ...
Thias

@macias Ich gebe zu, dass dies nicht zu thematisch ist, aber es ist auch zu festgelegt, um migriert zu werden.

Antworten:


9

Warum nicht XML verwenden? Es gibt viele gute Parser, die XML-Dateien direkt in Datenstrukturen übersetzen, sogar eine für R ( http://cran.r-project.org/web/packages/XML/index.html ).

Das Format sieht folgendermaßen aus (Beispiel aus http://www.w3schools.com/xml/default.asp ).

<? xml version = "1.0"?>
<notes>
    <note>
        <to> Tove </ to>
        <von> Jani </ von>
        <Überschrift> Erinnerung </ Überschrift>
        <body> Vergiss mich dieses Wochenende nicht! </ body>
    </ note>
    <note>
        <to> Janis </ to>
        <von> Kardinal </ von>
        <Überschrift> Erinnerung </ Überschrift>
        <body> Vergiss mich am nächsten Wochenende nicht! </ body>
    </ note>
</ notes>

Beispiel: Verwenden des XML-Pakets:

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

gibt Zugriff auf den gesamten Notizenkörper,

z$doc$children$notes[1]

ist nur der erste Knoten und so weiter ...


1
Wenn Sie ein Beispiel zum Schreiben und Lesen der Daten mit dem R XML-Paket bereitstellen könnten, wäre dies großartig.
mpiktas

gute Idee; Es ist schon eine Weile her, seit ich XML verwendet habe. Ich werde es versuchen. XML scheint ziemlich ausführlich zu sein, aber ich kann mir vorstellen, dass ich die Situation mit ein paar Texteditorfunktionen verbessern könnte.
Jeromy Anglim

@mpiktas ok, fügte ein Beispiel hinzu
thias

@ JeromyAnglim Ich stimme zu, dass XML nicht so einfach zu lesen ist, aber mit Syntax-Hervorhebung sollten Sie in Ordnung sein, zumindest für die einfache Struktur, die Sie benötigen werden
dies ist der

XML ist großartig. Wie bei Gewalt, wenn es Ihr Problem nicht löst, verwenden Sie nicht genug davon ;-)
xmjx

6

Ich würde mit YAML gehen. Einfach zu bearbeiten und hat viele Parser in verschiedenen Sprachen:

---
- 
  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

Sie könnten dann ein kleines Skript schreiben, um das Falsche zufällig mit den richtigen Antworten zu mischen und das in der Antwort von DQdlM vorgeschlagene LaTeX auszugeben.

EDIT : Dieses Ruby-Skript:

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

Erzeugt die folgende Ausgabe

\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}

4

Dadurch werden Anwendungen, die über Ihre Multiple-Choice-Fragen hinausgehen, möglicherweise nicht vollständig behandelt. Für LaTeX ist jedoch eine Prüfungsklasse verfügbar.

Multiple-Choice-Fragen werden folgendermaßen gebildet:

\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}

Durch die Aufnahme \printanswersin Ihre Präambel wird die richtige Antwort hervorgehoben.


@ DQdIM danke. Das ist eigentlich das, was ich verwende, um das Endprodukt anzuzeigen, aber ich habe R-Code, um Artikel aus einer Artikeldatenbank auszuwählen und die einzelnen Artikel im Latexformat zu schreiben.
Jeromy Anglim

4

Org Mode kann das. Ein Weg wäre wie folgt:

#+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:

Wenn Sie eine kurze Übersichtstabelle visuell überprüfen möchten, fügen Sie Folgendes ein

* The column view

  #+BEGIN: columnview :hlines 1 :id global

  #+END:

Setzen Sie den Cursor in den #+BEGINBlock und tun Sie C-c C-x C-u, um zu bekommen

#+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:

und wenn Sie importieren möchten (zum Beispiel nach R), fügen Sie einen Tabellennamen wie folgt ein:

#+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:

Fügen Sie dann den folgenden R-Code-Block ein und führen Sie ihn aus mit C-c C-c:

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

das gibt

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

Die gute Nachricht ist, dass der Datenrahmen dfjetzt in der aktiven *R*Sitzung gespeichert ist und nach Belieben nachbearbeitet werden kann. Wenn ich es wäre, würde ich wahrscheinlich mit dem Prüfungspaket (in R) für die spezifische Anwendung des Speicherns / Schreibens von Multiple-Choice-Fragen beginnen, obwohl dieses YAML-Beispiel wirklich cool aussieht.


+1 nette Antwort. Ich war mir sicher, dass der Org-Modus dies tun könnte, aber ich wusste nicht wie
DQdlM

4

Hier einige zusätzliche Ideen:

  1. Verwenden Sie R selbst:

    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. Verwenden Sie reStructuredText , eine einfache Markup-Sprache, ähnlich wie Markdown, die in ein DOM (Python) analysiert werden kann, z.

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

Es gibt einen rst2xml-Writer, der Folgendes konvertiert:

<?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>

Es gibt auch einen rst2latex-Writer, sodass Ihr Test einfach zum Drucken formatiert werden kann und Sie die Daten mit Python und dem Dokumentobjektmodell verarbeiten können.

Der Vorteil dieser Option ist, dass rst im Gegensatz zu XML einfach zu lesen und zu schreiben ist, Ihre Daten jedoch weiterhin für die Verwendung in R, Python usw. strukturiert sind.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.