Qu'est-ce qu'un bon format de données en texte brut comme celui utilisé pour Bibtex? [fermé]

8

Le contexte

J'écris quelques questions pratiques à choix multiples et j'aimerais les stocker dans un format de données en texte simple. J'ai déjà utilisé des tabulations, mais cela rend l'édition un peu délicate dans un éditeur de texte. Je voudrais utiliser un format un peu comme bibtex.

Par exemple,

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

Les propriétés importantes semblent être:

  • Les données sont constituées d'enregistrements
  • Chaque enregistrement a plusieurs paires attribut-valeur
  • Chaque paire attribut-valeur peut être enregistrée sur une nouvelle ligne, mais peut s'étendre sur plusieurs lignes
  • Saisie facile des données textuelles dans un éditeur de texte
  • Outils facilement disponibles pour convertir en données tabulaires

Par exemple, voici quelque chose un peu comme ce qui pourrait fonctionner

@
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

Bien que je m'intéresse au contexte spécifique de la rédaction de questions à choix multiples, je suis également intéressé par la question plus large de la représentation des données dans ce format ou un type similaire de format.

Réflexions initiales

Mes pensées initiales étaient les suivantes:

  • YAML
  • JSON
  • Données délimitées avec délimiteurs de champs et d'enregistrements personnalisés qui permettent des enregistrements sur plusieurs lignes
  • Un format de fichier personnalisé avec une certaine forme d'analyseur personnalisé

Je n'ai eu qu'un bref aperçu de YAML et JSON; Mes premières impressions sont qu'elles pourraient être excessives. La délimitation personnalisée peut être bonne, mais elle nécessiterait probablement que tous les champs soient présents dans un ordre cohérent pour tous les enregistrements. Écrire mon propre analyseur sonne un peu compliqué.

Jeromy Anglim
la source
1
Je suis d'accord avec thias, que XML pourrait être un bon choix. J'avais un projet où je devais interfacer R avec un serveur web. L'exportation de données au format xml était très pratique. Le seul problème est que je n'ai pas trouvé de bonne documentation sur les packages XML, j'ai donc dû écrire mon propre écrivain xml. L'analyse a été effectuée avec javascript et c'était une joie à utiliser.
mpiktas
1
Hm, je reprends ma déclaration sur la bonne documentation. Cela ressemble beaucoup à ce que vous souhaitez réaliser.
mpiktas
juste une pensée (pas entièrement sérieuse): vous pouvez réellement utiliser bibtex avec des champs personnalisés pour vos données. Il vous suffit alors d'écrire un fichier .bst personnalisé. Il ne s'agit alors que de mettre \ bibliography {multiplechoice} dans votre document latex. L'écriture du .bst est cependant lourde et vous n'avez accès qu'à partir du latex ...
thias
@macias J'avoue que ce n'est pas trop sur le sujet, mais c'est aussi trop réglé pour être migré.

Réponses:

9

Pourquoi ne pas utiliser XML? Il existe de nombreux bons analyseurs qui traduisent directement les fichiers XML en structures de données, même un pour R ( http://cran.r-project.org/web/packages/XML/index.html ).

Le format ressemble à ceci (exemple tiré de http://www.w3schools.com/xml/default.asp ).

<? xml version = "1.0"?>
<notes>
    <note>
        <to> Tove </to>
        <from> Jani </from>
        <heading> Rappel </heading>
        <body> Ne m'oubliez pas ce week-end! </body>
    </note>
    <note>
        <to> Janis </to>
        <from> Cardinal </from>
        <heading> Rappel </heading>
        <body> Ne m'oubliez pas le week-end prochain! </body>
    </note>
</notes>

Par exemple, en utilisant le package XML:

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

donne accès au corps complet des notes,

z$doc$children$notes[1]

est juste le premier nœud et ainsi de suite ...

thias
la source
1
si vous pouviez fournir un exemple d'écriture et de lecture des données avec le package R XML, ce serait bien.
mpiktas
bonne idée; Cela fait un moment que je n'ai pas utilisé xml. Je vais essayer. XML semble assez verbeux, mais j'imagine que je pourrais améliorer la situation avec quelques fonctionnalités d'éditeur de texte.
Jeromy Anglim
@mpiktas ok, a ajouté un exemple
thias
@JeromyAnglim Je suis d'accord que XML n'est pas si facile à lire mais avec la coloration syntaxique, ça devrait aller, au moins pour la structure simple dont vous allez avoir besoin
thias
XML est génial. Comme pour la violence, si elle ne résout pas votre problème, vous n'en utilisez pas assez ;-)
xmjx
6

J'irais avec YAML. Simple à éditer et dispose de nombreux analyseurs dans différentes langues:

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

Vous pouvez ensuite écrire un petit script pour mélanger au hasard les réponses incorrectes et correctes et produire le LaTeX suggéré dans la réponse de DQdlM.

EDIT : Ce script rubis:

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

Produira la sortie suivante

\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
la source
4

Cela peut ne pas répondre pleinement aux demandes au-delà de vos questions à choix multiples, mais il existe un cours d' examen pour LaTeX.

Les questions à choix multiples sont formées comme suit:

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

En l'incluant \printanswersdans votre préambule, elle met en évidence la bonne réponse.

DQdlM
la source
@DQdIM merci. C'est en fait ce que j'utilise pour afficher le produit final, mais j'ai un code R pour sélectionner des articles dans une base de données d'articles et écrire les articles individuels au format latex.
Jeromy Anglim
4

Le mode org peut le faire. Une façon serait la suivante:

#+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 vous souhaitez inspecter visuellement un tableau récapitulatif rapide, insérez ce qui suit

* The column view

  #+BEGIN: columnview :hlines 1 :id global

  #+END:

Mettez le curseur dans le #+BEGINbloc et faites C-c C-x C-upour obtenir

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

et si vous souhaitez importer (vers R, par exemple), insérez un nom de table comme celui-ci:

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

puis insérez et exécutez le bloc de code R suivant avec C-c C-c:

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

cela donne

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

La bonne nouvelle est que le bloc de données dfest maintenant stocké dans la *R*session active et est disponible pour le post-traitement comme vous le souhaitez. Tout cela étant dit, si c'était moi, je commencerais probablement par le package d' examens (en R) pour l'application spécifique de stockage / écriture de questions à choix multiples, bien que cet exemple YAML soit vraiment cool.


la source
+1 belle réponse. J'étais sûr que le mode org pouvait le faire, mais je ne savais pas comment
DQdlM
4

Voici quelques idées supplémentaires:

  1. Utilisez R lui-même:

    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. Utilisez reStructuredText , qui est un langage de balisage léger, similaire au markdown, qui peut être analysé dans un DOM (Python), par exemple:

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

Il existe un rédacteur rst2xml qui convertit ce qui précède en:

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

Il y a aussi un rédacteur rst2latex, donc votre test peut être facilement formaté pour l'impression, et vous pouvez traiter les données en utilisant python et le modèle d'objet de document.

L'avantage de cette option est que rst est facile à lire et à écrire, contrairement à XML, mais vos données sont toujours structurées pour être utilisées dans R, Python, etc.

Ed Hagen
la source