4
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

DoqueDB:デモサイトで青空文庫を検索しよう

Last updated at Posted at 2023-10-09

正式公開しました (2024年2月16日追記)

当記事をご覧いただきありがとうございます。長らくお待たせいたしましたが、DoqueDBはようやく正式公開を果たすことができました。以下の記事にてWebサイトやGitHubプロジェクトをご案内しております。

DoqueDB:MySQL, PostgreSQLと構文を比較してみる

これ以降の内容は正式公開前のβ版に関するものです。内容は正式版にも当てはまりますが、リンク先は順次公式サイトへと切り替わりますので、ご留意ください。


引き続きDoqueDBの全文検索についての記事でお時間を頂戴いたします。前回の記事はこちらになります。

デモサイトで自然文検索を試そう

image.png
上の図は、DoqueDBデモサイトでの検索のようすです。前回は、「使ってみよう」を参照しながら、β版パッケージに付属のサンプルデータをいろいろ検索してみました。青空文庫の作品データの一部を使っていますが、件数が少なかったこともあり、ご自分でお試しいただくには消化不良気味であったかと思います。

今回はDoqueDBのデモサイトで「自然文検索」をお試しいただき、キーワードを限定しない全文検索がどれくらい役立つものなのか、ご覧いただくことにしましょう。デモサイトはこちらからご訪問いただけます。

【おまけ】記事の末尾に、DoqueDB β版をWindowsのWSL2 + Ubuntuにインストールし、青空文庫のデータを自分でダウンロード・登録して、デモサイト相当の検索を行う方法を示しています。お楽しみに!

江戸川乱歩作品の一節を検索する

デモサイトの使い方ページにある検索例、江戸川乱歩の『仮面の恐怖王』冒頭の一節を検索してみましょう。

東京上野公園の不忍池のそばに、ふしぎな建物がたちました。両国のもとの国技館をぐっと小さくしたような、まるい建物で、外がわの壁も、まる屋根も、ぜんぶ、まっ白にぬってあるのです。

実行すると、検索結果の上位50件中、江戸川乱歩作品が24件見つかりました。検索結果の画面ショットおよび適合度、タイトル、著者のリストを以下に示しておきましょう。画面ショットでは検索されたキーワードがハイライトされています。リストでは江戸川乱歩作品が赤字で示されています。適合度を見ると、やはり検索したテキストを含む作品が飛び抜けて高い数値になることがわかります。

検索結果上位50件の画面ショット

image.png

検索結果上位50件のリスト
適合度 タイトル 著者
0.71135 仮面の恐怖王 江戸川 乱歩
0.47181 目羅博士の不思議な犯罪 江戸川 乱歩
0.42542 吸血鬼 江戸川 乱歩
0.41205 日和下駄 永井 荷風
0.38171 本所両国 芥川 竜之介
0.37228 虎の牙 江戸川 乱歩
0.37131 上野 永井 荷風
0.36481 秘密礼拝式 ブラックウッド アルジャーノン
0.35849 日本文化私観 坂口 安吾
0.35363 本所両国 芥川 竜之介
0.35261 妖人ゴング 江戸川 乱歩
0.34019 鉄人Q 江戸川 乱歩
0.33793 白い月の世界 中谷 宇吉郎
0.33692 風流太平記 山本 周五郎
0.33247 土俵の夢 尾崎 士郎
0.32832 透明怪人 江戸川 乱歩
0.32745 超人間X号 海野 十三
0.32522 黄金豹 江戸川 乱歩
0.32192 水 附渡船 永井 荷風
0.31946 少年探偵団 江戸川 乱歩
0.31727 怪人二十面相 江戸川 乱歩
0.31675 超人ニコラ 江戸川 乱歩
0.31658 赤ひげ診療譚 山本 周五郎
0.31218 宇宙怪人 江戸川 乱歩
0.30744 黒い月の世界 中谷 宇吉郎
0.29838 死体の匂い 田中 貢太郎
0.29295 菊人形 宮本 百合子
0.29166 怪星ガン 海野 十三
0.29055 妖星人R 江戸川 乱歩
0.29036 ニールスのふしぎな旅 矢崎 源九郎
0.28668 金属人間 海野 十三
0.28458 妖婆 芥川 竜之介
0.28395 灰色の巨人 江戸川 乱歩
0.27943 奇面城の秘密 江戸川 乱歩
0.27699 夜光人間 江戸川 乱歩
0.27653 待呆け議会風景 宮本 百合子
0.27493 旅の仲間 アンデルセン ハンス・クリスチャン
0.27187 塔上の奇術師 江戸川 乱歩
0.27103 探偵少年 江戸川 乱歩
0.27073 電人M 江戸川 乱歩
0.26824 角力 久保田 万太郎
0.26791 妖怪博士 江戸川 乱歩
0.26607 竹柏記 山本 周五郎
0.26381 両国今昔 木村 荘八
0.2632 明治世相百話 山本 笑月
0.25996 大金塊 江戸川 乱歩
0.25595 怪奇四十面相 江戸川 乱歩
0.25568 魔法人形 江戸川 乱歩
0.25525 江川蘭子 江戸川 乱歩
0.25332 山彦乙女 山本 周五郎

