全文検索システム『ひまわり』
講習会
山口昌也（国立国語研究所）

全文検索システム『ひまわり』講習会資料（2019-07-27）

本日の内容 全文検索システム『ひまわり』を使って，既存のテキストデータを利用する方法を紹介『ひまわり』 （ver.1.6ls05 = ver.1.6.4+実習資料+UniDic ver.2.2.0）
 青空文庫（サンプル） 全体的な流れ『ひまわり』の紹介と基本的な使い方
 もっとも簡単なインポート

すこし複雑なインポート

2

テキストファイル形式の青空文庫 ≒ ほぼアノテーション（情報付与）なし
５種類のタグを使って，アノテーション『ひまわり』用パッケージの作成

本講習会のねらい 既存の資料を『ひまわり』で利用できるようになること

資料の『ひまわり』へのインポート
 『ひまわり』で利用できる形式のタグ付け
 作成した資料の配布（『ひまわり』用パッケージ）
 利点『ひまわり』の各種機能を利用可能
 資料を他の研究者と共有可能
 研究結果を検証してもらえる 古い版の資料も利用できる3

誰でも（知識さえあれば）資料全体を検証可能『ひまわり』とは 言語研究用の全文検索システム

指定された文字列を網羅的に検索して，前後文脈付きで結果を表示します（コンコーダンサ） 『太陽コーパス』（２０世紀初頭の総合雑誌『太陽』）用の検索システムとして構築しました 特徴

ＸＭＬでタグづけされたコーパスを全文検索できます Windows, Mac OS, Linux など，多くのOS上で動作します 無料です

Ver.1.6 ⇒ 統計的な分析に必要なデータの収集支援機能を強化（例：総文字数，総単語数）
4

『ひまわり』の基本的な使い方

5

『ひまわり』を起動する
普段使うとき（64ビット版）（Windows 専用）
himawari.exe
himawari.exe

普段使うとき（32ビット版）（Windows 専用）
himawari32.exe
himawari32.exe

汎用（Windows，Mac，Linux など）
himawari.jar
himawari.jar

6コーパスの選択
 ［ファイル］⇒［コーパス選択］
7「外部DB」


コーパスファイルに直接記述していない付与データを格納

『青空文庫』サンプルの場合
は，形態素解析結果従来どおり，設定ファイルを『ひまわり』にドロップする方法でもOK

検索する「検索文字列」欄では右クリックで履歴表示

検索文字列

検索の実行

検索結果途中経過の表示
8

検索総数

ブラウザでの閲覧閲覧したい用例をダブルクリック

閲覧用のブラウザの変更
検索キーは，赤い字で表示［ツール］⇒［オプション］⇒ [ブラウザ]
9検索結果のソート
列名を左クリック

昇順
列タイトルをクリック



複数列を考慮したい場合


優先順位の逆順でソートを実行

降順
シフトキーを押しながら列タイトルをクリック

10

例：「話者」ごとに「後文脈」でソート→ 「後文脈」「話者」の順

検索結果の絞り込み
 検索時に指定「著者」欄が「夏目」で始まる結果のみに絞り込まれる 検索後に絞り込み絞り込みたい値を選択⇒右クリック⇒フィルタでもＯＫ
11

列名を右クリック検索結果の頻度集計
1.

集計したい列を選択
複数の列を選択することも可離れた列の選択• WindowsはCtrlキー• macOSはcommandキー

2.

12

右クリック⇒「統計」

形態素解析結果の閲覧

当該作品の形態素一覧⇒Shift + ダブルクリック

テキスト進行方向13

この機能は，外部DB「sd」の資料のみ実行可能もっとも簡単なインポート14テキストファイルのインポート―青空文庫のテキストデータを例に―
やまなし
宮沢賢治
------------------------------------------------------【テキスト中に現れる記号について】 ３種類の独自タグ《》：ルビ（例）幻燈《げんとう》

通常の文字列検索の問題点


例：「跳ねて」が検索できない

例：注記の中の「五月」が検索される

小さな谷川の底を写した二枚の青い幻燈《げんとう》です。

