🌐

Mojidata: SQLでクエリできる漢字データベース

2022/10/16に公開
  • 全文検索や自然言語処理などのアプリケーションを開発するときには、漢字に関する知識情報が欲しいときがある。
  • しかし、漢字の知識情報はUnicodeやAdobeなど情報源が複数存在し、情報の表現形式が統一されていないため、活用するための情報形式変換に手間がかかる。
  • そこで、オープンソースライセンスで公開されているデータベースを元に、新たにSQLite形式の関係データベースを作成し、npmパッケージとして公開した。

まえがき

漢字は、表語文字に分類され、表音文字であるラテン文字や平仮名、片仮名といったスクリプト(文字体系)に比べると、はるかに多くの文字が存在しており、情報処理上の課題が存在しています。大量にある漢字から、目的の漢字を探し出して入力するのは大変ですし、異体字が存在するので、あいまい検索を実装するには、どの字とどの字が異体字かの情報が欲しいです。音声合成をする際に、知らない漢字をどう発音すればいいでしょうか。

このようなさまざまな課題に対応し、アプリケーションを開発するために、漢字の情報を集めたデータベース、電子化された字典が欲しくなります。漢字データベースがあれば、漢字と次のような情報の間で相互に検索できるようになります。

  • 読み
  • 意味
  • 用法
  • 構造
  • 文字コード
  • 総画数
  • 部首・内画数
  • 索引情報
  • 異体字など、他の漢字との関係

そこで、オープンソースとして公開されている複数の情報源のデータを編纂し、SQLiteで管理できる漢字データベースを作り、Mojidataという名前で公開することにしました。

https://github.com/mandel59/mojidata

利用方法

Mojidataはnpmで公開されています。

https://www.npmjs.com/package/@mandel59/mojidata

使いたいnpmプロジェクトで、次のコマンドでインストールしてください。

npm i @mandel59/mojidata

インストールすると node_modules/@mandel59/mojidata/dist/moji.db にデータベースファイルがあります。好きなSQLite3ライブラリを使って、データベースを使うことができます。

const Database = require("better-sqlite3");
const dbpath = require.resolve("@mandel59/mojidata/dist/moji.db");
const db = new Database(dbpath);
console.log(db.prepare("select * from joyo limit 5").all());

設計概説

符号の表現

符号化文字集合では、各文字に対してコード(符号位置、文字番号)を定義してあり、コードを使って文字集合の各文字を指定することができます。
コードは、10進数で表示される場合や16進数で表示される場合などが存在しますが、複数の記法が混在すると、値の比較やテーブルの結合に困難が生じます。

そこで、Mojidataデータベースで原則として、次のような表現でデータを表しています。

  • Unicodeの場合、Unicodeスカラー値ではなく、単一の文字からなる文字列の形でデータを格納する。
    • スカラー値の整数値に変換するには、カラム名をUCSとしたとき、unicode(UCS)を使うことができる。
    • U+xxxx形式のスカラー値表示に変換するには、カラム名をUCSとしたとき、format('U+%04X', unicode(UCS))を使うことができる。
  • バリエーション・シーケンスは、文字列で扱う。
    • U+xxxx U+xxxx形式のスカラー値表示に変換するには、カラム名をVSとしたとき、format('U+%04X U+%04X', unicode(VS), unicode(substr(VS, 2)))を使うことができる。
  • CID番号は、Mojidataでは、整数値として格納する。
  • その他文字コード・検字番号は、情報源の形式を使う。

テーブル名

テーブル名には、原則として、以下の情報源名を接頭辞とした名前を付けます。

  • aj1: Adobe, Adobe-Japan1 CMap Resources
  • radicals: UCD, CJK Radicals
  • svs: UCD, Standardized Variants
  • radeqv: UCD, Equivalent Unified Ideograph
  • usource: UCD, U-Source Data
  • unihan: UCD, Unicode Han Database
  • ivs: Unicode, Ideographic Variation Database
  • mji: CITPC, MJ文字情報一覧表
  • mjsm: CITPC, MJ縮退マップ
  • ids: BabelStone, Ideographic Description Sequences (IDS) for CJK Unified Ideographs
  • kdpv: 漢字データベースプロジェクト, Ideographic Variations Database
  • joyo: 文化庁, 常用漢字表
  • doon: 文化庁, 同音の漢字による書きかえ
  • nyukan: 出入国在留管理庁, 在留カード等に係る漢字氏名の表記等に関する告示 別表第四
  • tghb: 国务院, 通用规范汉字表