実際に検索されるキーワードと重み付けは、以下のようになります。これはデモサイト上でSQLを実行して確認した結果ですが、ご自分で青空文庫のデータを登録すれば、ほぼ同じ数値が得られるはずです。

$ sqli_cmd="/var/lib/DoqueDB/bin/sqli -remote localhost 54321
-user root -password doqadmin -code utf-8"
$ query="select word(content) from AozoraBunko
where content contains freetext(
'東京上野公園の不忍池のそばに、ふしぎな建物がたちました。両国のもとの国技館をぐっと小さくしたような、まるい建物 で、外がわの壁も、まる屋根も、ぜんぶ、まっ白にぬってあるのです。')"
$ $sqli_cmd -database sampleSqli -sql "$query"

{word(content)}
{'まっ' language '' category 'Helpful' scale 0.67 df 7865}
{'忍 池' language '' category 'Helpful' scale 0.20 df 90}
{'不 忍' language '' category 'Helpful' scale 0.20 df 152}
{'国技館' language '' category 'Helpful' scale 0.67 df 52}
{'建物' language '' category 'Helpful' scale 0.80 df 1793}
{'ぎな 建物' language '' category 'Helpful' scale 0.20 df 1}
{'東京 上野' language '' category 'Helpful' scale 0.20 df 12}
{'ぜんぶ' language '' category 'Helpful' scale 0.67 df 116}
{'上野 公園' language '' category 'Helpful' scale 0.20 df 112}
{'まっ 白' language '' category 'Helpful' scale 0.20 df 275}

出力の中で、scaleは重要度、dfは文書頻度を表します。何の変哲もない単語を検索するだけで、これだけ多くの江戸川乱歩作品があぶり出されるのは不思議な気もしますが、検索結果のハイライトを見ると、「ぜんぶ」「まっ白」などの語がよく使われているようですね。

検索結果を表示する際には、検索キーワードをタグ付けすることができます。これを行うには、kwic関数にenclose withを指定します。「使ってみよう」にselect word()やenclose withの使用例を追記しましたので、ぜひご確認ください。

冒頭の一節で同じ著者の作品が見つかるもの

江戸川乱歩以外にも、作品の冒頭の一節を検索することで、同じ著者の作品が見つかるケースがいくつかあります。その例を2つほどお目にかけましょう。

1つは夢野久作「山羊髯編輯長」です。冒頭の一段落を検索したところ、50件中39件が同じ著者の作品でした。検索テキストを含む作品の適合度が高いのも同じ傾向です。

「山羊髯編輯長」冒頭の一段落

「玄洋日報社」と筆太に書いた、真黒けな松板の看板を発見した吾輩はガッカリしてしまった。コンナ汚穢い新聞社に俺は這入るのかと思って……。