［＃３字下げ］一、五月［＃「一、五月」は中見出し］
二｜疋《ひき》の蟹《かに》の子供らが青じろい水の底で話していました。
『クラムボンはわらったよ。』『クラムボンはかぷかぷわらったよ。』『クラムボンは跳《は》ねてわらったよ。』『クラムボンはかぷかぷわらったよ。』

15

本文とそれ以外の区別ができない
例：ルビ［＃］：入力者注 主に外字の説明や、傍点の位置の指定（例）［＃３字下げ］一、五月［＃「一、五月」は中見出し］｜：ルビの付く文字列の始まりを特定する記号（例）二｜疋《ひき》の-------------------------------------------------------

タグは検索の障害になる

例：資料の注記（左のタグの説明など）『ひまわり』の全文検索
「跳ねて」も検索OK

ルビでの検索OK

検索範囲の指定OK



本文と付与情報（属性）は区別して検索インポートの実行
sampleフォルダを，起動している『ひまわり』にドラッグ＆ドロップ

lesson/sample フォルダakutagawa_ryunosukemiyazawa_kenji






16

kumono_ito.txt
yamanashi.txt

フォルダの情報をインポート時に利用

フォルダ階層 ⇒ Path 欄

ファイル名 ⇒ タイトル欄

ドロップしたフォルダ名がコーパス名になるHTML，XMLもインポート可能

文字コードは自動判別

詳細オプション（文字列変換，形態素解析など）

検索例• ルビ，注記が変換されていることに注目• ルビ，注記自体はタグの属性として記述されているため，「本文」
検索ではマッチしない• フォルダとファイルの情報が，それぞれ「Path」「タイトル」欄に表示される• 「著者」欄は空欄

17インポート時のオプション


文字正規化


ユーザ定義： 半角英数字⇒全角(.himawari_import_config.xml参照)



NFKC: Unicodeで規定される正規化

テキスト変換

resources/htd/aozora.htd• 本資料では，対象ファイルTXT（テキスト変換）のみを扱う• XHTML, XML（スタイルシート）については，一般的な規格なので，適宜資料を参照のこと。また，文字正規化，形態素解析などの処理はTXTと同様に適用される

18

改行位置に，<br />を挿入
注記，ルビをタグに変換

resources/htd/diy.htd

例： 全角英数字 ⇒ 半角英数字
例： 半角カタカナ ⇒ 全角カタカナ

自作コーパス用
汎用タグでテキストにタグ付け可能

形態素解析


MeCab, Jumanなどで解析し，結果を「外部データベース」に格納
解析対象の要素を指定できる• 本日は，「MeCab(UniDic)」を使用• 辞書は，resource/unidicにインストールインポート処理の概要

19

処理の流れテキスト変換①

インポートするファイルを一定のルールでXMLファイルに変換

ファイルの統合②
③

変換したXMLファイルを一つのファイルに統合

形態素解析（オプション）
変換後［＃８字下げ］一［＃「一」は中見出し］
ある日の事でございます。御釈迦様《おしゃかさま》は極楽の蓮池《はすいけ》のふちを、独りでぶらぶら御歩きになっていらっしゃいました。

変換前20<br /><注 内容="＃８字下げ" 付与="" 種別="注記" />一<注 内容="＃「一」は中見出し" 付与="" 種別="注記" /><br /><br />
ある日の事でございます。<r rt="おしゃかさま">御釈迦様</r>は極楽の<r rt="はすいけ">蓮池</r>のふちを、独りでぶらぶら御歩きになっていらっしゃいました。

XMLタグの基本
 一定範囲に意味づけ

開始タグ：
 終了タグ ：

<記事 ....></記事>

 特定の位置に意味付け（範囲がない場合）


空要素タグ ：<br />「記事」タグは，「タイトル」，「著者」，「path」 属性を持つ

開始タグ<記事 タイトル="吾輩は猫である" 著者="夏目漱石" path="/sample/テキスト１.txt"><r rt="わがはい">吾輩</r>は猫である。名前はまだ無い。<br />どこで生れたかとんと見当がつかぬ。……<br />

終了タグ

</記事>

『ひまわり』は検索時，タグを読み飛ばして，文字列照合する
21

テキスト変換（anozora.htdの場合）
改行位置に<br />を挿入
 半角の&<>を全角に変換

青空文庫の注記を「注」タグへ

凡例： ［＃ここに注記を書く］［＃８字下げ］［＃「一」は中見出し］

