#author("2020-11-05T05:36:35+00:00","default:rd","rd") #author("2020-11-05T05:45:59+00:00","default:rd","rd") [[全文検索システム『ひまわり』]] &color(red){&size(20){本ページは現在作成中です};}; #contents *1.はじめに [#h82273b3] このページでは,設定ファイルで記述できる項目のうち,検索機能関連の項目について解説します。ただし,この後の説明は,『ひまわり』や XML について,次のことを前提として書いています。 -本手引きは,「[[簡単な検索用データの作成方法>全文検索システム『ひまわり』/簡単な検索用データの作成方法]]」の内容を発展させる形で書いています。まずは,「[[簡単な検索用データの作成方法>全文検索システム『ひまわり』/簡単な検索用データの作成方法]]」をお読みください。 -『ひまわり』では,検索対象の資料が XML で記述されていることが前提となっており, XML に関するある程度の知識を必要とします。この後の説明を読んで,難しいと感じたかたは,次の資料をまずご参照ください。 --本ページ中に頻繁に現れる「要素」,「タグ」,「属性」などの XML の用語を[[補足説明>#hosoku]]で説明しています。こちらもあわせてご覧ください。 --XML 自体についての解説は,各種の入門書・Web ページをご覧ください。ここでは,「[[XML入門:https://www.javadrive.jp/xml/]]」を参考用の Web ページとして挙げておきます。 *2.『ひまわり』の検索機能 [#p02ccb55] このあと説明するのは,次の#つの検索方法です。 - [[XML要素内容に対する全文検索>#l30b873d]] - [[検索結果の要素内容をマークアップしているタグの属性の抽出>#f0a8028b]] - [[タグの属性の検索>#je98a011]] - [[Stand-Off型マークアップの検索]] - [[Stand-Off型マークアップの検索>#v1b325c1]] //- XML要素の属性の検索(属性値をキーとする検索) //- Stand-Off型マークアップの検索 *3.XML要素内容に対する全文検索 [#l30b873d] **3.1 通常の全文検索 [#b85fbc43] まず,[[簡単な検索用データの作成方法>全文検索システム『ひまわり』/簡単な検索用データの作成方法]]で扱ったXMLデータと設定ファイルとの関係を見てみます。 <?xml version="1.0" encoding="utf-16" ?> <corpus> <simpledoc タイトル="蜘蛛の糸" 著者="芥川龍之介"> ある日の事でございます。御釈迦様は極楽の蓮池のふちを、独りでぶらぶら御歩き になっていらっしゃいました。 :(中略) </simpledoc> </corpus> 全文検索対象の要素は,設定ファイルの index_cix 要素で指定します。config_simpledoc.xml を見てみましょう。config_simpledoc.xml を[[サクラエディタ>https://sakura-editor.github.io/]]などのテキストエディタで開いて,index_cix 要素を探してください。li 要素の name 属性で,全文検索対象の "simpledoc" 要素が指定されていることがわかります。 <index_cix> <li name="simpledoc" label="本文" middle_name="sd" type="normal" field_name="キー" /> </index_cix> li 要素の内容は,次のとおりです。 :name 属性:|全文検索対象の要素名です。上の例の場合,li 要素の name 属性で,simpledoc 要素が設定されています。 :label 属性:|検索対象の選択メニューに表示される文字列です。 :middle_name 属性:| 索引ファイル名の一部となります。他の li 要素の middle_name 属性値と重ならない値を半角文字で設定してください。どのような文字列でも構いません。 :type 属性:| 「normal」としてください。 :field_name 属性:| 検索結果を表示する列名を指定します。この列名は,field_setting 要素で指定した列名と対応しています。上の例では,「キー」の列に全文検索の結果が入るようになっています。 上記の例では,全部検索対象をひとつだけ指定しましたが,複数指定することもできます。例えば,本文と書誌情報がある場合を考えましょう。body 要素が本文,note 要素が書誌情報とします。 <simpledoc タイトル="蜘蛛の糸" 著者="芥川龍之介"> <body> ある日の事でございます。御釈迦様は極楽の蓮池のふちを、独りでぶらぶら御歩きになっていらっしゃいました。池の中に咲いている蓮の花は、みんな玉のようにまっ白で、そのまん中にある金色の蕊からは、何とも云えない好い匂が、絶間なくあたりへ溢れて居ります。極楽は丁度朝なのでございましょう。 </body> <note> 底本:「芥川龍之介全集2」ちくま文庫、筑摩書房 1986(昭和61)年10月28日第1刷発行 1996(平成8)年7月15日第11刷発行 親本:筑摩全集類聚版芥川龍之介全集 1971(昭和46)年3月〜11月 </note> </simpledoc> RIGHT:(青空文庫の[[芥川龍之介「蜘蛛の糸」>https://www.aozora.gr.jp/cards/000879/card92.html]]の一部を取り出し編集) このようなデータに対して,本文だけ,書誌情報だけ,両方を全文検索するには,次のように,index_cix 要素内の li 要素を複数指定します。検索対象の選択は,『ひまわり』の選択メニューから行うことができます。 <index_cix> <li name="body" label="本文" middle_name="body" type="normal" field_name="キー" /> <li name="note" label="書誌情報" middle_name="note" type="normal" field_name="キー" /> <li name="simpledoc" label="全体" middle_name="sd" type="normal" field_name="キー" /> </index_cix> **3.2 正規表現による全文検索 [#j1ad07a1] 検索速度は落ちますが,正規表現を使った全文検索を行うことも可能です。その場合,次のように,type属性を"null"としてください。通常の全文検索用の設定と区別するために,label 属性と middle_name 属性の値は,別の値をつけてください。 <index_cix> <li name="simpledoc" label="本文" middle_name="sd" type="normal" field_name="キー" /> <li name="simpledoc" label="本文(正規表現)" middle_name="sd2" type="null" field_name="キー" /> </index_cix> *4.検索結果の要素内容をマークアップしているタグの属性の抽出 [#f0a8028b] ** 4.1 抽出する属性の指定 [#f0996d51] 『ひまわり』は,検索した要素内容をマークアップしているタグの属性を,検索結果として抽出することができます。例えば,「[[簡単な検索用データの作成方法>全文検索システム『ひまわり』/簡単な検索用データの作成方法]] 」では,検索された文字列の「著者」と「タイトル」を抽出しています。 まず,config_simpledoc.xml の中の field_setting 要素を見てください。次の部分です。 <field_setting> <li name="no" type="index" width="30" align="RIGHT" /> <li name="前文脈" type="preceding_context" element="_sys" attribute="_preceding_context" width="180" align="RIGHT" sort_direction="R" /> <li name="キー" type="key" element="_sys" attribute="_key" width="80" sort_order="1" /> <li name="後文脈" type="following_context" element="_sys" attribute="_following_context" width="160" sort_order="2" /> <li name="著者" type="argument" element="simpledoc" attribute="著者" width="80" /> <li name="タイトル" type="argument" element="simpledoc" attribute="タイトル" width="80" /> </field_setting> li 要素の name 属性に注目してください。これを見てわかるとおり,field_setting 要素中の li 要素は,検索結果の各列(フィールド)の情報を表しています。ちなみに,li 要素の順序が,検索結果の列の表示順序を決定します。 li 要素の属性のうち,本題に関係する四つの属性を見ていきましょう。 :name 属性:|検索結果の列名です。この値を変更すれば,列の名前が変わります。 :type 属性:|ここでは,「argument」としてください。 :element, attribute 属性:|それぞれの属性値で,抽出対象の要素とその属性名を指定します。例えば,上記の最後の行の li 要素は,element の値が「simpledoc」,attribute が「タイトル」となっています。これは,「simpledoc」要素の「タイトル」属性を検索結果として表示することを意味します。 :width 属性:|検索結果の列の幅(単位はpixel)です。 まず,抽出する属性の変更ですが,上で述べたように,li 要素の element 属性と attribute 属性を変更することによって行います。 次に,抽出する属性を追加してみます。例として,「[[簡単な検索用データの作成方法>全文検索システム『ひまわり』/簡単な検索用データの作成方法]]」の simpledoc 要素に「作成日」属性をつけます。具体的な追加例を次に示します。 <simpledoc タイトル="蜘蛛の糸" 著者="芥川龍之介" 作成日="2005-01-16"> 資料に対して,「作成日」属性を追加したら,config_simpledoc.xml の field_setting 要素には,次の li 要素を追加します。 <li name="作成日" type="argument" element="simpledoc" attribute="作成日" width="80" /> attribute 属性が「作成日」となっているのに注意してください。name 属性は,検索結果の列名になります。field_setting 要素中のどこに追加してもかまいませんが,すでに述べたように,検索結果の列の表示順に影響します。 ** 4.2 属性を抽出する要素の設定 [#je1c9a13] 説明の順序が逆になりますが,属性を抽出する要素に対しては,設定が必要です。4.1節で使っている simpledoc 要素の場合,config_simpledoc.xml の index_eix 要素で次のように設定されています。 <index_eix> <li name="simpledoc" middle_name="sd" is_empty="false" top="false" isBrowsed="true" /> </index_eix> それぞれの属性の意味は,次のとおりです。 :name 属性:|属性抽出対象の要素名です。上の例の場合,li 要素の name 属性で,simpledoc 要素が設定されています。 :middle_name 属性:| 他の li 要素の middle_name 属性値と重ならない値を半角文字で設定してください。どのような文字列でも構いません。索引ファイル名の一部となります。 :isBrowsed 属性:|「true」の場合は,閲覧対象の要素([ツール]→[閲覧]の対象)であることを示します。閲覧対象の要素でない場合は,指定する必要はありません。なお,現在のところ,index_eix 要素中の一つの li 要素でしか指定できません。 :is_empty 属性:|空要素タグの場合,true としてください。 :top 属性:|ここでは,詳しく説明しません。false としてください。 //isBrowsed 属性を true ブラウザ表示をしたとき,最上位の要素とする場合,true としてください。config_simpledoc.xml では,simpledoc 要素をブラウザ表示しているので使用していませんが,仮に corpus 要素の属性を表示したい場合など もう一つの例として,複数の要素の属性を抽出する方法を説明します。 具体的な状況として,複数の章からなる文書を考えてみます。例えば,次のような構造を持った文書です。新たに設定した要素は,「章」要素です。 <simpledoc タイトル="全文検索システムについて" 筆者="国語太郎"> <章 タイトル="第1章 はじめに"> この文章では,... について述べます。 : : </章> <章 タイトル="第2章 発表の手順"> 本発表の手順は,次のとおりです。 : : </章> </simpledoc> ここで,第2章に含まれる「本発表」を検索したとします。config_simpledoc.xml の設定だと,simpledoc 要素の属性(「タイトル」属性と「著者」属性)しか,検索結果として抽出できません。どの章に含まれるかを知るには,「章」要素の「タイトル」属性を抽出する必要があります。 「章」要素を属性抽出対象の要素とするには,次の li 要素を index_eix 要素に追加してください。 <index_eix> <li name="simpledoc" middle_name="sd" is_empty="false" top="false" isBrowsed="true" /> <li name="章" middle_name="section" is_empty="false" top="false" /> </index_eix> li 要素の追加が終わったら,[ツール]→[インデックス生成]で索引を生成してください。 以上で,index_eix 要素のほうの準備は,完了です。後は,抽出する属性を表示するための設定を field_setting 要素に追加してください(4.1節参照)。追加する li 要素は,次のようになります。 <li name="章のタイトル" type="argument" element="章" attribute="タイトル" width="80" /> * 5.タグの属性の検索 [#je98a011] タグの属性検索の例として,ルビの検索の例を示します。ルビの検索は,『ひまわり』に標準で同梱されている『青空文庫』サンプルで試すことができます。 次の例では,「御釈迦様」にルビとして「おしゃかさま」を付与しています。r タグで「御釈迦様」をマークアップし,r タグの rt 属性でルビの「おしゃかさま」を記述します。 <corpus> <simpledoc タイトル="蜘蛛の糸" 著者="芥川龍之介"> ある日の事でございます。<r rt="おしゃかさま">御釈迦様</r>は極楽の蓮池のふちを、独りでぶらぶら御歩き になっていらっしゃいました。 :(中略) </simpledoc> </corpus> 『青空文庫』サンプルでもルビを同じ方法で記述しているので,『青空文庫』サンプルの設定ファイル config_aozora_sample.xml を参照して,index_aix 要素を探してください。 完全一致と部分一致の二つの設定がありますが,どちらも,li 要素の name 属性で r タグを,argument 属性で rt 属性を指定していることがわかります。この設定により,r タグの rt 属性を検索し,r タグでマークアップしている文字列(この場合,「御釈迦様」)を「キー」欄とする検索結果を得ることができます。 <index_aix> <li argument="rt" field_name="キー" isCompleteMatch="true" label="ルビ(rt)完全一致" middle_name="r" name="r"/> <li argument="rt" field_name="キー" isCompleteMatch="false" label="ルビ(rt)部分一致" middle_name="r2" name="r"/> </index_aix> 完全一致,部分一致は,isCompleteMatch 属性の "true", "false" で指定します。middle_name 属性は,別の値になるように注意してください。index_aix の詳細は,[[リファレンスマニュアル>全文検索システム『ひまわり』/設定ファイルリファレンスマニュアル#w1c92f72]]を参照してください。 * 6.Stand-Off型マークアップの検索 [#v1b325c1] 『ひまわり』のテキストデータインポート機能を利用する際,形態素解析を行うことができます。この形態素解析結果は,インポート結果のXMLファイルには,直接記述されず,別のファイルに格納されています。このようなタイプのマークアップをここでは,Stand-Off型マークアップということにします。 ** 6.1 属性としての検索 [#d058f492] Stand-Off型でマークアップされている情報の検索は,5節の方法と同じように行うことができます。config_aozora_sample.sd.xml の index_aix 要素を参照してください。 上から二つの li 要素が5節で説明したルビ検索のための設定で,それ以降がStand-Off型でマークアップされた形態素解析結果を検索するための設定です。type属性が "dic",name 属性が "morph" になっていることに着目してください。argument 属性には,形態素解析の結果得られる単語の情報,つまり,「品詞」「活用型」「活用形」などが設定されます。単語の情報として,どんな情報があるかは,設定ファイルの .himawari_annotator_config.xml を参照してください。 <index_aix> <li argument="rt" field_name="キー" isCompleteMatch="true" label="ルビ(rt)完全一致" middle_name="r" name="r"/> <li argument="rt" field_name="キー" isCompleteMatch="false" label="ルビ(rt)部分一致" middle_name="r2" name="r"/> <li argument="_TEXT" field_name="キー" isCompleteMatch="false" label="出現形" middle_name="dummy" name="morph" type="dic"/> <li argument="品詞" field_name="キー" isCompleteMatch="false" label="品詞" middle_name="dummy" name="morph" type="dic"/> <li argument="活用型" field_name="キー" isCompleteMatch="false" label="活用型" middle_name="dummy" name="morph" type="dic"/> <li argument="活用形" field_name="キー" isCompleteMatch="false" label="活用形" middle_name="dummy" name="morph" type="dic"/> <li argument="基本形" field_name="キー" isCompleteMatch="false" label="基本形" middle_name="dummy" name="morph" type="dic"/> <li argument="読み" field_name="キー" isCompleteMatch="false" label="読み" middle_name="dummy" name="morph" type="dic"/> </index_aix> ** 6.2 検索結果のための設定 [#y87dd229] 次に,品詞や活用型の情報を検索結果に表示するための設定の説明をします。 config_aozora_sample.sd.xml の field_setting 要素を参照してください。attribute 属性が「品詞」以降の設定です。 ここを見ればわかるとおり,4.1節で説明した普通のタグの属性の抽出と似ていますが,element 属性が "morph",type 属性が "dic" であることに注意してください。 <field_setting> : <li attribute="タイトル" element="記事" name="タイトル" type="argument" width="80"/> <li attribute="著者" element="記事" name="著者" type="argument" width="80"/> <li attribute="品詞" element="morph" name="品詞" type="dic" width="80"/> <li attribute="品詞細分類1" element="morph" name="品詞細分類1" type="dic" width="80"/> <li attribute="品詞細分類2" element="morph" name="品詞細分類2" type="dic" width="80"/> <li attribute="品詞細分類3" element="morph" name="品詞細分類3" type="dic" width="80"/> <li attribute="活用型" element="morph" name="活用型" type="dic" width="80"/> ---- *補足説明&aname(hosoku); [#b3551c11] ここでは,XML に関する用語のうち,「要素」,「タグ」,「属性」など,上記説明中で頻繁に使用されている用語について補足説明を行います。 -「開始タグ」から「終了タグ」までの部分を「要素」といいます。下の例は,simpledoc 要素の例です。 -「開始タグ」と「終了タグ」は必ずペアになっています。 &ref(../設定ファイル作成の手引き/himawari_glossary1.png); -ただし,「開始タグ」と「終了タグ」で囲われている部分(「要素内容」といいます)がない,「空要素」という「要素」もあります。例えば,上記の説明中で頻繁に出てくる li 要素です。空要素は,<... /> の形式で記述します。 <li name="simpledoc" path="Corpora/Simpledoc/corpus" /> -上の simpledoc 要素のように,「要素」に「属性」を付与することができます。 「属性」は「開始タグ」に記入します。上の例では,simpledoc 要素の「開始タグ」に「タイトル」属性と「著者」属性を付与しています。