検索結果上位50件のリスト(DoqueDB, Aozorasearch)
適合度 タイトル 著者
0.87677 山羊髯編輯長 夢野 久作
0.46266 父杉山茂丸を語る 夢野 久作
0.45122 冗談に殺す 夢野 久作
0.42697 キチガイ地獄 夢野 久作
0.41323 一足お先に 夢野 久作
0.40109 霊感! 夢野 久作
0.39502 鉄鎚 夢野 久作
0.35266 瘋癲老人日記 谷崎 潤一郎
0.34501 ドグラ・マグラ 夢野 久作
0.34491 近世快人伝 夢野 久作
0.32297 爆弾太平記 夢野 久作
0.31584 ココナットの実 夢野 久作
0.30398 ナガレボシ 新美 南吉
0.30091 スランプ 夢野 久作
0.30054 甲賀三郎氏に答う 夢野 久作
0.29632 少女地獄 夢野 久作
0.29206 いなか、の、じけん 夢野 久作
0.2808 近眼芸妓と迷宮事件 夢野 久作
0.27661 超人鬚野博士 夢野 久作
0.27267 二重心臓 夢野 久作
0.27072 谷崎 潤一郎
0.26838 焦点を合せる 夢野 久作
0.26751 復讐 夢野 久作
0.26535 殺人迷路 夢野 久作
0.26443 悪魔祈祷書 夢野 久作
0.26349 難船小僧 夢野 久作
0.26196 冥土行進曲 夢野 久作
0.26157 戦場 夢野 久作
0.25789 S岬西洋婦人絞殺事件 夢野 久作
0.25283 一円本流行の害毒と其裏面談 宮武 外骨
0.25213 斜坑 夢野 久作
0.24348 けむりを吐かぬ煙突 夢野 久作
0.24072 無系統虎列剌 夢野 久作
0.23948 人間腸詰 夢野 久作
0.23811 木魂 夢野 久作
0.23698 支那米の袋 夢野 久作
0.23253 巡査辞職 夢野 久作
0.22986 能ぎらい/能好き/能という名前 夢野 久作
0.22273 白菊 夢野 久作
0.21775 能とは何か 夢野 久作
0.21053 機関車を見ながら 芥川 竜之介
0.2099 漱石氏と私 高浜 虚子
0.20907 初代桂春団治研究 正岡 容
0.20808 人格を認知せざる国民 新渡戸 稲造
0.20632 創作人物の名前について 夢野 久作
0.20594 衝突心理 夢野 久作
0.20555 コイヌ 村山 籌子
0.2052 猟奇歌 夢野 久作
0.20488 生まれいずる悩み 有島 武郎
0.20412 オ寝坊ナ ジヤガイモサン 村山 籌子

もう1つは吉川英治「大岡越前」です。冒頭の5行を検索したところ、50件中33件が同じ著者の作品になりました。

「大岡越前」冒頭の5行

「犬がうらやましい。ああ、なぜ人間なぞに生れたろう」
 冗戯(じょうだん)にも、人間仲間で、こんなことばを聞くことが近年では、めずらしくもなくなった。
 笑えるうちは、まだよかったが、この頃ではそんな冗戯(じょうだん)が出ても、笑う者もなくなった。
「何しろ、怪ッ態な世の中になったものです。お犬様には、分るでしょうが、人間どもには何が何だか、わけが分りませんな」
 これは、庶民とよぶ人間の群の、一致していうことばだったが、人々のあたまの中は、言葉どおりに、一致してはいなかった。

検索結果上位50件のリスト
適合度 タイトル 著者
0.63252 大岡越前 吉川 英治
0.53601 宮本武蔵 吉川 英治
0.51726 新編忠臣蔵 吉川 英治
0.48008 銀河まつり 吉川 英治
0.45777 野槌の百 吉川 英治
0.44278 宮本武蔵 吉川 英治
0.44042 平の将門 吉川 英治
0.43699 松のや露八 吉川 英治
0.39954 新書太閤記 吉川 英治
0.39106 吉川 英治
0.38429 鍋島甲斐守 吉川 英治
0.37868 宮本武蔵 吉川 英治
0.35929 宮本武蔵 吉川 英治
0.35847 剣難女難 吉川 英治
0.35062 私本太平記 吉川 英治
0.34374 春の雁 吉川 英治
0.33605 旗岡巡査 吉川 英治
0.3331 幸福のうわおいぐつ アンデルセン ハンス・クリスチャン
0.32955 山吹町の殺人 平林 初之輔
0.32593 火星兵団 海野 十三
0.32509 随筆 新平家 吉川 英治
0.32299 丹下左膳 林 不忘
0.31909 梅里先生行状記 吉川 英治
0.31662 私本太平記 吉川 英治
0.31661 新書太閤記 吉川 英治
0.31554 新書太閤記 吉川 英治
0.31326 巷説享保図絵 林 不忘
0.3125 私本太平記 吉川 英治
0.31192 三国志 吉川 英治
0.31094 藍色の蟇 大手 拓次
0.30847 私本太平記 吉川 英治
0.30715 新・水滸伝 吉川 英治
0.30637 新書太閤記 吉川 英治
0.30632 私本太平記 吉川 英治
0.30537 野のはくちょう アンデルセン ハンス・クリスチャン
0.3037 私本太平記 吉川 英治
0.30277 私本太平記 吉川 英治
0.30207 私本太平記 吉川 英治
0.30121 泡鳴五部作 岩野 泡鳴
0.3005 草迷宮 泉 鏡花
0.29822 丹下左膳 林 不忘
0.29794 新書太閤記 吉川 英治
0.29776 牢獄の花嫁 吉川 英治
0.2967 折々の記 吉川 英治
0.29663 江戸三国志 吉川 英治
0.29638 蘆刈 谷崎 潤一郎
0.29582 随筆 私本太平記 吉川 英治
0.29181 『春と修羅』 宮沢 賢治
0.29072 新書太閤記 吉川 英治
0.2834 私本太平記 吉川 英治