青空文庫のルビをrタグへ

凡例１： 漢字列《ここにルビを書く》
凡例２： ｜文字列《ここにルビを書く》

御釈迦様《おしゃかさま》
蓮池《はすいけ》
人間中で一番｜獰悪《どうあく》な種族

変換後［＃８字下げ］一［＃「一」は中見出し］
ある日の事でございます。御釈迦様《おしゃかさま》は極楽の蓮池《はすいけ》のふちを、独りでぶらぶら御歩きになっていらっしゃいました。

変換前22<br /><注 内容="＃８字下げ" 付与="" 種別="注記" />一<注 内容="＃「一」は中見出し" 付与="" 種別="注記" /><br /><br />
ある日の事でございます。<r rt="おしゃかさま">御釈迦様</r>は極楽の<r rt="はすいけ">蓮池</r>のふちを、独りでぶらぶら御歩きになっていらっしゃいました。

ファイルの統合
corpus.xml<コーパス><記事><テキスト>（ここに，入力ファイル１の変換結果が置かれる）</テキスト></記事>

入力ファイル１

入力ファイル２

入力ファイル３：インポート<記事><テキスト>（ここに，入力ファイル２の変換結果が置かれる）</テキスト></記事><記事><テキスト>（ここに，入力ファイル３の変換結果が置かれる）</テキスト></記事>： （入力のファイルの分だけ繰り返す）</コーパス>23

生成されるファイル（コーパス名sampleの場合）『ひまわり』フォルダ
config_sample.xml

sampleコーパス用設定ファイル

config_sample.sd.xml

sampleコーパス用設定ファイル（形態素解析結果の検索を含む）

Corporaフォルダ
sampleフォルダ
xsltフォルダ

24

ブラウザ表示用の設定ファイル

corpus.xml

コーパス本体（ファイルを統合した結果）

corpus.{cix|eix|aix}

全文検索用の索引

corpus.morph.{sax|six}

形態素解析結果検索用の索引

himawari.morph.sdc

形態素解析結果検索用の辞書

少し複雑なインポート25

概要
 5種類の汎用タグを使ったアノテーションを行う

aozora.htd ⇒ ルビと注記のみ
 diy.htd ⇒ 自分で意味づけ（資料全体，作品本体など）


原資料
蜘蛛の糸
芥川龍之介

タグ付け後
作者名やタイトルの情報を利用できない------------------------------------------------------【テキスト中に現れる記号について】：-------------------------------------------------------t1(蜘蛛の糸,芥川龍之介)

開始タグ------------------------------------------------------【テキスト中に現れる記号について】：------------------------------------------------------開始タグ
t2()［＃８字下げ］一［＃「一」は中見出し］

資料全体（タイトル，著者）［＃８字下げ］一［＃「一」は中見出し］

ある日の事でございます。御釈迦様《おしゃかさま》は極楽の蓮池《はすいけ》のふちを、独りでぶらぶら御歩きになっていらっしゃいました。
：
作品以外の部分も検索さ
底本：「芥川龍之介全集2」ちくま文庫、筑摩書房
れてしまう
1986（昭和61）年10月28日第1刷発行
1996（平成8）年7月15日第11刷発行

26

ある日の事でございます。御釈迦様《おしゃかさま》は極楽の蓮池《はすいけ》のふちを、独りでぶらぶら御歩きになっていらっしゃいました。
作品本体の：
範囲指定
終了タグ
/t2
底本：「芥川龍之介全集2」ちくま文庫、筑摩書房
1986（昭和61）年10月28日第1刷発行
1996（平成8）年7月15日第11刷発行
/t1
終了タグ

ブロックレベル要素用タグ t1, t2
機能（t1, t2同一）
 検索対象

作品全体，章や節など，行以上の範囲をアノテーションするのに使う
開始タグは三つまで属性を持てる
０個 t1()

t1タグの範囲のみを検索

１個 t1(夏目漱石)
２個 t1(夏目漱石,吾輩は猫である)
３個 t1(夏目漱石,吾輩は猫である,1905)
 検索結果 変換結果のXML

タグは，すべて半角文字t1(夏目漱石,吾輩は猫である)
吾輩は猫である。名前はまだ無い。
：
/t1
27

