第6章 検索エンジンの設定

6-1 検索における異体字の同一視

書誌情報には「森鷗外/鴎外」「内田百閒/百間」「芥川龍之介/竜之介」のように、さまざまな異体字が混在しています。 これらを別字として扱ってしまうと大量の検索漏れが生じるので、検索においては「鷗」と「鴎」を同一視する必要があります。

検索時に異体字を同一視させるためには、検索エンジン側でその設定を行わなければなりません。 本章ではEnjuと連携して動作する全文検索エンジンApache Solrにおける設定手順を説明します。

6-1-1 異体字を同一視するようにSolrを設定する

SolrのCharFilterという機能を使えば異体字を同一視して検索させることができます。

例えば「島」「嶋」「嶌」を検索上同一視させたいとします。その場合、代表の文字を一つ、例えば「島」と決めます。そして、「嶋」「嶌」を「島」に変換するような設定を行います。

するとSolrは、書誌情報から検索用データを作成する際に、「嶋」「嶌」を「島」に変換します。

また、検索を行う際も、検索語の中の「嶋」「嶌」を「島」に変換します。

これにより、「大嶋」で「大島」も「大嶌」もヒットするようになります。

6-1-1-1 マッピングファイルを作成

以下のような形式のマッピングファイルを作ります。

"嶋" => "島"
"嶌" => "島"

文字コードは UTF-8、改行は LF とします。ファイル名は例えば ja-variants.txt など好きなように付けます。

ナンバー記号(#)で始まる行はコメントとみなされます。しかし、以下のような形式のコメントは許されません。

"嶋" => "島" # コメント(これはダメ)

=>」の前後のスペースは略すこともできます。

Unicodeのコード番号で文字を指定することもできます。4桁の16進数で \uXXXX のように書きます。

4桁で表せるのは、Unicode の基本多言語面(BMP: Basic Multilingual Plane)内の文字だけです。BMP外の文字は5桁ないし6桁になりますので、この形式は使えません。文字そのものをじかに書く必要があります。BMP外には、「𡈽」(U+2123D)、「𠀋」(U+2000B)のようなありふれた異体字もあります。

変換元、変換先は2文字以上書くこともできます。よって、

"麿" => "麻呂"
"\u5715" => "図書館"
"\u309F" => "より"

と書いておけば、

  • 「人麿」で「柿本人麻呂」が
  • 「図書館用品」で「圕用品研究」が
  • 「善藏より聞覚」で「御大工棟梁善藏ゟ聞覚控」が

検索できるようになります。(「圕」〔U+5715〕は図書館学者の杜定友による1926年頃の造字で「圖書館」を一字にしたもの;「ゟ」〔U+309F〕は「より」の合字)

変換元は空文字列にできませんが、変換先は空文字列を指定することができます。

6-1-1-2 マッピングファイルを配置

Enju インストールディレクトリーの下に solr/conf があります。

前節で作成したマッピングファイルをここに入れておきます。

6-1-1-3 設定ファイルにファイル名を書く

solr/conf ディレクトリーの中に schema.xml というXMLファイルがあります。

このXMLに fieldType[name="text"] という要素があり、その直下に analyzer という要素があります。その内容に、以下のように charFilter 要素を追加します。

<fieldType name="text" class="solr.TextField" omitNorms="false">
  <analyzer>
    <charFilter class="solr.MappingCharFilterFactory" mapping="ja-variants.txt" />

mapping 属性にファイル名を指定します。

ファイル名は

<charFilter class="solr.MappingCharFilterFactory" mapping="vars1.txt,vars2.txt"/>

のようにカンマ区切りで複数指定することもできます。

複数ファイルに異体字マッピングファイルを分けておくと、たとえば、a) 確かな典拠に基づくメインファイルと、b) 館の都合に合わせて追加/修正するカスタマイズファイル、といったようにファイルを分割管理することもできます。

また、漢字の異体字とラテン文字の置き換え(「æ」→「ae」など)を別ファイルにする、といった分け方もできます。

6-1-1-4 Enjuの再起動とSolrの再インデックス

設定が終わったら、設定を反映するために、Enju を再起動(リスタート)して、書誌情報を再度インデックスします。

    docker compose down
    docker compose up -d
    docker compose run --rm web rake sunspot:reindex RAILS_ENV=production

これで異体字でも検索ができるようになるはずです。

6-1-1-5 参考サイト

https://cwiki.apache.org/confluence/display/solr/CharFilterFactories#CharFilterFactories-solr.MappingCharFilterFactory