ここまでのところ、期待する結果が首尾よく見つかっています。しかし、正直に申し上げて、これらはよくよく吟味された結果です。冒頭の一節で作品が検索できる作者はそう多くはありません。やはり「とがった」文体をもつ作者のほうが検索にかかりやすいのかもしれませんね。これはと思う作者の作品を、ご自分で検索してお試しください。

あらすじで検索する

視点を変えて、こんどは冒頭の一節ではなく、あらすじで検索してみましょう。「こんな作品を読みたいなあ」という気分を文章にするわけですね。

船が難破し無人島に漂着した少年たちが島で生き延びて生還する

冒頭の一節と比較すると、こちらのほうが特徴をもったキーワードがそれなりに出現することから、同じような傾向をもつ作品が多数見つかるのではないかと想像できます。さあ、どうでしょうか。

検索結果の画面ショットとリストはこちらになります。「海が舞台の冒険小説」らしい作品が20件ほどありますね。該当する作品を赤枠赤字で示しました。あらすじにピッタリではなくても、同じような特徴をもつ作品が見つかったわけです。これは類似文書検索としては、かなりよい結果だと言えそうです。

検索結果上位50件の画面ショット)

image.png

検索結果上位50件のリスト)
適合度 タイトル 著者
0.82254 海島冒険奇譚 海底軍艦 押川 春浪
0.67701 無人島に生きる十六人 須川 邦彦
0.66478 新宝島 江戸川 乱歩
0.63979 少年連盟 佐藤 紅緑
0.60772 沈黙の水平線 牧 逸馬
0.60567 大菩薩峠 中里 介山
0.59543 怪奇人造島 寺島 柾史
0.5909 鎖国 和辻 哲郎
0.54705 ウニデス潮流の彼方 橘 外男
0.52451 海上の道 柳田 国男
0.51944 イノチガケ 坂口 安吾
0.51479 恐竜島 海野 十三
0.48178 ボニン島物語 久生 十蘭
0.47002 海難記 久生 十蘭
0.46909 光をかかぐる人々 徳永 直
0.42492 他計甚麽(竹島)雑誌 松浦 武四郎
0.42234 自分は見た 千家 元麿
0.42213 氷島の漁夫 吉江 喬松
0.38316 海底大陸 海野 十三
0.38254 後の業平文治 三遊亭 円朝
0.3821 紅毛傾城 小栗 虫太郎
0.37092 光と風と夢 中島 敦
0.36997 少年探偵長 海野 十三
0.3695 幽霊船 小川 未明
0.36932 颱風雑俎 寺田 寅彦
0.36129 「太平洋漏水孔」漂流記 小栗 虫太郎
0.35658 大空魔艦 海野 十三
0.35623 電気鳩 海野 十三
0.35421 海に生くる人々 葉山 嘉樹
0.34789 海郷風物記 木下 杢太郎
0.34238 恐竜艇の冒険 海野 十三
0.34181 エリザベスとエセックス 片岡 鉄兵
0.34176 伊良湖岬 田山 花袋
0.33637 宝島 佐々木 直次郎
0.33454 怪塔王 海野 十三
0.33403 ガリバー旅行記 スウィフト ジョナサン
0.32348 探検実記 地中の秘密 江見 水蔭
0.32306 重吉漂流紀聞 久生 十蘭
0.32214 牡丹 宮本 百合子
0.32209 故郷七十年 柳田 国男
0.32202 昭和遊撃隊 平田 晋策
0.32101 真珠 坂口 安吾
0.31769 ノンシャラン道中記 久生 十蘭
0.31675 鞄らしくない鞄 海野 十三
0.31395 東洋文化史における仏教の地位 高楠 順次郎
0.31303 船旅 アーヴィング ワシントン
0.31017 新生 島崎 藤村
0.30784 人外魔境 小栗 虫太郎
0.30664 大師の入唐 桑原 隲蔵
0.30428 病牀六尺 正岡 子規

