OTM-JSON

提供:人工言語学Wiki

OTM-JSON(OneToMany-JSON)は、スライム氏などによって考え出された人工言語辞書のデータ形式。

標準的な OTM-JSON はトップレベルに words 属性をもち、これは単語 1 つに相当するオブジェクト(word)の配列である。word オブジェクトは次の属性をもつ:

  • entry : id(項目 ID)と form(見出し語)の属性をもつオブジェクト。
  • translations : title(品詞)と forms(訳語の配列)の属性をもつオブジェクトの配列。
  • tags : タグの配列。
  • contents : title(記述タイトル(注釈や語法など))と text(記述内容)の属性をもつオブジェクトの配列。OTM-JSON では自由記述はここに書かれる。
  • variations : title(変化形名(過去形、未来形など))と form(語形)の属性をもつオブジェクトの配列。
  • relations : title(関係性(同義語、対義語など))と entry(語項目)の属性をもつオブジェクトの配列。

よって、OTM-JSON には、単語オブジェクト、見出し語オブジェクト、翻訳オブジェクト、記述オブジェクト、語形変化オブジェクト、関連語オブジェクトが登場する。

厳密な仕様

この節では、OTM-JSON 形式の厳密な仕様を述べる。 以下、<string> は文字列を表し、<integer> は整数値を表す。 また、[<foo>] は要素が <foo> からなる配列を表す。

整数値は、アプリケーションの予期せぬ動作を防ぐため、-2147483648 以上 2147483647 未満 (符号付き 4 バイト) が望ましい。

バージョンに関わらずトップレベルには version キーが存在し、この値によってバージョンを区別する。 後方互換性のため、この version キーは存在しなくてもよく、その場合は version 1 であるとする。

version 1

<otm> ::= {
  "words": [<word>],
  "version": 1        // バージョンは1で固定 (互換性のためこのキーはなくても良い)
}
<word> ::= {
  "entry": {
    "id": <integer>,  // 項目ID (<word>全体の中で一意)
    "form": <string>  // 見出し語
  },
  "translations": [<translation>],
  "tags": [<string>],  // タグの配列
  "contents": [<content>],
  "variations": [<variation>],
  "relations": [<relation>]
}
<translation> ::= {
  "title": <string>,   // 品詞タグ
  "forms": [<string>]  // 訳語の配列
}
<content> ::= {
  "title": <string>,
  "text": <string>
}
<variation> ::= {
  "title": <string>,  // 変化型の説明 (活用形態など)
  "form": <string>    // 変化形の綴り
}
<relation> ::= {
  "title": <string>,  // 関連語の説明
  "entry": {
    "id": <integer>,  // 項目ID
    "form": <string>  // 見出し語
  }
}

<word>entry キーの値の中の id キーの値は、その JSON ファイル内で重複してはならない。 また、<relation>entry キーの値は、その JSON ファイル内に存在する <word> がもつ entry キーのうちちょうど 1 つと全く同じでなければならない。

トップレベルの <otm> には上に記されたキー以外のキーをもつことが許される。 これは主に、OTM-JSON 形式を扱うソフトウェアが、独自の設定項目を保存するために使われる。 したがって、OTM-JSON 形式の入出力を行うソフトウェアは、読み込んだファイルを編集する際に、そのソフトウェアには必要のない words 以外のキーは変更せずにそのまま出力すべきである。

version 2

<otm> ::= {
  "words": [<word>],
  "version": 2
}

version 2 の仕様は version 1 と全く同じだが、トップレベルに余分なキーをもつことが許されるのに加え、<word> 内のあらゆるオブジェクトに関しても余分なキーをもつことが許される。 これにより、OTM-JSON 形式を扱うソフトウェアが、単語ごとの設定項目などを保存することができる。

拡張

ZpDIC では、<otm>zpdic というキーを追加して、ZpDIC 内で用いるデータを格納している。 zpdic キーの値を <zpdic> と書くことにすれば、その仕様は以下の通りである (ver 1.3.0)。

<zpdic> ::= {
  "alphabetOrder" : <string>,                   // アルファベット順を表す文字列
  "plainInformationTitles" : [<string>],        // ラベル後に改行しない項目名の配列
  "informationTitleOrder" : null | [<string>],  // 内容の表示順, 設定しない場合は null
  "defaultWord" : <word>                        // 新規作成時のデフォルトデータ
}

また、おかゆ氏が作成しているロジバン辞書の OTM-JSON 形式には、meta 属性が追加され、翻訳元/先言語の情報が格納されている。

名称の由来

名称に「OTM」が入っている理由は以下の 2 つである。

  • 一つ目は DB を使うことで一対多のデータを扱うのが楽になる。
  • 一つの形式で、多種多様な言語の表記ができる [1]

対応ソフトウェア

2016 年 11 月現在、OTM-JSON 形式に対応した辞書ソフトに ZpDIC がある。

2020 年 3 月から C# で OTM-JSON 形式を扱うためのライブラリ Otamajakushi がある。

外部リンク

https://togetter.com/li/1363644

補稿: CDDLによるスキーマ記述例

RFC8610に基づく。

otm-json = otm-json-1 / otm-json-2

otm-json-1 = {
  "words": [ * word-1 ]
  "version": 1
  * tstr => any
}

word-1 = {
  "entry": entry-1
  "translations": [ * translation-1 ]
  "tags": [ * tstr ]
  "contents": [ * content-1 ]
  "variations": [ * variation-1 ]
  "relations": [ * relation-1 ]
}

entry-1 = {
  "id": int .size 4
  "form": tstr
}

translation-1 = {
  "title": tstr
  "forms": [ * tstr ]
}

content-1 = {
  "title": tstr
  "text": tstr
}

variation-1 = {
  "title": tstr
  "form": tstr
}

relation-1 = {
  "title": tstr
  "entry": entry-1
}

otm-json-2 = {
  "words": [ * word-2 ]
  "version": 2
  * tstr => any
}

word-2 = {
  "entry": entry-2
  "translations": [ * translation-2 ]
  "tags": [ * tstr ]
  "contents": [ * content-2 ]
  "variations": [ * variation-2 ]
  "relations": [ * relation-2 ]
  * tstr => any
}

entry-2 = {
  "id": int .size 4
  "form": tstr
  * tstr => any
}

translation-2 = {
  "title": tstr
  "forms": [ * tstr ]
  * tstr => any
}

content-2 = {
  "title": tstr
  "text": tstr
  * tstr => any
}

variation-2 = {
  "title": tstr
  "form": tstr
  * tstr => any
}

relation-2 = {
  "title": tstr
  "entry": entry-2
  * tstr => any
}