Định dạng dữ liệu văn bản thuần túy có mục đích chung tốt như thế nào được sử dụng cho Bibtex là gì? [đóng cửa]


8

Bối cảnh

Tôi đang viết một vài câu hỏi thực hành trắc nghiệm và tôi muốn lưu trữ chúng ở định dạng dữ liệu văn bản đơn giản. Trước đây tôi đã sử dụng tab được phân định, nhưng điều đó làm cho việc chỉnh sửa trong trình soạn thảo văn bản hơi khó xử. Tôi muốn sử dụng một định dạng hơi giống như bibtex.

Ví dụ,

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

Các tính chất quan trọng dường như là:

  • Dữ liệu được tạo thành từ các hồ sơ
  • Mỗi bản ghi có nhiều cặp giá trị thuộc tính
  • Mỗi cặp giá trị thuộc tính có thể được ghi lại trên một dòng mới, nhưng có thể trải dài trên nhiều dòng
  • Dễ dàng nhập thủ công dữ liệu văn bản trong trình soạn thảo văn bản
  • Các công cụ sẵn có để chuyển đổi thành dữ liệu dạng bảng

Ví dụ, đây là một cái gì đó giống như những gì có thể làm việc

@
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

Mặc dù tôi quan tâm đến bối cảnh cụ thể của việc viết các câu hỏi trắc nghiệm, tôi cũng quan tâm đến vấn đề rộng hơn về việc thể hiện dữ liệu theo định dạng này hoặc một loại định dạng tương tự.

Suy nghĩ ban đầu

Suy nghĩ ban đầu của tôi bao gồm:

  • YAML
  • JSON
  • Dữ liệu được phân tách bằng trường tùy chỉnh và dấu phân cách bản ghi cho phép bản ghi nhiều dòng
  • Một định dạng tệp tùy chỉnh với một số dạng trình phân tích cú pháp tùy chỉnh

Tôi chỉ có một cái nhìn nhanh về YAML và JSON; Ấn tượng đầu tiên của tôi là họ có thể bị giết quá mức. Phân định tùy chỉnh có thể tốt, nhưng có lẽ sẽ yêu cầu tất cả các trường phải có mặt theo thứ tự nhất quán cho tất cả các bản ghi. Viết trình phân tích cú pháp của riêng tôi nghe có vẻ hơi khó khăn.


1
Tôi đồng ý với thias, rằng XML có thể phù hợp. Tôi đã có một dự án mà tôi phải giao diện R với máy chủ web. Xuất dữ liệu ở định dạng xml rất thuận tiện. Vấn đề duy nhất là tôi không tìm thấy bất kỳ tài liệu gói XML tốt nào, vì vậy tôi đã dùng đến cách viết trình soạn thảo xml của riêng tôi. Phân tích cú pháp đã được thực hiện với javascript và đó là niềm vui khi sử dụng.
mpiktas

1
Hừm, tôi lấy lại tuyên bố của tôi về tài liệu tốt. Điều này trông rất giống với những gì bạn muốn đạt được.
mpiktas

chỉ là một suy nghĩ (không hoàn toàn nghiêm túc): Bạn thực sự có thể sử dụng bibtex với các trường tùy chỉnh cho dữ liệu của bạn. Tất cả những gì bạn cần làm là viết một tệp .bst tùy chỉnh. Sau đó, vấn đề chỉ là đưa \ bibliography {Multipechoice} vào tài liệu latex của bạn. Tuy nhiên, việc viết .bst rất cồng kềnh và bạn chỉ có quyền truy cập từ latex ...
thias

@macias Tôi thừa nhận điều này không quá chủ đề, nhưng nó cũng quá ổn định để được di chuyển.

Câu trả lời:


9

