Bibtexで使用されているような優れた汎用プレーンテキストデータ形式とは何ですか?[閉まっている]


8

環境

私はいくつかの多肢選択問題の質問を書いており、それらを単純なプレーンテキストデータ形式で保存したいと考えています。以前はタブ区切りを使用していましたが、テキストエディターでの編集は少し厄介です。ビブテックスのようなフォーマットを使いたいのですが。

例えば、

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

重要なプロパティは次のようです:

  • データはレコードで構成されています
  • 各レコードには複数の属性と値のペアがあります
  • 各属性と値のペアは新しい行に記録できますが、複数の行にまたがることができます
  • テキストエディターにテキストデータを手動で入力するのは簡単
  • 表形式のデータに変換するためのすぐに利用できるツール

たとえば、これはうまくいくかもしれないもののようなものです

@
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

私は複数選択の質問を書くという特定のコンテキストに興味がありますが、この形式または類似の形式でデータを表現するというより広範な問題にも興味があります。

最初の考え

私の最初の考えは以下を含みました:

  • YAML
  • JSON
  • 複数行のレコードを許可するカスタムフィールドとレコード区切り記号を使用して区切られたデータ
  • 何らかの形式のカスタムパーサーを含むカスタムファイル形式

私はYAMLとJSONをざっと見てきました。私の第一印象は、彼らはやり過ぎかもしれないということです。カスタム区切りは良いかもしれませんが、それはおそらくすべてのレコードに対して一貫した順序ですべてのフィールドが存在することを必要とするでしょう。私自身のパーサーを書くのは少し面倒です。


1
私はティアスに同意します。XMLが適しているかもしれません。私はRをwebserverとインターフェースしなければならないプロジェクトを持っていました。XML形式でのデータのエクスポートは非​​常に便利でした。唯一の問題は、適切なXMLパッケージのドキュメントが見つからなかったため、独自のxmlライターを作成することにしました。解析はjavascriptで行われていて、使うのは楽しかったです。
mpiktas

1
うーん、私は良いドキュメントについての私の声明を取り戻します。これは、あなたが達成したいことに非常に似ています。
mpiktas

(真剣ではありませんが)ただの考えです。実際には、bibtexとカスタムフィールドをデータに使用できます。次に行う必要があるのは、カスタム.bstファイルを書き込むことだけです。ラテックス文書に\ bibliography {multiplechoice}を入れるだけです。.bstの記述は面倒ですが、ラテックスからしかアクセスできません...
thias

@maciasこれはあまり話題になっていないと認めますが、移行するにはあまりにも落ち着いています。

回答:


9

XMLを使用しないのはなぜですか?XMLファイルをデータ構造に直接変換する多くの優れたパーサーがあり、R向けのものも含まれます(http://cran.r-project.org/web/packages/XML/index.html)。

形式は次のようになります(http://www.w3schools.com/xml/default.aspからの例)。

<?xml version = "1.0"?>
<注意事項>
    <注>
        <to>移動</ to>
        <from> Jani </ from>
        <heading>リマインダー</ heading>
        <body>今週末も忘れずに!</ body>
    </ note>
    <注>
        <to> Janis </ to>
        <from>カーディナル</ from>
        <heading>リマインダー</ heading>
        <body>次の週末に私を忘れないでください!</ body>
    </ note>
</ notes>

たとえば、XMLパッケージを使用します。

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

完全なノート本文へのアクセスを提供し、

z$doc$children$notes[1]

は最初のノードにすぎません...


1
R XMLパッケージを使用してデータを読み書きする方法の例を提供できれば、すばらしいでしょう。
mpiktas

良いアイデア; 私がxmlを使用してから久しぶりです。やってみます。XMLはかなり冗長に思えますが、いくつかのテキストエディター機能を使用して状況を改善できると思います。
Jeromy Anglim 2011年

@mpiktas ok、例を追加
thias

@JeromyAnglim私はXMLが読みやすいが、シンタックスハイライトで、あなたは少なくとも、あなたが必要としているシンプルな構造のため、細かいでなければならないことのすべてではないに同意
thias

XMLは素晴らしいです。暴力と同様に、問題が解決しない場合は、十分に使用していません;-)
xmjx

6

YAMLを使用します。編集するのが簡単で、さまざまな言語のパーサーがたくさんあります。

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

次に、小さなスクリプトを記述して、不正解と正解をランダムに混合し、DQdlMの回答で提案されたLaTeXを出力します。

編集:このルビスクリプト:

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

次の出力を生成します

\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

これは、多肢選択式の質問以外のアプリケーションには完全に対応しない場合がありますが、LaTeXで利用可能な試験クラスがあります。

複数の選択肢の質問は次のように形成されます:

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

\printanswersあなたのプリアンブルに含めることにより、それは正しい答えを強調します。


@DQdIMありがとう。これが実際に最終製品を表示するために使用するものですが、アイテムデータベースからアイテムを選択して個々のアイテムをLatex形式で書き込むRコードがあります。
Jeromy Anglim、2011年

4

組織モードはそれを行うことができます。1つの方法は次のようになります。

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

クイックサマリーテーブルを視覚的に検査する場合は、以下を挿入します

* The column view

  #+BEGIN: columnview :hlines 1 :id global

  #+END:

カーソルを#+BEGINブロックに置き、C-c C-x C-u取得する

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

(たとえばRに)インポートする場合は、次のようにテーブル名を挿入します。

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

次に、次のRコードブロックを挿入して実行しますC-c C-c

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

これは与える

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

良いニュースは、データフレームdfがアクティブな*R*セッションに保存され、好きなように後処理できることです。これらすべてが言われたら、私なら、多肢選択式の質問を保存/作成する特定のアプリケーション用の試験パッケージ(R)から始めますが、そのYAMLの例はとてもかっこいいです。


いい答えを1つ。組織モードでこれができると確信していたが、方法がわからなかった
DQdlM

4

追加のアイデアをいくつか紹介します。

  1. 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. マークダウンに似た軽量のマークアップ言語であるreStructuredTextを使用して、DOM(Python)に解析できます。例:

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

上記を次のように変換するrst2xmlライターがあります。

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

rst2latexライターもあるので、テストを印刷用に簡単にフォーマットでき、Pythonとドキュメントオブジェクトモデルを使用してデータを処理できます。

このオプションの利点は、XMLとは異なり、最初は読み書きが簡単ですが、データは引き続きR、Pythonなどで使用できるように構造化されています。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.