<t1 arg1=“夏目漱石” arg2=“吾輩は猫である”>
吾輩は猫である。名前はまだ無い。
：</t1>

インライン要素用タグ u1, u2
機能（u1, u2同一）


行内の範囲をアノテーションするのに使用する。
開始タグは三つまで属性を持てる（属性なしは不可）

 検索対象マークアップした文字列をその属性値で検索 青空文庫タグのu1, u2での記述
ルビ

二｜疋《ひき》の蟹《かに》の子供らが青じろい水の底で話していました。

二u1(ひき)疋/u1のu1(かに)蟹/u1の子供らが青じろい水の底で話していました。

この※［＃「特のへん＋廴＋聿」、第3水準1-87-71］陀多には蜘蛛を助けた事があるのを御思い出しになりました。

このu2(特のへん＋廴＋聿,第3水準1-8771) ※/u2陀多には蜘蛛を助けた事があるのを御思い出しになりました。

注記28

空要素タグ e1機能

原資料のページ番号や行位置など，位置を表すのに使う三つまで属性を持てる（属性なしは不可）
e1/(動詞) , e1/(動詞,五段), e1/(動詞,五段,未然形)



検索時は，マッチした文字列の先頭文字から見て，文進行方向の最も近いタグの属性値を表示
「吾輩」「吾輩は」「輩」の場合 ⇒ 「名詞」



「猫である」の場合 ⇒ 「名詞」

 単語の区切り例
原資料

吾輩は猫である。
タグ付け後

吾輩e1/(名詞)はe1/(助詞)猫e1/(名詞)でe1/(助動詞)あるe1/(助動詞) 。 e1/(記号)＊（機能の説明用なので，実用には少し無理がある）

29

空要素タグ e2機能e1とほぼ同じ機能を持つ

ただし，検索時は，マッチした文字列の先頭文字から見て，文書先頭方向の最も近いタグの属性値を表示

 単語の区切り例
原資料

吾輩は猫である。
タグ付け後（e2）e2/(名詞)吾輩e2/(助詞)はe2/(名詞)猫e2/(助動詞)でe2/(助動詞)あるe2/(記号) 。
タグ付け後（e1）

吾輩e1/(名詞)はe1/(助詞)猫e1/(名詞)でe1/(助動詞)あるe1/(助動詞) 。 e1/(記号)30タグを使ってみよう

lesson/annotation_sample_results
フォルダはアノテーション例なので，一通り終えたあと，参照のこと

 lesson/annotation_sample フォルダ
wagahai.txt【夏目漱石 吾輩は猫である】

吾輩《わがはい》は猫である。【１文目】
名前はまだ無い。【２文目】
どこで生れたかとんと見当《けんとう》がつかぬ。【３文目】

 全体をt1タグ
 ルビをu1タグ
 文番号をe1タグyamanasi.txt【宮沢賢治 やまなし】

 全体をt1タグ
 1発話をt2タグ【子供】『お父さん、いまおかしなものが来たよ。』【お父さん】『どんなもんだ。』【子供】『青くてね、光るんだよ。はじがこんなに黒く尖ってるの。
それが来たらお魚が上へのぼって行ったよ。』【】内は属性値とし，本文ではないものとする

31インポート時のオプション

diy.htd

diyConfig.xml
MeCab(UniDic)

32

アノテーション結果の集計

一覧機能（ユーザ入力）
で付与情報を閲覧 t2一覧

 morph（形態素）一覧

属性• 品詞• 品詞分類１～３
• 基本形
• 活用型

33

 文字数（t1）「長さ」：最下位要素の長さ

 t2中の話者別形態素数

タグの包含関係を用いる

『ひまわり』用パッケージの作成

34

『ひまわり』用パッケージの構造 名大会話コーパスの場合


次の構造のフォルダを作成し，zipで圧縮Himawari_meidai

Corpora/Meidai
config_meidai.xml

config_meidai.xml.himawari_package_info
Corporaフォルダ
Meidai.himawari_package_infoの内容コピーしたいファイルとフォルダを列挙する
隠しファイルの表示（ Windowsの場合）
Explorerの「表示」→「隠しファイル」

もちろん中身も入れる（ macOSの場合）［command］+［shift］+ 「.」 参考資料

