Apa tujuan umum format data teks biasa seperti yang digunakan untuk Bibtex? [Tutup]

8

Konteks

Saya sedang menulis beberapa soal latihan pilihan ganda dan saya ingin menyimpannya dalam format data teks sederhana. Saya sebelumnya menggunakan tab dibatasi, tetapi itu membuat pengeditan dalam editor teks agak canggung. Saya ingin menggunakan format yang sedikit seperti bibtex.

Misalnya,

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

Tampaknya properti penting adalah:

  • Data terdiri dari catatan
  • Setiap catatan memiliki beberapa pasangan nilai atribut
  • Setiap pasangan atribut-nilai dapat direkam pada baris baru, tetapi dapat menjangkau beberapa baris
  • Mudah memasukkan data tekstual secara manual dalam editor teks
  • Alat yang tersedia untuk dikonversi menjadi data tabular

Sebagai contoh, ini adalah sesuatu yang mirip dengan apa yang mungkin berhasil

@
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

Sementara saya tertarik pada konteks spesifik penulisan pertanyaan pilihan ganda, saya juga tertarik pada masalah yang lebih luas dalam merepresentasikan data dalam format ini atau sejenisnya.

Pikiran Awal

Pikiran awal saya termasuk yang berikut:

  • YAML
  • JSON
  • Data yang dibatasi dengan bidang khusus dan pembatas rekaman yang mengizinkan catatan multi-baris
  • Format file khusus dengan beberapa bentuk pengurai khusus

Saya hanya melihat sekilas pada YAML dan JSON; Kesan pertama saya adalah mereka mungkin over-kill. Pembatasan kustom mungkin baik, tetapi mungkin akan membutuhkan semua bidang untuk hadir dalam urutan yang konsisten untuk semua catatan. Menulis parser saya sendiri terdengar agak fiddly

Jeromy Anglim
sumber
1
Saya setuju dengan thias, bahwa XML mungkin cocok. Saya punya proyek di mana saya harus antarmuka R dengan server web. Mengekspor data dalam format xml sangat mudah. Satu-satunya masalah adalah bahwa saya tidak menemukan dokumentasi paket XML yang baik, jadi saya terpaksa menulis penulis xml saya sendiri. Parsing dilakukan dengan javascript dan senang digunakan.
mpiktas
1
Hm, saya mengambil kembali pernyataan saya tentang dokumentasi yang baik. Ini terlihat sangat mirip dengan apa yang ingin Anda capai.
mpiktas
hanya pemikiran (tidak sepenuhnya serius): Anda sebenarnya bisa menggunakan bibtex dengan bidang khusus untuk data Anda. Yang perlu Anda lakukan adalah menulis file .bst khusus. Maka itu hanya masalah menempatkan \ bibliografi {multiplechoice} dalam dokumen lateks Anda. Menulis .bst adalah rumit, meskipun dan Anda hanya memiliki akses dari lateks ...
thias
@ Macias saya akui ini tidak terlalu pada topik, namun juga terlalu menetap untuk dimigrasi.

Jawaban:

9

