OTM-JSON
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 がある。
外部リンク
補稿: 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
}