情報源からのデータが単一のテーブルに対応する場合は、情報源名それ自体をテーブル名とします。
情報源からのデータが複数のテーブルに対応する場合は、主たるテーブルの名前を情報源名と同じにし、主たるテーブルに付随する表は、情報源名を接頭辞とした名前にします。

収録データベース

Mojidataに収録されているデータベースについて概説します。

Adobe-Japan1 CMap Resources

Adobe-Japan1は、Adobe社が定めた文字コレクション(特定の言語、書記体系、もしくは市場に向けたフォント製品を開発するのに必要となる文字を集めたもの)です。
現在商用として販売されている日本語書体の多くは、このAdobe-Japan1に基づいて開発されています。
Adobe-Japan1は随時拡充され、現時点ではAdobe-Japan1-0からAdobe-Japan1-7までの8つの追補(Supplement)が存在し、最新の追補Adobe-Japan1-7には23,060個の文字が含まれています。

Adobe-Japan1 CMap Resourcesは、Adobe-Japan1の文字番号であるCIDから、各種エンコーディングの文字番号への変換表です。

Mojidataでは、Adobe-Japan1 CMap Resourcesのうち、Unicodeのエンコーディングに対応するもののみ、aj1テーブルとして収録しています。aj1はデータベース利用者は直接使用せず、各ビューを介して使うことを想定しています。

ビューの一覧

aj1テーブルは、次の各ビューを介して使うことができます。

  • aj1_UniJIS_H: JIS90字形, 横組用
  • aj1_UniJIS_V: JIS90字形, 縦組用
  • aj1_UniJIS2004_H: JIS2004字形, 横組用
  • aj1_UniJIS2004_V: JIS2004字形, 縦組用
  • aj1_UniJISX0213_H: macOS互換, JIS90字形, 横組用
  • aj1_UniJISX0213_V: macOS互換, JIS90字形, 縦組用
  • aj1_UniJISX02132004_H: macOS互換, JIS2004字形, 横組用
  • aj1_UniJISX02132004_V: macOS互換, JIS2004字形, 縦組用

それぞれのビューには、CID番号(整数値型)を格納したCIDとUnicodeの文字(文字列型)を格納したUCSカラムがあり、CIDからUnicode符号位置への変換を表しています。

Unicode Character Database

Unicode Character Database(UCD)は、Unicodeコンソーシアムが定めた文字情報データベースです。

Mojidataでは、UCDのうち、次のデータを収録しています。

  • Unicode Han Database (Unihan)
  • CJK Radicals
  • Standardized Variants
  • Equivalent Unified Ideograph
  • U-Source Data

Unicode Han Database

Unicode Han Database(Unihan)は、Unicodeコンソーシアムが収集した漢字に関する知識のデータベースです。

UnihanはUnicodeスカラー値・フィールド名・スカラー値に対応するフィールド値の3つ組のデータのリストとして公開されています。Unihanのフィールド名はkで始まります。

テーブル

Mojidataでは、unihan_(フィールド名)という形式のテーブル名で UCS, value というカラムを持ったテーブルを収録しています。

ビューの一覧

Unihanのフィールド値は単なる文字列で、データによっては使いづらいので、フィールドをより使いやすくするためのビューが提供されています。

  • unihan: すべてのテーブルをタグ付きでユニオンにしたビューです。UCS, property, value というカラムを持っています。propertyカラムにはフィールド名が格納されています。

  • unihan_variant: 異体字に関連するフィールドのデータを変換し、異体字をスカラー値ではなく文字自体にして処理しやすくしたビューです。UCS, property, value, additional_data というカラムを持っています。

  • unihan_strange: unihan_kStrange テーブルを処理しやすくしたビューです。UCS, category, value というカラムを持っています。

  • unihan_source: IRGソース情報データを格納したunihan_kIRG_*Sourceテーブル群をタグ付きユニオンにしたビューです。UCS, source, value というカラムを持っています。sourceの値はG(中国・シンガポール)、H(香港特別行政区)、J(日本)、KP(北朝鮮)、K(韓国)、M(マカオ特別行政区)、S(SAT大藏經テキストデータベース研究会)、T(台北市コンピュータ協会)、UK(イギリス)、U(Unicode Technical Committee)、V(ベトナム)のいずれかです。

Ideographic Variation Database

Ideographic Variation Database(IVD)は、各所から提出されたバリエーションシーケンスコレクションを登録してあるものです。Mojidataには、ivs_(コレクション名)の形式のテーブル名で収録されています。
また、全てのコレクションをタグ付きでユニオンしたビューとしてivsが提供されています。

IVDには以下のコレクションが存在します。

MJ文字情報一覧表

