Git構造化辞書

ページ名:Git構造化辞書

Git構造化辞書は、デネブさんによって考案されている辞書形式であり、Gitオブジェクトの構造を、辞書の情報構造の表現に効果的に利用するというアイデアである。

目次

モチベーション

発端は、以下のような辞書管理上の要請による。

辞書をバージョン管理したい

このモチベーションは自明であろう。すなわち、辞書を更新しながらも、過去の辞書へのアクセス可能性は維持したいということである。これを実現する素朴な方法の一つは、辞書をGitなどのVCSリポジトリに格納するというものである。しかし、OTM-JSONなどの巨大なシングルファイル辞書形式では、Gitの恩恵をうまく活用することができない。Gitは複数の細かいファイルを効率的に管理するようにデザインされているからである。これを解決するには、適切な単位で辞書データを複数ファイルに分解しておく必要がある。どのような単位で分解するかということには議論を要する。

情報を再利用したい

広く使われているOTM-JSONでは、単語(辞書エントリ)以外の単位で情報を再利用することができない。ピュアなJSONには、あるプロパティへの別のプロパティからの参照の機能がないため、JSONだけでこれを実現するためには、すべての値をファイル内で一意のIDと抱き合わせたオブジェクトとするか、値の中に侵襲的にJSON Pointerのような記法を導入する必要があり、あまり効率的とは言えない。これを解決するためには、JSONを使うことをやめて参照機能のあるYAMLなどを使うことになるかもしれない。再利用の問題は、次段の重複除去の問題と表裏一体である。

情報を重複除去したい

これは前段とも関係してくるが、データ間参照が使えない場合にデータを再利用しようとすると、素朴なやり方ではデータを複製して別々の位置に保持することになる。これは保守性の観点からは筋が良いとは言えず、継続的な保守を要する辞書というものの表現形式として好ましくない。したがって、可能な限りDRYを実現できるように辞書形式をデザインすべきである。

Gitでは、ディレクトリ構造はMerkle DAGとして表現されている。つまり、ユーザが何もせずとも自動的に、リポジトリに格納されたそれぞれのファイルやディレクトリにハッシュ(すなわち一意のID)が割り当てられる。このハッシュはいわゆるコンテンツハッシュ、フィンガープリントとして働いており、同じ内容のファイルやディレクトリであれば、常に同じハッシュが割り当てられる。これにより、例えばユーザが別名で全く同じ内容のファイルを追加したところで、Gitリポジトリ内部のデータは重複しないのである[1]。もちろん、この重複除去はファイルやディレクトリ単位で行われるため、先に述べた「辞書データを複数ファイルに分解しておく」ということはいっそう重要である。

情報を分散化したい

Gitは分散VCSと呼ばれているとおり、データの複製をさまざまなコンピュータに分散保持させ、参加者それぞれが独自に編集し、お互いの変更を取り入れあったり、共同で一つの(しかし実体は分散された)データを作り上げたりするためにデザインされている。この性質は辞書編集において非常に役に立つだけでなく、人間の言語運用のモデル化だと考えても非常にうまくいく。つまり、話者はそれぞれメンタルレキシコンを保持していて、そこに他者の使っている語彙を導入したり(学んだり)、他者のメンタルレキシコンに語彙を植え付けたり(教えたり)、共同のメンタルレキシコンを記述したり(標準化したり)する。

情報を永続化したい

重複除去の段で述べたハッシュ化は、データの永続化にも役に立つ。コンテンツのハッシュをコンテンツのアドレスとして用いるということは、だれがどこでいつコンテンツを保持・配信していたとしても、アドレスが等しければ常に同じコンテンツが得られるということを意味する(コンテンツアドレッシング)。これは、辞書のすべてのバージョンが、配信者のちがいや更新にしたがってその意味を変えたり失ったりしてしまわないためにも重要である。

GitHubやGitLabといった盤石なホスティングサービスがすでに存在することも、Gitを選ぶ理由の一つである。

課題

辞書構造をGitオブジェクトで表現するために、以下の課題がある。

情報をどのような単位で分解するか

意味論的単位

もっとも自然な考え方は、単語や語彙素や辞書エントリといった、人間にとって意味のある単位で分解することであろう。しかし、これにはいくつかの困難が伴う。

単語ごとにファイルを作ると聞いて、辞書編集者はまず見出し語をファイル名にすることを考えるだろう。しかし、スラッシュなどのファイルシステムによって予約された文字はファイル名には使えないので、そういった文字を書記体系や正書法、転写法に含む言語を作っている(または作りたい)場合に困ったことになる。ファイル名は常にURLエンコードされたものとする、などのトリックによってこの制約を回避することはできるが、言語によってはファイル名が人間可読ではなくなってしまう。ほんらい如何なる表記法も表現可能であるはずの人工言語という領域において、このように一部の言語に対してのみ制約があるのでは明らかに不公平であり、多言語システムとして到底許容できるものではない。