上記ページにCharFilterの仕様などが詳しく書かれています。公式サイトです。

6-1-2 異体字の考え方

異体字のマッピングファイルを作るにあたって注意すべきことなどを述べます。

6-1-2-1 時代性

現在、「著」と「着」は別字であり、「著しい」「著す」「著作」/「着る」「着く」「着信」などと使い分け、交換できません。

しかし「着」はもともと「著」の異体字でした。幸田文に「著物」という作品があり、もっと時代の新しい三島由紀夫も作品中で「著る」を使っています。

また、「丼」はもともと「井」の異体字ですが、現在ではドンブリの意味でしかふつう使いません。これを異体字として扱うと、天井(てんじょう)を調べていて天丼(てんどん)が出てくることになります。

このように、ある二つの漢字が異体字であるかどうかはそれが使われた時代によって変わります。

6-1-2-2 異体字のような別字

「斉」と「齊」は異体字の関係にあります。「斎」と「齋」もそうです。しかし、「斉・齊」と「斎・齋」とは別字です。「書斎」は「書斉」とは書けず、「一斉」は「一斎」とは書けません。

とはいえ、人名(サイトウ)に限って言えばこの四字は異体字のように使われており、異体字だと思っているサイトウさんも少なくないようです。

検索上は異体字かどうかに拘泥せず、この四字を同一視するのがよいかもしれません。

6-1-2-3 代用漢字

「国際連盟」「連合艦隊」はそれが存在した時代には「國際聯盟」「聯合艦隊」と書かれていました。しかし、「聯」は「連」の異体字ではありません。

この場合の「連」は、当用漢字に含まれなかった「聯」を、同音で意味的にもあまり無理のない当用漢字の別字に置き換えたものです。

このような置き換え字は「代用漢字」などと呼ばれ、「午后」→「午後」、「遵守」→「順守」、「附録」→「付録」、「蒐集」→「収集」、「編輯」→「編集」、「沙漠」→「砂漠」、「日蝕」→「日食」、「訊問」→「尋問」、「脈搏」→「脈拍」、「叛乱」→「反乱」、「扮飾」→「粉飾」、「長篇」→「長編」、「哺育」→「保育」、「繃帯」→「包帯」、「抛物線」→「放物線」、「彎曲」→「湾曲」など多数あります。

こういったものも異体字のように扱うかべきどうかは場合によるでしょう。

単語単位で「午后」を「午後」に変換するのでなく文字単位で「后」を「後」に変換する場合,「后」(きさき)による検索で大量の検索ノイズが発生するかもしれません。

6-1-2-4 中国語の簡体字

中国の「広東省」は簡体字で「广东省」と書きます。「广」/「広」、「东」/「東」は異体字の関係にあるので、このペアもマッピングファイルに入れておけば、中国語の書誌情報も手軽に検索できてすこぶる便利ではないでしょうか。

ところが、そう簡単ではありません。

「機」の簡体字は「机」です。「葉」は「叶」、「幹」は「干」です。このように、中国語では異体字であるものが、日本語では全くの別字ということがあるのです。

このように、どの字とどの字が異体字の関係になるかは、言語によっても異なります。

6-1-2-5 検索ノイズとの兼ね合い

上で見たように,異体字マッピングを拡充すれば検索漏れが減らせる一方で検索ノイズが増えることがあります。再現率(検索漏れの少なさ)と適合率(検索ノイズの少なさ)は一般にはトレードオフの関係にあります。

そのため,資料群の特性を考えて異体字の範囲を定める必要があるでしょう。

もう一つ検討すべきことは,検索ノイズにも利用者を悩ませるものとそれほどでもないものがあることです。

異体字の例ではありませんが,「国語辞典」で検索して「中国語辞典」までヒットした場合,利用者はなぜそのような検索ノイズが生じたのか,たいてい理解できます。

しかし,アガサ・クリスティーに「機上のナントカ」(『機上の死』)があったと思って「機上」で検索したら『ナントカ辞典机上版』の類がどっと出てきた,という場合,中国語を学んだことのない利用者には理解不能です。

叶(かのう)さんの著作を検索したら樋口一葉の作品まで出てきた。これも同様です。

自分の操作が悪いのか,システムの不具合なのか。利用者に無用のストレスを与えることになります。

蔵書構成だけでなく,利用者層の特性も考慮して決めるとよいでしょう。

なお,異体字対策については,検索機能でなくデータ側で頑張る方針もあります。異体字の範囲はほどほどにとどめ,書誌情報に異表記を積極的に追加して再現率を上げるやり方です。