正式公開しました (2024年2月16日追記)
当記事をご覧いただきありがとうございます。長らくお待たせいたしましたが、DoqueDBはようやく正式公開を果たすことができました。以下の記事にてWebサイトやGitHubプロジェクトをご案内しております。
DoqueDB:MySQL, PostgreSQLと構文を比較してみる
これ以降の内容は正式公開前のβ版に関するものです。内容は正式版にも当てはまりますが、リンク先は順次公式サイトへと切り替わりますので、ご留意ください。
引き続きDoqueDBの全文検索についての記事でお時間を頂戴いたします。前回の記事はこちらになります。
デモサイトで自然文検索を試そう
上の図は、DoqueDBデモサイトでの検索のようすです。前回は、「使ってみよう」を参照しながら、β版パッケージに付属のサンプルデータをいろいろ検索してみました。青空文庫の作品データの一部を使っていますが、件数が少なかったこともあり、ご自分でお試しいただくには消化不良気味であったかと思います。
今回はDoqueDBのデモサイトで「自然文検索」をお試しいただき、キーワードを限定しない全文検索がどれくらい役立つものなのか、ご覧いただくことにしましょう。デモサイトはこちらからご訪問いただけます。
【おまけ】記事の末尾に、DoqueDB β版をWindowsのWSL2 + Ubuntuにインストールし、青空文庫のデータを自分でダウンロード・登録して、デモサイト相当の検索を行う方法を示しています。お楽しみに!
江戸川乱歩作品の一節を検索する
デモサイトの使い方ページにある検索例、江戸川乱歩の『仮面の恐怖王』冒頭の一節を検索してみましょう。
東京上野公園の不忍池のそばに、ふしぎな建物がたちました。両国のもとの国技館をぐっと小さくしたような、まるい建物で、外がわの壁も、まる屋根も、ぜんぶ、まっ白にぬってあるのです。
実行すると、検索結果の上位50件中、江戸川乱歩作品が24件見つかりました。検索結果の画面ショットおよび適合度、タイトル、著者のリストを以下に示しておきましょう。画面ショットでは検索されたキーワードがハイライトされています。リストでは江戸川乱歩作品が赤字で示されています。適合度を見ると、やはり検索したテキストを含む作品が飛び抜けて高い数値になることがわかります。
検索結果上位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件のリスト)
適合度 | タイトル | 著者 |
---|---|---|
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の自然文検索は、以下のように行われます。
- 入力された検索テキストを形態素解析して検索語の候補を作る。
- 検索語候補を転置索引で個別に検索し、重み付けの情報を得る。
- 重要と判定された検索語を組み合わせて最終的な検索を行う。
今回のケースでは、このような仕組みが検索条件にマッチしており、そのため、より希望に近い検索結果が得られたと言えそうです。
いかがでしょう。ここまでいくつか自然文検索を試してきましたが、従来の製品と比較して、使ってみたい特長などは見つかりましたでしょうか。
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を選択肢のひとつに加えていただければ幸いです。それではまたお会いしましょう!