では、見出し語とは無関係の、一意のIDをファイル名にすることを考えてみよう。この場合、一つの単語ファイルを探したいときにファイラーでブラウズするというようなことは、どんな言語でもほぼ不可能になるだろう。しかし、言語によって利便性に差がついてしまうよりは確実に善良なアイデアである。このような辞書データを人間が編集するにあたって、標準のファイラーの代わりに何らかの統合開発環境のようなインターフェースが必要になるはずである。

形式的単位

もっとも細かい粒度では、辞書の情報とは①文字列片と②そのペア、そして③その集合に分解することができる。ファイルシステムのアナロジーでは、これらはそれぞれ①ファイル名や①ファイル内容と②それらの結びつき(つまりファイル)、そして③それらを含むディレクトリに対応する。これらはそれぞれGitによってハッシュ化される。ハッシュ化できるものは参照し再利用できると考えてよいので、この方法は最大限の再利用性をわれわれに授ける。

この方式を選ぶのであれば、ファイルシステムという抽象化にはほぼ意味がなくなる。というのも、この方式でGitリポジトリ上に辞書を構造化するとすれば、ファイルシステム上での「ファイル」や「ディレクトリ」といった概念が辞書上の何らかの意味論的単位に直接結びつかないからである。このような辞書データを人間が編集するあたって、やはり特別なインターフェースの用意が必要となる。

また、データサイズが必要以上に肥大化してしまうかもしれない欠点もある。たとえば、辞書におけるほとんどの文字列片のサイズは、Gitが内部で利用しているSHA-1のハッシュ長20バイトよりも小さいかもしれない。極端な話、もし辞書内のあらゆる項目から参照されているある単語が、ハッシュ化しなければもともと1バイトで済むはずの文字列片だった場合には、その部分だけ見れば20倍のサイズに膨れ上がってしまうことになり、無視できなくなってくる。

分解された情報をどのように関連づけるか

これは参照方法の問題であるが、このことは同時に、ファイル名やファイル形式の問題とも関連していることを意味する。

辞書を複数ファイルに分割するというときに、参照には以下の2種類が生まれる。

ファイル内参照

これは、先に述べた「形式的単位」よりも大きな単位でファイル分割する場合に問題になる。したがって、問題が一つ消えるという意味では、形式的単位を選ぶことに軍牌が上がると言える。

すでにリアルワールドで広く使われているYAMLなどのファイル形式が、ファイル内参照にビルトイン対応していることがある[2]。しかし、本当にそういった特定のファイル形式の仕様に依存した辞書形式にしてしまってよいのかどうかは考慮する必要がある。JSON PointerやJSONPathのような参照機能を侵襲的に埋め込む方式の利点は、本質的にはデータの論理構造がファイル形式に縛られていないという点である。いわば、YAMLのそれのようなビルトイン参照機能は(データを整理するための)メタ言語の一部であるのに対して、JSON Pointerのような参照は(データ自体がその形式をとっているところの)対象言語に埋め込まれているからである。処理効率や実装コストを考慮するのなら前者に軍牌が上がるが、データ自体の普遍性や可搬性を重視するのなら後者の方が望ましいだろう。普遍性という意味ではOTM(一対多)と似た思想にもつながる。

仮にファイル形式を選定するとして、Gitで取り扱いやすいのは、YAMLのような「行単位」でデータを記述できる形式である。Gitの差分や変更履歴は行単位で表示されるため、コロンや括弧の位置などによって履歴を混乱させない形式が望ましい。これは適切にファイルを自動整形する仕組みを作ることで解決される場合もある。

ファイル間参照

Gitが情報断片をハッシュ化するにしたがい、ファイル間参照にはそのハッシュを用いるのが妥当である。しかしながら、本当に全ての参照を一意の識別子として保持すべきかどうかには一考の余地がある。OTM-JSONでは、関連語への参照にはファイル内で一意の単語IDを用いているが、実質的にはこの水準での参照は一意である必要はなく、検索クエリとしての見出し語を保持するだけで充分なはずである。むしろ一意に確定してしまわずに検索というクッションを挟んだ方が、辞書を引くユーザーにとっては、検索結果から新たな観念連合を把握できる可能性が開かれるので、望ましいかもしれない。

ハッシュの代わりに、ハッシュへのコンテキストローカルなエイリアスを定義し、実際の参照ではそれを使う方法もある。RDFやJSON-LDでは、コンテキストごとに語彙が定義されていて、それぞれの語彙をURIで参照することによって情報を記述するという方式を採っているが、エイリアスはこれと似た方式になるだろう。

ハッシュはあらゆるリポジトリ間でコンテンツに対して一意であるために、将来的には、辞書間での参照の仕組みを構築することも理論上可能である。これにはGitのサブモジュールやサブツリー機能が活用できるかもしれない。

外部リンク

  • アイデア元のツイート