Mengapa tidak menggunakan XML? Ada banyak parser bagus yang secara langsung menerjemahkan file XML ke struktur data, bahkan satu untuk R ( http://cran.r-project.org/web/packages/XML/index.html ).

Formatnya terlihat seperti ini (contoh diambil dari http://www.w3schools.com/xml/default.asp ).

<? xml version = "1.0"?>
<notes>
    <note>
        <to> Tove </to>
        <dari> Jani </dari>
        <heading> Pengingat </heading>
        <body> Jangan lupakan aku akhir pekan ini! </body>
    </note>
    <note>
        <to> Janis </to>
        <dari> Kardinal </dari>
        <heading> Pengingat </heading>
        <body> Jangan lupakan aku akhir pekan depan! </body>
    </note>
</notes>

Misalnya, menggunakan paket XML:

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

memberikan akses ke badan catatan lengkap,

z$doc$children$notes[1]

hanya simpul pertama dan seterusnya ...

ini
sumber
1
jika Anda bisa memberikan contoh cara menulis dan membaca data dengan paket R XML itu akan bagus.
mpiktas
ide bagus; Sudah lama sejak saya menggunakan xml. Saya akan coba. XML tampaknya cukup bertele-tele, tetapi saya membayangkan saya dapat memperbaiki situasi dengan beberapa fitur editor teks.
Jeromy Anglim
@mpiktas ok, menambahkan contoh
thias
@JeromyAnglim Saya setuju bahwa XML tidak semudah itu dibaca tetapi dengan penyorotan sintaks, Anda harus baik-baik saja, setidaknya untuk struktur sederhana yang akan Anda butuhkan
thia
XML bagus. Seperti halnya kekerasan, jika itu tidak menyelesaikan masalah Anda, Anda tidak cukup menggunakannya ;-)
xmjx
6

Saya akan pergi dengan YAML. Terus maju untuk mengedit dan memiliki banyak parser dalam berbagai bahasa:

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

Anda kemudian dapat menulis skrip kecil untuk secara acak mencampur yang salah dengan jawaban yang benar dan menampilkan LaTeX yang disarankan dalam jawaban DQdlM.

EDIT : Skrip ruby ​​ini:

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

Akan menghasilkan output sebagai berikut

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

Ini mungkin tidak sepenuhnya membahas aplikasi di luar pertanyaan pilihan ganda Anda, tetapi ada kelas ujian yang tersedia untuk LaTeX.

Pertanyaan pilihan ganda terbentuk seperti ini:

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

Dengan memasukkan \printanswersdalam pembukaan Anda menyoroti jawaban yang benar.

DQdlM
sumber
@DQdIM terima kasih. Sebenarnya itulah yang saya gunakan untuk menampilkan produk akhir, tetapi saya memiliki kode R untuk memilih item dari database item dan menulis masing-masing item dalam format lateks.
Jeromy Anglim
4

Mode Org dapat melakukan itu. Satu cara akan seperti ini:

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

Jika Anda ingin secara visual memeriksa tabel ringkasan cepat, maka masukkan berikut ini

* The column view

  #+BEGIN: columnview :hlines 1 :id global

  #+END:

Letakkan kursor di #+BEGINblok dan lakukan C-c C-x C-uuntuk mendapatkan

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

dan jika Anda ingin mengimpor (ke R, misalnya) maka masukkan nama tabel seperti ini:

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

kemudian masukkan dan jalankan blok kode R berikut dengan C-c C-c:

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

ini memberi

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

Berita baiknya adalah bahwa kerangka data dfsekarang disimpan dalam *R*sesi aktif dan tersedia untuk diposkan sesuka Anda. Semua ini dikatakan, jika itu saya, saya mungkin akan mulai dengan paket ujian (dalam R) untuk aplikasi khusus menyimpan / menulis pertanyaan pilihan ganda, meskipun contoh YAML terlihat sangat keren.


sumber
+1 jawaban yang bagus. Saya yakin mode org bisa melakukan ini tetapi saya tidak tahu caranya
DQdlM
4

Berikut adalah beberapa ide tambahan:

  1. Gunakan R itu sendiri:

    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. Gunakan reStructuredText , yang merupakan bahasa markup yang ringan, mirip dengan markdown, yang dapat diuraikan menjadi DOM (Python), misalnya:

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

Ada penulis rst2xml yang mengonversi di atas ke:

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

Ada juga penulis rst2latex, sehingga pengujian Anda dapat dengan mudah diformat untuk dicetak, dan Anda dapat menangani data menggunakan python dan model objek dokumen.

Keuntungan dari opsi ini adalah pertama mudah dibaca dan ditulis, tidak seperti XML, tetapi data Anda masih terstruktur untuk digunakan dalam R, Python, dll.

Ed Hagen
sumber