MJ文字情報一覧表は、文字情報基盤整備事業で整備された約6万字の漢字に関するデータです。

Mojidataには、mjiというテーブル名で収録されています。カラム名は、MJ文字情報一覧表の項目名をもとに命名されています。

mjiテーブルのデータのうち、対応するUCS実装したSVSなど、もとの表でUCSコードやバリエーションシーケンスが入力されている項目は、Mojidataの文字列形式に変換してあります。

また、同一のMJ文字図形名に対し値が複数存在しうる項目については、関連テーブルが別に定義されています。

  • mji_changelog: 更新履歴
  • mji_duplicated_ivs: Moji_JohoコレクションIVSの重複データ。同一のMJ文字図形名に対し、複数のMoji_JohoコレクションIVSが存在している場合、重複しているものがこのテーブルに格納されています。
  • mji_reading: 読み(参考)
  • mji_rsindex: 部首(参考)

MJ縮退マップ

MJ縮退マップのデータを、Mojidataにmjsm_(縮退根拠名)というテーブル名で収録してあります。

文字情報基盤のMJ文字集合は約6万字の文字を含んでいますが、すべてのシステムで全種類の文字を扱うことは、実用的ではありません。
そこで、辞書や告示などで示されている関連字情報をもとに、MJ文字集合の漢字とJIS X 0213に収録されている約1文字の漢字との対応関係が、縮退マップとして提供されています。

縮退マップには縮退根拠として、以下の出典のデータが収録されています。

  • JIS包摂規準UCS統合規則
  • 法務省告示582号別表第四_一
  • 法務省告示582号別表第四_二
  • 戸籍統一文字情報_親字正字
  • 民一2842号通達別表_誤字俗字正字一覧表_俗字
  • 民一2842号通達別表_誤字俗字正字一覧表_別字
  • 民一2842号通達別表_誤字俗字正字一覧表_無印
  • 民二5202号通知別表_正字俗字等対照表
  • 読み字形による類推
  • 辞書類等による関連字

Mojidataでは、すべての縮退根拠のテーブルのタグ付きユニオンとしてmjsmビューを提供しています。縮退根拠名はカラムに格納されています。

BabelStone IDS

BabelStone Hanフォントに付随して配布されている IDS.TXT ファイルのデータをidsテーブルに収録しています。

Ideographic Description Character(IDS)は、漢字の構成部品を表現する記法です。たとえば、「明」という漢字は⿰日月というIDSによって、「日」を偏に、「月」を旁に持つという構造を表現できます。
IDSについて詳しくは The Unicode Standard 15.0.0, 18.2 Ideographic Description Characters (PDF) を参照してください。
また、QuizKnockの動画でIDSについて面白く解説してあるので、そちらを見てもいいです。

https://www.youtube.com/watch?v=UUcYaUsxvcc

idsテーブルはUCS, source, IDSカラムを持っています。
sourceカラムの値は、そのIDSがどのソースの字形を表現しているのかを表しています。
ひとつのUCSに対して、複数のIDSが与えられている場合もあります。

BabelStone IDSでは、一部IDSで拡張された記法が使われています。

  • : 部品の反転。たとえば「臦」をIDSで表現するとき、⿰↔臣臣と書けます。
  • : 部品の回転。たとえば「𠕄」をIDSで表現するとき、↷凹と書けます。
  • : 部品の除去。たとえば「𠄘」をIDSで表現するとき、⊖承一と書けます。
  • {1}..{117}: Unicodeで表現できない部品。詳細はIDS.TXTのコメントを参照してください。

漢字データベースプロジェクト

Mojidataは、漢字データベースプロジェクト異体字データベースのデータを、kdpv_(関係名)というテーブル名で収録しています。また、すべての関係をユニオンしたkdpvビューが提供されています。

kdpvの関係の一覧と、各関係の逆関係は、kdpv_relsテーブルに格納されています。