脚注

  1. このケースでは、そのファイルへの別名での参照を含んだ新たなディレクトリオブジェクトは作成される。
  2. YAMLにおいては&によるアンカーと*によるエイリアス。


特に記載のない限り、コミュニティのコンテンツはCC BY-SAライセンスの下で利用可能です。

シェアボタン: このページをSNSに投稿するのに便利です。


最近更新されたページ

左メニュー

左メニューサンプル左メニューはヘッダーメニューの【編集】>【左メニューを編集する】をクリックすると編集できます。ご自由に編集してください。掲示板雑談・質問・相談掲示板更新履歴最近のコメントカウン...

黙字

黙字とは、表音文字[1]を使用する言語に於いて、綴られているにもかかわらず発音されない文字のことである。サイレントとも言う。自然言語に於ける黙字自然言語に於いては主に以下のような歴史的な理由で黙字が存...

類型論

言語類型論抱合語孤立語膠着語屈折語総合的言語分析的言語特に記載のない限り、コミュニティのコンテンツはCC BY-SAライセンスの下で利用可能です。...

音韻論

音韻弁別的素性音素母音子音音節アクセントイントネーション韻律特に記載のない限り、コミュニティのコンテンツはCC BY-SAライセンスの下で利用可能です。...

音韻規則記述言語

音韻規則記述言語(PRDL; Phonetic Rule Description Language)とは、デネブさんによって提唱された、言語音の条件異音などを簡潔に記述するためのドメイン固有言語である...

音韻

ここでは、自然言語において起こり得る音韻の変化について説明する。目次1 母音関連1.1 母音調和1.2 ウムラウト1.3 アクセントのある音節の母音が変化する2 子音関連2.1 語中の有声音、無声音の...

音声記号の入力方法

芸術言語研究(カテゴリー)芸術言語の創り方・芸術言語の哲学このページの対象言語Se分類芸術言語モユネ分類ART音声記号の入力方法では,各種音声記号を入力する方法について解説する。目次1 文字コード1....

音声学

音声国際音声記号(IPA)国際音声記号への拡張調音調音部位調音方法特に記載のない限り、コミュニティのコンテンツはCC BY-SAライセンスの下で利用可能です。...

韓国日本語2

通り韓国日本語2.jpg特に記載のない限り、コミュニティのコンテンツはCC BY-SAライセンスの下で利用可能です。...

韓国日本語

写真の通り韓国日本語.jpg特に記載のない限り、コミュニティのコンテンツはCC BY-SAライセンスの下で利用可能です。...

集合化造語法

集合化造語法とは、短期間にたくさんの単語を作るための意味を創造する手法である。補完造語法と合わせることでより効果的になる。概要・方法この造語法の流れは以下の二つの手順で意味をあらかじめ考えておく必要が...

限定性と修正性

限定性と修正性は動詞の性質を示す用語である。言語の特徴を探る手掛かりとなる。簡単な内容は表1に記載表 1限定性修正性格の指定未定義文脈依存修飾必須任意抽象度高低限定性動詞に含まれる項が未定義で指定する...

関係方式

関係方式とは、辞書の保存方式の一つである。クノーツアクアにより提唱された。説明この方式では語句に含まれる意味や用法をカード毎に分割し、それらを組み合わせて辞書を作っていく。カードは形式毎に異なる種類の...

関与原理

関与原理(英: relatedness principle)とは、おかゆの発案による、意味役割の標示に関する原理である。関与原理は、関与という意味役割を提示する。これはいわば、あらゆる具体的な意味役割...

遺伝造語法

遺伝造語法とは、カルノス・アクアが考案した造語法の一種である。発端は、生物の遺伝の選択を造語にも生かせないか?というところからである。目次1 方法2 特徴3 用法・用量4 関連記事方法まず、何らかの共...

達丸漢字

写真2枚漢字1.jpg追記ほとんどなさそうです特に記載のない限り、コミュニティのコンテンツはCC BY-SAライセンスの下で利用可能です。...

達丸日本語

達丸日本語.jpgまず最初に達丸日本語から書きはじ‘めます。更新していく予定です 2023 4/1 (土) 21:24 現在 3つあります  googleplay アプリのcloudy で作成中ですま...

造語論

造語論とは、人工言語を制作する際の考え方の一つで、語句を作る際の考え方である。目次1 クノーツ法1.1 題目(テーマ)1.2 対象(ターゲット)1.3 目的(コンセプト)1.3.1 語法(ヴィジョン)...

辞書の読み物性

辞書の読み物性とは人工言語の辞書の読みごたえに関する指標の一つである。本来は "Fafs falira sashimi"氏が2014年に考案し、2015年7月に辞書の情報密度を表す数値として提案した。...

転写

転写とは、ある言語の発音を他の文字体系で表記することである。例えば日本の固有名詞(地名や人名など)をローマ字表記したり、英語圏の固有名詞をカタカナ表記したりすることなどである。あくまでも発音に基づいて...