35「設定ファイルリファレンスマニュアル」の「パッケージ設定ファイル」

パッケージを作成してみよう
1.

パッケージを収めるフォルダ作成

2.

関連ファイルを1のフォルダにコピー
config ファイル Corporaフォルダの中の関連フォルダ.himawari_package_infoを作成

3.

［Windowsの場合］
Explorerで新規作成（ファイル名の末尾に「.」をつける）
 ［macOSの場合］
miで［ファイル］→ ［別名で保存］4.
36

フォルダをzipで圧縮設定ファイル（config_*.xml）の調整
 例：列名を変える<!-- 結果レコードのフィールド定義 --><field_setting><li align="RIGHT" name="no" type="index" width="30"/><li align="RIGHT" attribute="_preceding_context" element="_sys" name="前文脈" sort_direction="R"
type="preceding_context" width="180"/><li attribute="_key" element="_sys" name="キー" sort_order="1" type="key" width="80"/><li attribute="_following_context" element="_sys" name="後文脈" sort_order="2" type="following_context"
width="160"/><li attribute="path" element="記事" name="Path" type="argument" width="80"/><li attribute="タイトル" element="記事" name="タイトル" type="argument" width="80"/><li attribute="arg1" element="t1" name="t1:属性1" type="argument" width="80"/>
name属性の値<li attribute="arg2" element="t1" name="t1:属性2" type="argument" width="80"/>を変更<li attribute="arg3" element="t1" name="t1:属性3" type="argument" width="80"/><li attribute="arg1" element="t2" name="t2:属性1" type="argument" width="80"/><li attribute="arg2" element="t2" name="t2:属性2" type="argument" width="80"/><li attribute="arg3" element="t2" name="t2:属性3" type="argument" width="80"/>

 参考資料

37『ひまわり』ホームページ⇒「文書」⇒「設定ファイルリファレンスマニュアル」

設定ファイル（config_*.xml）の調整
 全文検索範囲の指定<index_cix><li field_name="キー" label="本文" middle_name="article" name="テキスト" type="normal"/><li field_name="キー" label="本文(正規表現)" middle_name="article" name="テキスト" type="null"/><li field_name="キー" label="t1" middle_name="t11" name="t1" type="normal"/><li field_name="キー" label="t1(正規表現)" middle_name="t12" name="t1" type="null"/><li field_name="キー" label="t2" middle_name="t21" name="t2" type="normal"/><li field_name="キー" label="t2(正規表現)" middle_name="t22" name="t2" type="null"/></index_cix>

index_cix/li/@name index_cix/li/@type

対象とする要素名
全文検索の種類

索引付きの通常の全文検索
 null: 索引なしの正規表現（全文）検索 normal :38

補足39

インポート時のテキスト変換（htdファイル）
 正規表現による文字列置換を利用

正規表現は，Java （クラス Pattern） に準ずる

 変換規則Himawari_1_6ls05/resources/htd に変換規則ファイルを配置
 変換規則の形式


変換前文字列（正規表現） タブ文字 変換後文字列


規則の適用
 １入力ファイル全体（改行を含め）を一つの文字列と考える
 変換規則を上から順に適用する

40

変換規則の例
aozora.htd※［＃小書き平仮名ん］⇒ <注 内容="＃小書き平仮名ん" 付与="" 種別="注記" />## 改行位置に，<br />を挿入¥n<br />¥n一番｜獰悪《どうあく》な## 注記⇒ 一番<r rt="どうあく">獰悪</r>な［(＃.+?)］<注 内容="$1" 付与="" 種別="注記" />## ルビ(範囲指定あり)
蓮池《はすいけ》[｜](.+?)《(.+?)》<r rt="$2">$1</r>⇒ <r rt="はすいけ">蓮池</r>## ルビ(範囲指定なし)(¥p{InCJKUnifiedIdeographs}+?)《(.+?)》 <r rt="$2">$1</r>diy.htd##5 t1, t2 タグ（ブロックレベル要素，開始タグ）
t1，t2タグ（開始タグ）の変換##例 t1(蜘蛛の糸,芥川龍之介)
属性の数ごとに定義している##⇒ <t1 arg1="蜘蛛の糸" arg2="芥川龍之介">##t([12])¥(([^,¥n¥)]*?),([^,¥n¥)]*?),([^¥n¥)]*?)¥)<t$1 arg1="$2" arg2="$3" arg3="$4">t([12])¥(([^,¥n¥)]*?),([^¥n¥)]*?)¥)<t$1 arg1="$2" arg2="$3">t([12])¥(([^¥n¥)]*?)¥)<t$1 arg1="$2">t([12])¥(¥)<t$1>##5 t1, t2 タグ（ブロックレベル要素，終了タグ）##例 /t1##⇒ </t1>##/t([12])</t$1>