以下の関係が収録されています。

  • cjkvi/simplified: 简化字
  • cjkvi/variant-simplified: 异体简化字
  • cjkvi/pseudo-simplified: 拟似简化字
  • cjkvi/traditional: 繁体字
  • cjkvi/variant: 関連字(その他)
  • cjkvi/duplicate: 重複漢字
  • dypytz/variant: 异体字(第一批异体字整理表)
  • dypytz/variant/1988: 异体字(第一批异体字整理表・1988年废止)
  • dypytz/variant/1956: 异体字(第一批异体字整理表・1956年废止)
  • dypytz/variant/1986: 异体字(第一批异体字整理表・1986年废止)
  • dypytz/variant/1997: 异体字(第一批异体字整理表・1997年废止)
  • dypytz/variant/1993: 异体字(第一批异体字整理表・1993年废止)
  • hydcd/borrowed: 通假字(漢語大字典)
  • hydzd/variant: 異體字(漢語大字典)
  • hydzd/simplified: 𥳑體字(漢語大字典)
  • hyogai/variant: 簡易慣用字体(表外漢字字体表)
  • jinmei1/variant: 異体字(人名用漢字・別表1)
  • jinmei2/variant: 異体字(人名用漢字・別表2)
  • jisx0212/variant: 関連字(JIS X 0212)
  • jisx0213/variant: 関連字(JIS X 0213)
  • joyo/variant: 異体字(常用漢字表)
  • jp/borrowed: 同音の書き換え字
  • jp/old-style: 旧字体
  • jp/old-style/compat: 旧字体(互換漢字)
  • koseki/variant: 異体字(戸籍統一文字)
  • non-cjk/radical: 部首(非漢字)
  • non-cjk/kangxi: 康煕部首(非漢字)
  • non-cjk/hangzhou-num: 杭州数字(非漢字)
  • non-cjk/katakana: カタカナ
  • non-cjk/bopomofo: ボポモフォ
  • non-cjk/kanbun: 漢文
  • non-cjk/strokes: 筆画文字
  • non-cjk/parenthesized: カッコ付き
  • non-cjk/circle: ◯囲み
  • non-cjk/square: □囲み
  • non-cjk/bracketed: 括弧付き
  • cjkvi/non-cognate: 同型異字
  • cjkvi/numeric: 異体字(数字)
  • cjkvi/radical-split: 部首IDS
  • cjkvi/radical-variant: 部首異体字
  • cjkvi/radical-variant-simplified: 部首簡化字
  • sawndip/variant: 異体字(古壮字字典)
  • twedu/variant: 異體字(民國教育部)
  • ucs-scs/variant: 異体字(原規格分離)
  • x0213-x0212/variants: 異体字(JIS X 0213 附属書11箇条3.2)

文化庁 常用漢字表

常用漢字表の漢字一覧データをjoyoテーブルに収録しています。

joyo漢字, 音訓, , 備考 のカラムを持っており、常用漢字表の1行(漢字と音訓のペア)ごとに1レコードになっています。

カラムはJSON配列形式で格納されています。SQLiteでは次のクエリで、個々の例を列挙できます。

select joyo.漢字, joyo.音訓, x.value asfrom joyo join json_each(joyo.) as x

関連テーブルとして、次のテーブルを収録しています。

  • joyo_acceptable: 常用漢字表で許容字体が示されている文字を収録しています。カラム名は漢字です。
  • joyo_kangxi: 常用漢字表でいわゆる康熙字典体が示されるものについて、その漢字を収録しています。カラム名は漢字, 康熙字典体です。

文化庁 同音の漢字による書きかえ

同音の漢字による書きかえのデータをdoonテーブルに収録しています。

doon書きかえる漢字, 書きかえた漢字, 書きかえる漢語, 書きかえた漢語, 採用した文書カラムを持っています。

書きかえる漢語カラムと書きかえた漢語カラムには、同音の漢字による書きかえに示された書きかえの、書きかえを行う漢語と、書きかえた後の漢語をそれぞれ格納されています。

書きかえる漢字カラムと書きかえた漢字カラムには、書きかえる漢語書きかえた漢語の、書きかえの対象となった漢字1文字がそれぞれ格納されています。

採用した文書カラムの値は、各文字が次の文献を表しています。

  • : 法令用語改正例 国語審議会建議
  • : 学術用語集(物理学編) 文部省編
  • : 学術用語集(土木工学編)文部省編
  • : 学術用語集(採鉱ヤ金学編)文部省編
  • : 学術用語集(化学編)文部省編
  • : 学術用語集(船舶工学編)文部省編
  • : 学術用語集(建築学編)文部省編
  • : 医学用語集(第1次選定) 日本医学会用語整理委員会編

出入国在留管理庁 在留カード等に係る漢字氏名の表記等に関する告示 別表第四

在留カード等に係る漢字氏名の表記等に関する告示の別表第四の一のデータをnyukan_itaijiテーブルに、別表第四の二のデータをnyukan_ruijiテーブルにそれぞれ収録しています。また、両テーブルのタグ付きユニオンとしてnyukanビューが提供されています。

中国国務院 通用規範漢字表

通用规范汉字表の主表のデータをtghbテーブルに格納しています。また、付表「规范字与繁体字、异体字对照表」のデータをtghb_variantsテーブルに格納しています。

Discussion