Tại sao không sử dụng XML? Có nhiều trình phân tích cú pháp tốt dịch trực tiếp các tệp XML sang cấu trúc dữ liệu, thậm chí một tệp cho R ( http://cran.r-project.org/web/packages/XML/index.html ).

Định dạng trông như thế này (ví dụ được lấy từ http://www.w3schools.com/xml/default.asp ).

<? xml phiên bản = "1.0"?>
<ghi chú>
    <lưu ý>
        <đến> Tove </ to>
        <từ> Jani </ từ>
        <đề> Nhắc nhở </ đề>
        <body> Đừng quên tôi vào cuối tuần này! </ body>
    </ lưu ý>
    <lưu ý>
        <đến> Janis </ to>
        <từ> Hồng y </ từ>
        <đề> Nhắc nhở </ đề>
        <body> Đừng quên tôi vào cuối tuần tới! </ body>
    </ lưu ý>
</ ghi chú>

Ví dụ: sử dụng gói XML:

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

cấp quyền truy cập vào phần ghi chú hoàn chỉnh

z$doc$children$notes[1]

chỉ là nút đầu tiên và cứ thế ...


1
nếu bạn có thể cung cấp ví dụ về cách viết và đọc dữ liệu với gói R XML thì sẽ rất tuyệt.
mpiktas

ý tưởng tốt; Đã được một thời gian kể từ khi tôi sử dụng xml. Tôi sẽ thử. XML có vẻ khá dài dòng, nhưng tôi tưởng tượng mình có thể cải thiện tình hình với một vài tính năng soạn thảo văn bản.
Jeromy Anglim

@mpiktas ok, đã thêm một ví dụ
thias

@JeromyAnglim Tôi đồng ý rằng XML không dễ đọc nhưng với tô sáng cú pháp, bạn sẽ ổn, ít nhất là đối với cấu trúc đơn giản bạn sẽ cần
thias

XML thật tuyệt. Như với bạo lực, nếu nó không giải quyết được vấn đề của bạn, thì bạn không sử dụng đủ nó ;-)
xmjx

6

Tôi sẽ đi với YAML. Chuyển thẳng để chỉnh sửa và có nhiều trình phân tích cú pháp bằng các ngôn ngữ khác nhau:

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

Sau đó, bạn có thể viết một tập lệnh nhỏ để trộn ngẫu nhiên các câu trả lời không chính xác và đưa ra LaTeX được đề xuất trong câu trả lời của DQdlM.

EDIT : Kịch bản ruby ​​này:

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

Sẽ tạo ra đầu ra sau

\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

Điều này có thể không giải quyết đầy đủ các ứng dụng ngoài các câu hỏi trắc nghiệm của bạn nhưng có một lớp thi dành cho LaTeX.

Câu hỏi trắc nghiệm được hình thành như thế này:

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

Bằng cách đưa \printanswersvào lời mở đầu của bạn, nó làm nổi bật câu trả lời đúng.


@DQdIM cảm ơn. Đó thực sự là những gì tôi sử dụng để hiển thị sản phẩm cuối cùng, nhưng tôi có mã R để chọn các mục từ cơ sở dữ liệu vật phẩm và viết các mục riêng lẻ ở định dạng latex.
Jeromy Anglim

4

Chế độ Org có thể làm điều đó. Một cách sẽ như thế này:

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

Nếu bạn muốn kiểm tra trực quan một bảng tóm tắt nhanh thì hãy chèn vào đây

* The column view

  #+BEGIN: columnview :hlines 1 :id global

  #+END:

Đặt con trỏ trong #+BEGINkhối và làm C-c C-x C-uđể có được

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

và nếu bạn muốn nhập (ví dụ R), hãy chèn tên bảng như thế này:

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

sau đó chèn và thực thi khối mã R sau với C-c C-c:

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

cái này cho

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

Tin vui là khung dữ liệu dfhiện được lưu trữ trong *R*phiên hoạt động và có sẵn để xử lý hậu kỳ theo cách bạn muốn. Tất cả điều này được nói, nếu là tôi, có lẽ tôi sẽ bắt đầu với gói bài kiểm tra (tính bằng R) cho ứng dụng cụ thể về lưu trữ / viết câu hỏi trắc nghiệm, mặc dù ví dụ YAML đó trông rất tuyệt.


+1 câu trả lời hay. Tôi chắc chắn chế độ org có thể làm điều này nhưng tôi không biết làm thế nào
DQdlM

4

Dưới đây là một vài ý tưởng bổ sung:

  1. Sử dụng R chính nó:

    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. Sử dụng reSturationuredText , một ngôn ngữ đánh dấu nhẹ, tương tự như đánh dấu, có thể được phân tích cú pháp thành DOM (Python), ví dụ:

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

Có một nhà văn rst2xml chuyển đổi ở trên thành:

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

Ngoài ra còn có một trình ghi rst2latex, vì vậy bài kiểm tra của bạn có thể dễ dàng được định dạng để in và bạn có thể xử lý dữ liệu bằng python và mô hình đối tượng tài liệu.

Ưu điểm của tùy chọn này là rst dễ đọc và viết, không giống như XML, nhưng dữ liệu của bạn vẫn được cấu trúc để sử dụng trong R, Python, v.v.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.