41

t1 ，t2タグ（終了タグ）の変換

参考：正規表現の説明
 () は，マッチした文字列を記憶
 「.」は任意の一文字
 「+」は，前接する文字の１回以上の繰り返し
 「?」はマッチングの処理を最短で行う
 $1, $2 は，マッチした文字列を展開する。番号は，マッチした位置を表す
 ¥p{InCJKUnifiedIdeographs} は，１文字の漢字を表す

42

全文表示用の設定
 各資料の xsltフォルダXSLTとCSSの定義ファイル

 annotation_sampleの場合
 kotobun_written.xsl （XML→HTML変換規則）

 kotobun_written.css （スタイルシート）

ブラウザとの表示と見比べてみてください<!-- for diy.htd -->t1用の変換規則<xsl:template match="t1"><h3><xsl:text>t1:</xsl:text><xsl:value-of select="@arg1"/>/<xsl:value-of select="@arg2"/>/<xsl:value-of select="@arg3"/></h3><xsl:apply-templates/></xsl:template>
t2用の変換規則<xsl:template match="t2"><h3><xsl:text>t2:</xsl:text><xsl:value-of select="@arg1"/>/<xsl:value-of select="@arg2"/>/<xsl:value-of select="@arg3"/></h3><xsl:apply-templates/></xsl:template><xsl:template match="e1"><strong><xsl:text>[[</xsl:text><xsl:value-of select="@arg1"/>/<xsl:value-of select="@arg2"/>/<xsl:value-ofselect="@arg3"/><xsl:text>]]</xsl:text></strong><xsl:apply-templates/></xsl:template>43

e1用の変換規則

単語での検索（１）

青空文庫サンプル（形態素解析結果付き）を対象に
config_aozora_sample.sd.xml

 単語単位で正規表現検索

単位をまたいだ検索はできない 青空文庫サンプルは，MeCab (ver.0.996)で解析
 名大会話コーパスについては，HPを参照
A)「日」を含む単語「基本形ー１」「基本形１」
欄は，それぞれ前後の単語の基本形B)「キー」欄（出現形）の一覧を求める「キー」欄のどれかを選択⇒右クリック⇒統計44

単語での検索（２）C)

先頭が「日」の単語
正規表現の「^」（文字列の先頭）D)

末尾が「日」の単語
正規表現の「$」（文字列の末尾）

E)

単語「日」のみF)

活用語の基本形
すべての語形を一括して検索

45

青空文庫サンプル（形態素解析結果付き）を対象に
config_aozora_sample.sd.xml

おわりに 全文検索システム『ひまわり』チュートリアル
 『ひまわり』の紹介と基本的な使い方
 青空文庫形式テキストのインポート
 ５種類の汎用タグを用いたアノテーション

 『ひまわり』用パッケージの作成

 さらに詳しく知るには『ひまわり』ホームページの各種資料
 『ひまわり』用各種パッケージが実例として使える
 テキスト処理の知識があれば，直接XML形式に変換する方法もあり

46

各種設定ファイル＆参考資料


形態素解析システム

インポート関連『ひまわり』フォルダの.himawari_import_config.xml「設定ファイルリファレンスマニュアル」の「インポート関連」

テキスト変換規則『ひまわり』フォルダの.himawari_annotator_config.xml『ひまわり』フォルダの resources/unidic/dicrc （辞書情報）「設定ファイルリファレンスマニュアル」の「アノテーション関連」「設定ファイルリファレンスマニュアル」のimport / text_transformation_definition 要素『ひまわり』用データ作成一般47『ひまわり』HP ⇒ 「簡単な検索用データの作成方法1」『ひまわり』HP ⇒ 「簡単な検索用データの作成方法2」