DoqueDBで実際に検索されたキーワードを見てみましょう。これを見てわかるのは、検索キーワードが形態素になっていることです。

$ query="select word(content) from AozoraBunko
where content contains freetext(
'船が難破し無人島に漂着した少年たちが島で生き延びて生還する')"
$ $sqli_cmd -database sampleSqli -sql "$query"

{word(content)}
{'船' language '' category 'Helpful' scale 0.67 df 4050}
{'延び' language '' category 'Helpful' scale 0.67 df 1219}
{'難破' language '' category 'Helpful' scale 0.67 df 165}
{'生き' language '' category 'Helpful' scale 0.67 df 6311}
{'少年' language '' category 'Helpful' scale 0.67 df 2774}
{'少年 たち' language '' category 'Helpful' scale 0.20 df 168}
{'無人島' language '' category 'Helpful' scale 0.67 df 89}
{'漂着' language '' category 'Helpful' scale 0.67 df 101}
{'生き 延び' language '' category 'Helpful' scale 0.20 df 93}
{'生還' language '' category 'Helpful' scale 0.67 df 66}

DoqueDBの自然文検索は、以下のように行われます。

  1. 入力された検索テキストを形態素解析して検索語の候補を作る。
  2. 検索語候補を転置索引で個別に検索し、重み付けの情報を得る。
  3. 重要と判定された検索語を組み合わせて最終的な検索を行う。

今回のケースでは、このような仕組みが検索条件にマッチしており、そのため、より希望に近い検索結果が得られたと言えそうです。

いかがでしょう。ここまでいくつか自然文検索を試してきましたが、従来の製品と比較して、使ってみたい特長などは見つかりましたでしょうか。

Windowsで青空文庫フルセットの検索を試してみる

Windows上でも、WSL2 + Ubuntu 22.04 LTSをインストールすればDoqueDB β版を動かせることが確認できました。ただし、製品版相当のテストを行っていないため、全機能を利用できない可能性があることをご了承ください。

β版を入手いただくには、「早期ご紹介ページ」よりユーザー登録をお願いします。Ubuntu上でインストールする際には、お手数ですが、setup.shの38行めを以下のとおり変更してください。OSSとして正式公開される際には修正される予定です。

if [ $normalize == 1 ]; then
 ↓
if [ $normalize -eq 1 ]; then

さらに、青空文庫のデータを自分で取得し、登録することにより、デモサイト相当の検索をローカルPC上で試すことが可能です。関連ドキュメント「使ってみよう」に、青空文庫のデータを取得し、登録する手順を加筆しましたので、ぜひご覧ください。

以下に文書リンクを再掲しておきます。

青空文庫を全文検索しようとする試みは、これまでにもいくつかありました。そのひとつとして、@myokoym さんが「Aozorasearch 青空文庫全文検索」を公開されています。「(お試し)」と書かれていますが、DoqueDBの自然文検索に相当する類似文書検索の機能も提供されているので、いろいろと検索して比較されるのも面白いかと思います。Aozorasearchについては以下の記事をご覧ください。

おわりに

ここまでお読みくださいまして、ありがとうございました。

今回の記事でも簡単に触れていますが、同じように転置索引を用いて全文検索を実装しているデータベースであっても、設計方針には違いがあり、そのことが検索結果に大きな差となって現れることがあります。ご自分の利用するシステムがどのような方向性で設計されており、どのような検索が得意で、どのような検索をあまり得意としないのか、それを見極めることが大切といえるでしょう。

全文検索を主眼とするシステムを構築する際の候補として、DoqueDBを選択肢のひとつに加えていただければ幸いです。それではまたお会いしましょう!

4
3
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
4
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?