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 がある。
外部リンク
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
}