O que é um bom formato de dados de texto simples de uso geral como o usado para o Bibtex? [fechadas]

8

Contexto

Estou escrevendo algumas questões práticas de múltipla escolha e gostaria de armazená-las em um formato de dados de texto simples. Eu já usei delimitado por tabulação, mas isso torna a edição em um editor de texto um pouco estranha. Eu gostaria de usar um formato parecido com o bibtex.

Por exemplo,

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

Propriedades importantes parecem ser:

  • Os dados são compostos de registros
  • Cada registro possui vários pares de atributo-valor
  • Cada par atributo-valor pode ser gravado em uma nova linha, mas pode abranger várias linhas
  • Fácil de inserir manualmente dados de texto em um editor de texto
  • Ferramentas prontamente disponíveis para converter em dados tabulares

Por exemplo, aqui está algo parecido com o que pode 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

Embora eu esteja interessado no contexto específico de escrever perguntas de múltipla escolha, também estou interessado na questão mais ampla de representar dados neste ou em um tipo semelhante de formato.

Pensamentos iniciais

Meus pensamentos iniciais incluíram o seguinte:

  • YAML
  • JSON
  • Dados delimitados com delimitadores de campo e registro personalizados que permitem registros de várias linhas
  • Um formato de arquivo personalizado com alguma forma de analisador personalizado

Eu só dei uma olhada rápida no YAML e JSON; Minhas primeiras impressões são de que elas podem ser exageradas. A delimitação personalizada pode ser boa, mas provavelmente exigiria que todos os campos estivessem presentes em uma ordem consistente para todos os registros. Escrever meu próprio analisador parece um pouco complicado.

Jeromy Anglim
fonte
1
Concordo com thias, que XML pode ser um bom ajuste. Eu tive um projeto em que tive que fazer interface com R com servidor da web. Exportar dados no formato xml foi muito conveniente. O único problema é que eu não encontrei nenhuma boa documentação de pacote XML, então comecei a escrever meu próprio gravador de XML. A análise foi feita com javascript e foi uma alegria usar.
Mvctas # 4/11
1
Hmm, retiro minha declaração sobre boa documentação. Isso parece muito com o que você deseja alcançar.
mpiktas
apenas um pensamento (não totalmente sério): você pode realmente usar o bibtex com campos personalizados para seus dados. Tudo o que você precisa fazer é gravar um arquivo .bst personalizado. É apenas uma questão de colocar \ bibliography {multiplechoice} no seu documento de látex. Escrevendo o .bst é complicado, embora e você só tem acesso a partir do látex ...
thias
@macias Eu admito que isso não é muito específico, mas também está resolvido demais para ser migrado.

Respostas:

9

Por que não usar XML? Existem muitos bons analisadores que convertem diretamente arquivos XML em estruturas de dados, mesmo um para R ( http://cran.r-project.org/web/packages/XML/index.html ).

O formato é semelhante a este (exemplo extraído de http://www.w3schools.com/xml/default.asp ).

<? xml version = "1.0"?>
<notas>
    <nota>
        <to> Tove </to>
        Jani </from>
        <heading> Lembrete </heading>
        <body> Não me esqueça este fim de semana! </body>
    </note>
    <nota>
        Janis </to>
        <from> Cardeal </from>
        <heading> Lembrete </heading>
        <body> Não me esqueça no próximo fim de semana! </body>
    </note>
</notes>

Por exemplo, usando o pacote XML:

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

dá acesso ao corpo completo das notas,

z$doc$children$notes[1]

é apenas o primeiro nó e assim por diante ...

thias
fonte
1
se você pudesse fornecer um exemplo de como escrever e ler os dados com o pacote R XML, seria ótimo.
Mvctas #
boa ideia; Já faz um tempo desde que eu usei xml. Vou tentar. XML parece bastante detalhado, mas imagino que poderia melhorar a situação com alguns recursos do editor de texto.
Jeromy Anglim
@mpiktas ok, adicionou um exemplo
thias 4/11
@JeromyAnglim Concordo que XML não é tão fácil de ler, mas com destaque de sintaxe, você deve estar bem, pelo menos para a estrutura simples que você vai precisar
thias
XML é ótimo. Tal como acontece com a violência, se não resolver o seu problema, você não está usando o suficiente ;-)
xmjx
6

Eu iria com YAML. Simples de editar e possui muitos analisadores em 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

Você pode escrever um pequeno script para misturar aleatoriamente o incorreto com as respostas corretas e produzir o LaTeX sugerido na resposta do DQdlM.

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

Produzirá a seguinte saída

\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
fonte
4

Isso pode não atender totalmente aos aplicativos além das perguntas de múltipla escolha, mas há uma aula de exame disponível para o LaTeX.

Perguntas de múltipla escolha são formadas da seguinte maneira:

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

Ao incluir \printanswersno seu preâmbulo, destaca a resposta correta.

DQdlM
fonte
@DQdIM thanks. Isso é realmente o que eu uso para exibir o produto final, mas tenho código R para selecionar itens de um banco de dados e gravar os itens individuais no formato de látex.
Jeromy Anglim
4

O modo organizacional pode fazer isso. Uma maneira seria assim:

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

Se você deseja inspecionar visualmente uma tabela de resumo rápida, insira o seguinte

* The column view

  #+BEGIN: columnview :hlines 1 :id global

  #+END:

Coloque o cursor no #+BEGINbloco e faça C-c C-x C-upara obter

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

e se você deseja importar (para R, por exemplo), insira um nome de tabela 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:

insira e execute o seguinte bloco de código R com C-c C-c:

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

isto dá

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

A boa notícia é que o quadro de dados dfagora está armazenado na *R*sessão ativa e está disponível para pós-processo como você desejar. Tudo isso sendo dito, se fosse eu, provavelmente começaria com o pacote de exames (em R) para a aplicação específica de armazenar / escrever perguntas de múltipla escolha, embora esse exemplo do YAML pareça muito legal.


fonte
+1 boa resposta. Eu tinha certeza de modo org poderia fazer isso, mas eu não sabia como
DQdlM
4

Aqui estão algumas idéias adicionais:

  1. Use o próprio R:

    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. Use reStructuredText , que é uma linguagem de marcação leve, semelhante à markdown, que pode ser analisada em um DOM (Python), por exemplo:

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

Há um gravador rst2xml que converte o acima em:

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

Há também um gravador rst2latex, para que seu teste possa ser facilmente formatado para impressão e você possa lidar com os dados usando python e o modelo de objeto do documento.

A vantagem dessa opção é que o rst é fácil de ler e gravar, diferentemente do XML, mas seus dados ainda estão estruturados para uso em R, Python, etc.

Ed Hagen
fonte