検索画面:https://kurgm.github.io/gwsearch/
グリフウィキに登録された大量のグリフから,グリフをその構成部品から検索できるツールです。
グリフウィキには数十万個におよぶ大量のグリフが登録されています。そこから自分が目当てとする字形をもつグリフを見つけるにはどうしたらよいでしょうか。
GlyphWiki:グリフを検索する ではグリフを検索する手段がいくつか紹介されています。しかし,それらを利用してもグリフを見つけられないケースや見つけるまでに手間がかかるケースは多く存在します。
例えば,探している漢字の部品構成は分かっているがその漢字がUCSなどの文字集合に存在するかどうか不明であるケースを想定します。
- グリフ名から検索する:特定の文字集合に結び付けられるグリフには,その文字集合の名前と集合内で一意な名前をつなげた名前(グリフ名)がつけられています。たとえば大漢和辞典の12345番の字には
dkw-12345
という名前がついている,という具合です。これは,対象の漢字が含まれる文字集合とその番号が分かっている場合は便利ですが,今回のケースのように不明な場合も多々あります。また,分かっていてもその名前のグリフが登録されていないケースも考えられます。 - 漢字1文字から検索する:この検索法が利用できるのは,対象の文字がUCSに存在して,その文字を入力できる(≒ 符号位置が分かっている)場合に限られてしまいます。しかし特にIMEの変換で入力できるとき(部品を探す場合・異体字をたどる場合など)は非常に手軽で便利です。
- 他のグリフから関連字・異体字をたどって検索する:各グリフに関連付けられたUCS漢字(「関連字」)と,UCS漢字同士の関連付け(「異体字」)をもとに検索する手法です。検索対象と似たUCS漢字が分かっている場合などはほぼ見つけることができます。しかし,関連字が設定されていないグリフや,異体字関係の情報が不十分な漢字(特にUCSに追加されたばかりの漢字)も少なくなく,これらを見つけるには別の方法が必要です。
- 部品をたどって検索する:構成部品が分かっている場合はこれが最も直接的な検索方法です。しかし,検索効率の面では問題点がいくつかあります。
- グリフページの「このグリフを内部で引用している他のグリフ一覧」は既定では省略されており,「表示する」操作は多少時間がかかります。このため,内部で引用しているグリフを内部で引用しているグリフを……とたどるのは一苦労です。
- 類似する部品が複数ある場合はそれぞれについてたどる必要があります。サンズイ(氵)といっても普通のサンズイと縦に潰した大きさのサンズイと墨だまり(というんでしょうか)が無いサンズイと左右**に配置されたサンズイと……を個別に検索するのは大変です。
- さらに,旧版を引用するグリフは別に探す必要があります。
- それから,別名(エイリアス)グリフを引用するグリフも個別に調べる必要があります。
- よく使われる部品と別のよく使われる部品の両方を含むグリフを見つけるには,巨大なグリフ一覧同士の共通部分を求める必要があり,人力で行うのは困難です。
- おまかせ表示機能でランダム検索する:🙄
- グループページに列挙されているグリフを探す:今回のように検索対象が含まれる文字集合が不明な文字の検索には役立ちません。ただし,「国字」「創作漢字」などの特徴的な属性が分かっている場合は見つかる可能性があります。しかしグループページが網羅的に列挙していないこともしばしばです。
このツールは,上の「部品をたどって検索する」で挙げた問題点を解消し,効率的な検索を行うために作成されました。すなわち,
- 「グリフAを引用する他のグリフ一覧」を瞬時に表示します。また,再帰的にたどることを簡単にします。
- 「関連字aが設定されたグリフA1, A2, A3, …のいずれかを含むグリフ」を検索することができます。
- 旧版の引用を最新版の引用と同一とみなします。すなわち,「グリフAの最新版または旧版のいずれかを引用する他のグリフ一覧」が表示されます。
- 再帰的な検索により,別名グリフを引用する他のグリフ一覧の検索が容易に行えます。
- 「グリフA, グリフB, …をすべて引用するグリフ一覧」を検索することができます。
また,2.と5.を組み合わせて「関連字aが設定されたグリフA1, A2, A3, …のいずれかと,関連字bが設定されたグリフB1, B2, B3, …のいずれかを両方引用するグリフ一覧」のような検索も可能です。
GlyphWiki:グリフを検索する に紹介されていない検索方法も存在します。
一般的な漢字検索ツール:UCS漢字が検索できるものがほとんどですが,言い換えると,UCS漢字と関連付けられていない関連字未設定のグリフは見つけることができません。
- CHISE IDS 漢字検索:CHISE Projectの漢字構造情報データベースを用いて,構成部品から漢字を検索することができます。このCHISE IDS 漢字検索と同様のインターフェースでグリフウィキの関連字未設定グリフが検索できたら便利だろうと思ったのが,このグリフウィキ部品検索を作るきっかけとなりました。
- zi.tools ほか:構成部品から漢字を検索できるツールは他にも字書系サイトなど多く存在します。
グリフウィキに特化した検索ツール:
- GlyphWiki の重複するグリフ(拙作):グリフウィキに登録されているグリフの中で類似しているグリフ対を一覧することができます。これを使って,たとえばsandboxグリフに検索対象の字形を作成・登録しておくと,その字形に一致するグリフがsandboxと重複しているとして表示される,という形で間接的な字形検索が考えられますが,一覧の更新は最大一日一回しか行われませんし,接続形状など含め一致する字形しか見つかりませんので,字形による検索には向きません。
- グリフウィキ手書き検索(拙作):手書きで字形を入力してグリフ検索ができます。これ以上分解できないような部品を探す場合に役立ちます。ただし,登録されているグリフの筆画の角度・バランスなどに結果が大きく影響されるので,目的のグリフを見つけるまでバランスを変えながら何度も手書きを繰り返さなければならないことがあります。
検索欄に漢字(関連字に相当)またはグリフ名を入力して,検索ボタンを押します。
- 単一の漢字またはグリフ名を入力した場合は,その漢字またはグリフが検索欄の下に表示されます。
- 複数指定すると,すべてを引用するグリフが検索され,一覧が検索欄の下に表示されます。
検索結果は階層構造を持った一覧になります。一覧で行頭にボタンがある行には下の階層があり,+
ボタンで展開/ -
ボタンで折りたたむことができます。行頭にボタンがない行にはそれより下の階層はありません。
一覧の各項目には,文字(「U+
」または「&CDP-
」を含む項目)とグリフ(画像つきの項目)の2種類があります。
- 文字項目:UCS符号位置とCDP外字のいずれかを表します。文字項目の1つ下の階層には次の項目があります。
- その漢字をIDS表現に含む別の漢字(文字項目)
- グリフ名にその文字を含むグリフ(グリフ項目)
- 例:
U+9999
の下の階層にu9999
やu2ff0-u9999-...
がある。&CDP-85F0;
の下の階層にcdp-85f0
やcdp-85f0-03
がある。
- 例:
- その漢字が関連字に設定されているグリフ(グリフ項目)
- グリフ項目:グリフウィキの1グリフを表します。リンクをクリックすると対応するグリフページが開きます。グリフ項目の1つ下の階層には次のグリフ項目があります。
- そのグリフの別名(エイリアス)グリフ
- そのグリフを直接引用するグリフ
- そのグリフの旧版を直接引用するグリフ
この節ではグリフウィキ部品検索がどのように実現されているかを技術的な側面から説明します。
グリフウィキでは全グリフデータをまとめたファイルが毎日更新で公開されています(GlyphWiki:高度な活用方法 を参照)。これをもとに,検索に使用するDAG(有向非巡回グラフ)という構造のデータを予め次のように構築しておきます。
- DAGの各頂点は各グリフとします。
- グリフAがグリフBを直接引用している場合,辺B→AをDAGに追加します。
- グリフAがグリフB(実体)の別名グリフである場合,辺B→AをDAGに追加します。
検索する際はこの構築済みのDAGを読み込みます。検索クエリをグリフの集合(S とおく)とすると,この集合 S に含まれるグリフをすべて(直接的・間接的に)引用するグリフを列挙することが目標になります。それは,S の各要素 si についてDAG上で si を始点として辺を0回以上たどって到達可能な頂点の集合を Ti としたとき,すべての Ti の共通集合を求めることと言い換えられます。
ただし,これだけでは結果は単なるグリフの一覧であり,そのため例えば u58f4-01
(壴) u652f-02
(支) で検索したときに u9f13
(鼓) が出るだけでなく u9f13
(鼓) をさらに引用する u81cc
(臌) u85a3
(薣) u9f16
(鼖) u9f17
(鼗) u9f1d
(鼝) ……がすべて同じ階層に並ぶことになり,目的のグリフを見失いやすくなります。したがって,結果を階層化することが必要になります。
グリフウィキ部品検索では次の方策をとっています。
- 検索結果画面では,ユーザーの操作で階層を展開/折りたたみできるようにします。階層を展開したとき,DAG上で対応する頂点から辺を1回たどって到達可能な他の頂点からなる集合を求め,各要素に対応するグリフを下位階層に一覧表示します。
- 検索時には,すべての始点から到達可能な頂点 v があるとき,その頂点 v を始点として辺を1回以上たどって到達可能な頂点は検索結果に含めないようにします。
このような検索は,DAGの辺を逆向きにすればDAG上のLCA(最小共通祖先)を求める問題とみなすことができ,効率的に解くためのいくつかのアルゴリズムが知られています。
さらに,実際のDAGでは頂点はグリフだけでなく文字(UCS符号位置・CDP外字)も含んでいます。また,それに伴い次の辺が追加されています。
- グリフAの関連字がaに設定されている場合,辺a→AをDAGに追加します。
- グリフAがそのグリフ名に文字aを含む場合,辺a→AをDAGに追加します。
- IDSデータで漢字aのIDSに漢字bが含まれる場合,辺b→aをDAGに追加します。
これにより,グリフの引用関係だけでなく関連字による関連付けとIDSデータによる漢字構成情報も考慮した検索が実現されています。
旧版の引用を最新版の引用とみなしているために,まれにグリフの引用関係が循環することがあります(A(最新版)はB@1を引用,B@2(最新版)はA(最新版)を引用, B@1は何も引用していない など)。このような場合はグリフ頂点の間で閉路ができてしまいDAGにならないので,構築時に閉路を検出して適当に辺を取り除く必要があります。
ちなみに,IDSデータには漢字を再帰的に分解したときに循環するようなことは(今のところ)ないようです。DAGの構築手順より文字同士を結ぶ辺はIDSデータによるものしかありませんから,構築される有向グラフの文字頂点への制限には閉路がないことになります。(ただし自己辺は取り除きます。)
これら以外の辺はすべて文字頂点からグリフ頂点への向きになっていますから,構築される有向グラフのグリフ頂点への制限と文字頂点への制限が両方閉路をもたなければ,構築される有向グラフにも閉路がないことがいえます。
以上のことからDAGの構築時に閉路が発生する条件は,旧版の引用を最新版の引用と同一視したときにグリフの引用関係が循環する場合に限られることが分かります。