0
0

DoqueDB:類似文書検索の検索結果を改善する

Last updated at Posted at 2024-09-17

概要:DoqueDBで類似文書検索したものの期待する結果が得られなかったとき、検索結果を改善する2つの方法について解説します。今回はWikipedia日本語版の本文データを対象としています。

おまけMySQLPostgreSQLと全文検索、類似文書検索の性能を比較した記事を、DoqueDB Webサイトに掲載しました。Wikipedia日本語版や青空文庫のデータをローカルに取得して検索する方法についても解説していますので、ぜひご覧ください。

MySQL, PostgreSQLと全文検索性能を比較する [DoqueDB Webサイト]

類似文書検索の結果を改善したい

ご無沙汰しておりました。また皆様とお会いできてうれしく思います。今回は、DoqueDBの大きな武器のひとつ、類似文書検索について、それを便利に使いこなす方法を説明していきましょう。

類似文書検索とは、検索条件として文書を指定することで、その文書に内容が類似した文書を探し出す検索手法です。大量の文書を検索するときにとても役立つ機能ですが、なかなか思うような結果が得られず、どうにかして検索結果を改善したいことがあります。DoqueDBではこのような状況について2種類の対策を用意しています。今回はこれらの対策方法について解説しましょう。検索対象として、Wikipedia日本語版 (2024/7/1時点) の本文データを用いています。

検索結果の改善というのは、ざっくりと以下のようなイメージです。

検索結果改善のイメージ.png

対策1:検索結果の一部をフィードバックする

類似文書検索してみたものの、検索結果の方向性がばらばらで、欲しい結果が飛び飛びにしか得られませんでした。さて、どうしましょうか?

関連語拡張を使う

このようなケースでは、検索結果のうち期待に近いものを検索条件にフィードバックすることで、どのような検索を望んでいるかをシステムに伝え、検索結果を改善することが可能です。DoqueDBでは、このために関連語拡張という機能が用意されています。

まず、Wikipedia日本語版から項目「手塚治虫」の本文を検索してみましょう。結果は適合度順に上位100件を表示するものとします。SQL文は以下のとおりです。

SELECT id, title FROM jawiki
  WHERE content CONTAINS FREETEXT('...項目「手塚治虫」本文...')
  ORDER BY SCORE(content) DESC LIMIT 100;

これを実行すると、以下のような結果が得られました。

類似文書検索の検索結果上位100件 (SQL出力)
{id,title}
{493,手塚治虫}
{1937329,マァチャンの日記帳}
{186289,手塚プロダクション}
{2460119,南部正太郎}
{186827,手塚眞}
{15408,リボンの騎士}
{71355,福井英一}
{2026705,ブラック・ジャック}
{512509,魔神ガロン}
{117599,どろろ}
{38239,ジャングル大帝}
{380155,ネオ・ファウスト}
{97299,まんが道}
{6636,火の鳥 (漫画)}
{183545,馬場のぼる}
{92229,水野英子}
{1316505,ぼくのそんごくう}
{967,萩尾望都}
{658271,新宝島}
{384376,石ノ森章太郎}
{2768697,ブラック・ジャック創作秘話〜手塚治虫の仕事場から〜}
{1655244,辰巳ヨシヒロ}
{4834731,大人漫画}
{2270862,ジュン (漫画)}
{240,浦沢直樹}
{121614,漫画少年}
{931766,酒井七馬}
{84970,三つ目がとおる}
{2725524,東京シャッターガール}
{4900,藤子・F・不二雄}
{2428631,ダスト8}
{4158613,ぱいどん}
{4676707,茨木保}
{34956,PLUTO}
{216248,どついたれ}
{291438,ドン・ドラキュラ}
{764,さいとう・たかを}
{251520,笹川ひろし}
{732746,動物漫画}
{3341702,少年・手塚治虫の宝塚}
{86124,ストーリー漫画}
{136080,ミクロイドS}
{267298,竹内オサム}
{178107,W3事件}
{481,里中満智子}
{2116,鉄腕アトム}
{2232269,壁村耐三}
{58484,COM (雑誌)}
{900145,手塚治虫の作品一覧}
{3472536,人間ども集まれ!}
{2976048,チェイサー (漫画)}
{235455,宝塚市立手塚治虫記念館}
{706294,ブラック・ジャック 危険な賭け}
{1656964,ロストワールド (漫画)}
{213885,化石島}
{2153413,吉本浩二}
{2043,矢口高雄}
{3131096,火の鳥 (1994年の宝塚歌劇)}
{1932255,福元一義}
{4897,藤子不二雄A}
{1013471,ワンサくん}
{4403911,漫画生物学}
{3682808,新世界ルルー}
{3239942,芥真木}
{2071,横山光輝}
{122479,海のトリトン}
{83164,ふしぎなメルモ}
{849460,鉄腕アトム (アニメ第1作)}
{391242,人間昆虫記}
{1342,藤子不二雄}
{2094192,ザ・クレーター}
{1615271,アセチレン・ランプ (手塚治虫)}
{941,永井豪}
{382037,地底国の怪人}
{744630,マンガ少年}
{130203,虫プロダクション}
{64546,長谷邦夫}
{476994,桐木憲一}
{614335,さいふうめい}
{391513,ばるぼら}
{2328,白土三平}
{308679,陽だまりの樹}
{1505729,丸山昭}
{599,楳図かずお}
{3769802,マウリシオ・デ・ソウザ}
{3132396,トイレのピエタ}
{2679277,フィルムは生きている}
{716267,コミックトム}
{148875,バンパイヤ}
{3856773,手塚治虫書店}
{241137,さそうあきら}
{850344,鉄腕アトム (アニメ第2作)}
{455,諸星大二郎}
{24439,みなもと太郎}
{4827583,ロケットくん}
{139647,W3}
{803342,おけさのひょう六}
{15406,ユニコ}
{203071,針すなお}
{1461500,サファイア リボンの騎士}

手塚治虫氏の活動範囲は広く、Wikipediaの項目も多岐にわたりますね。この中で、漫画家としての活動初期に焦点をあてた検索結果を得るため、手塚治虫氏と同じくトキワ荘を活動拠点としていた「水野英子」「石ノ森章太郎」の本文を加味して再検索することにします。SQL文のEXPAND以降が関連語拡張の構文です。92229と384376は「水野英子」「石ノ森章太郎」の項目IDです。

SELECT id, title FROM jawiki
  WHERE content CONTAINS FREETEXT('...項目「手塚治虫」本文...')
  EXPAND (FROM (SELECT content FROM jawiki WHERE id IN (92229, 384376)))
  ORDER BY SCORE(content) DESC LIMIT 100;

当初の検索結果と新たな結果を並べてみましょう。

初期検索結果と関連語拡張による検索結果上位100件
順位 初期検索結果 関連語拡張による検索結果
1 493,手塚治虫 493,手塚治虫
2 1937329,マァチャンの日記帳 92229,水野英子
3 186289,手塚プロダクション 384376,石ノ森章太郎
4 2460119,南部正太郎 121614,漫画少年
5 186827,手塚眞 71355,福井英一
6 15408,リボンの騎士 2270862,ジュン (漫画)
7 71355,福井英一 64546,長谷邦夫
8 2026705,ブラック・ジャック 2026705,ブラック・ジャック
9 512509,魔神ガロン 1316505,ぼくのそんごくう
10 117599,どろろ 58484,COM (雑誌)
11 38239,ジャングル大帝 117599,どろろ
12 380155,ネオ・ファウスト 97299,まんが道
13 97299,まんが道 1937329,マァチャンの日記帳
14 6636,火の鳥 (漫画) 4834731,大人漫画
15 183545,馬場のぼる 967,萩尾望都
16 92229,水野英子 658271,新宝島
17 1316505,ぼくのそんごくう 1505729,丸山昭
18 967,萩尾望都 4897,藤子不二雄A
19 658271,新宝島 2768697,ブラック・ジャック創作
秘話〜手塚治虫の仕事場から〜
20 384376,石ノ森章太郎 38239,ジャングル大帝
21 2768697,ブラック・ジャック創作
秘話〜手塚治虫の仕事場から〜
6636,火の鳥 (漫画)
22 1655244,辰巳ヨシヒロ 240,浦沢直樹
23 4834731,大人漫画 941,永井豪
24 2270862,ジュン (漫画) 64338,トキワ荘
25 240,浦沢直樹 1342,藤子不二雄
26 121614,漫画少年 3239942,芥真木
27 931766,酒井七馬 183545,馬場のぼる
28 84970,三つ目がとおる 744630,マンガ少年
29 2725524,東京シャッターガール 186827,手塚眞
30 4900,藤子・F・不二雄 732746,動物漫画
31 2428631,ダスト8 251520,笹川ひろし
32 4158613,ぱいどん 2460119,南部正太郎
33 4676707,茨木保 4158613,ぱいどん
34 34956,PLUTO 2232269,壁村耐三
35 216248,どついたれ 2043,矢口高雄
36 291438,ドン・ドラキュラ 34956,PLUTO
37 764,さいとう・たかを 476994,桐木憲一
38 251520,笹川ひろし 2153413,吉本浩二
39 732746,動物漫画 764,さいとう・たかを
40 3341702,少年・手塚治虫の宝塚 2976048,チェイサー (漫画)
41 86124,ストーリー漫画 1394959,西谷祥子
42 136080,ミクロイドS 931766,酒井七馬
43 267298,竹内オサム 24439,みなもと太郎
44 178107,W3事件 213885,化石島
45 481,里中満智子 4676707,茨木保
46 2116,鉄腕アトム 4900,藤子・F・不二雄
47 2232269,壁村耐三 86124,ストーリー漫画
48 58484,COM (雑誌) 186289,手塚プロダクション
49 900145,手塚治虫の作品一覧 2071,横山光輝
50 3472536,人間ども集まれ! 1656964,ロストワールド (漫画)
51 2976048,チェイサー (漫画) 3682808,新世界ルルー
52 235455,宝塚市立手塚治虫記念館 1140618,日本の漫画の歴史
53 706294,ブラック・ジャック
危険な賭け
15408,リボンの騎士
54 1656964,ロストワールド (漫画) 481,里中満智子
55 213885,化石島 1932255,福元一義
56 2153413,吉本浩二 1869724,夏目房之介
57 2043,矢口高雄 84970,三つ目がとおる
58 3131096,火の鳥 (1994年の宝塚歌劇) 1655244,辰巳ヨシヒロ
59 1932255,福元一義 3472536,人間ども集まれ!
60 4897,藤子不二雄A 4764634,これ描いて死ね
61 1013471,ワンサくん 480159,少年キング
62 4403911,漫画生物学 380155,ネオ・ファウスト
63 3682808,新世界ルルー 130203,虫プロダクション
64 3239942,芥真木 267298,竹内オサム
65 2071,横山光輝 44870,岡田史子
66 122479,海のトリトン 136080,ミクロイドS
67 83164,ふしぎなメルモ 1212706,よこたとくお
68 849460,鉄腕アトム (アニメ第1作) 291438,ドン・ドラキュラ
69 391242,人間昆虫記 2725524,東京シャッターガール
70 1342,藤子不二雄 599,楳図かずお
71 2094192,ザ・クレーター 3410404,西遊記 (1960年の映画)
72 1615271,アセチレン・ランプ
(手塚治虫)
1615271,アセチレン・ランプ
(手塚治虫)
73 941,永井豪 3132396,トイレのピエタ
74 382037,地底国の怪人 1395,松本大洋
75 744630,マンガ少年 2328,白土三平
76 130203,虫プロダクション 849460,鉄腕アトム (アニメ第1作)
77 64546,長谷邦夫 4785459,藤子不二雄の読切一覧
78 476994,桐木憲一 285066,永島慎二
79 614335,さいふうめい 203071,針すなお
80 391513,ばるぼら 2116,鉄腕アトム
81 2328,白土三平 178107,W3事件
82 308679,陽だまりの樹 455,諸星大二郎
83 1505729,丸山昭 3769802,マウリシオ・デ・ソウザ
84 599,楳図かずお 2428631,ダスト8
85 3769802,マウリシオ・デ・ソウザ 687,杉浦茂
86 3132396,トイレのピエタ 512509,魔神ガロン
87 2679277,フィルムは生きている 900145,手塚治虫の作品一覧
88 716267,コミックトム 58556,寺田ヒロオ
89 148875,バンパイヤ 216248,どついたれ
90 3856773,手塚治虫書店 12332,岡野玲子
91 241137,さそうあきら 2679277,フィルムは生きている
92 850344,鉄腕アトム (アニメ第2作) 610,大友克洋
93 455,諸星大二郎 4154,週刊少年サンデー
94 24439,みなもと太郎 4152,週刊少年マガジン
95 4827583,ロケットくん 1013471,ワンサくん
96 139647,W3 1261,吾妻ひでお
97 803342,おけさのひょう六 115097,うしおそうじ
98 15406,ユニコ 188003,ジョージ秋山
99 203071,針すなお 2272419,大和正樹
100 1461500,サファイア リボンの騎士 122479,海のトリトン

比較してみると、トキワ荘で活動していたほかの漫画家の方々や、その活動舞台であった雑誌名、さらにトキワ荘そのものの検索順位が上位に移動したことがわかります。

 水野英子:16位 → 2位
 石ノ森章太郎:20位 → 3位
 漫画少年:26位 → 4位
 長谷邦夫:77位 → 7位
 COM(雑誌):48位 → 10位
 トキワ荘:圏外 → 24位
 藤子不二雄:70位 → 25位
 寺田ヒロオ:圏外 → 88位

対照的に、映像関係の項目が下位に移動していました。

 手塚プロダクション:3位 → 48位
 手塚眞:5位 → 29位

このように、検索条件を追加して再検索することで、より期待に近い結果が得られることがわかりました。関連語拡張がどのような場面で役立つか、ご理解いただけたでしょうか。

検索に使われた語を確認する

ところで、元の類似文書検索と関連語拡張による検索で、実際にどのような検索語が使われたかは、WORD関数で確認できます。

SQL> SELECT WORD(content) FROM jawiki
  WHERE content CONTAINS FREETEXT('...項目「手塚治虫」本文...');
{word(content)}
{'受け' language '' category 'Helpful' scale 0.98 df 259023}
{'治虫' language '' category 'Helpful' scale 0.98 df 1249}
{'大坂' language '' category 'Helpful' scale 0.98 df 76705}
{'手塚 治虫' language '' category 'Helpful' scale 0.29 df 1248}
{'手塚' language '' category 'Helpful' scale 1.00 df 2069}
{'連載' language '' category 'Helpful' scale 0.99 df 30106}
{'漫画' language '' category 'Helpful' scale 1.00 df 40557}
{'作品' language '' category 'Helpful' scale 0.99 df 155360}
{'漫画 家' language '' category 'Helpful' scale 0.29 df 12006}
{'宝塚' language '' category 'Helpful' scale 0.98 df 5527}

SQL> SELECT WORD(content) FROM jawiki
  WHERE content CONTAINS FREETEXT('...項目「手塚治虫」本文...')
  EXPAND (FROM (
    SELECT content FROM jawiki WHERE id IN (92229, 384376)));
{word(content)}
{'受け' language '' category 'Helpful' scale 0.91 df 259023}
{'治虫' language '' category 'Helpful' scale 0.96 df 1249}
{'大坂' language '' category 'Helpful' scale 0.50 df 76705}
{'手塚 治虫' language '' category 'Helpful' scale 0.96 df 1248}
{'手塚' language '' category 'Helpful' scale 0.97 df 2069}
{'連載' language '' category 'Helpful' scale 0.91 df 30106}
{'漫画' language '' category 'Helpful' scale 0.99 df 40557}
{'作品' language '' category 'Helpful' scale 0.98 df 155360}
{'漫画 家' language '' category 'Helpful' scale 0.97 df 12006}
{'宝塚' language '' category 'Helpful' scale 0.50 df 5527}
{'トキワ' language '' category 'HelpfulRelated' scale 0.19 df 282}
{'不二夫' language '' category 'HelpfulRelated' scale 0.18 df 418}
{'石森' language '' category 'HelpfulRelated' scale 0.20 df 502}
{'章太郎' language '' category 'HelpfulRelated' scale 0.19 df 702}

関連語拡張によって追加された検索語 (categoryがHelpfulRelatedの語) は「トキワ」「不二夫」「石森」「章太郎」の4語だけでした。いずれも DF値 (Document Frequency=文書頻度, その語を含む文書数) が小さく、少ない語数でも検索に与える影響が大きいことがわかります。(とはいえ、検索語に出てこない水野英子氏の項目が2位に上昇するのは不思議なものですね。

Groongaと比べてみました

参考までに、MySQL+MroongaPostgreSQL+PGroonga で「手塚治虫」を類似文書検索した結果をDoqueDBの結果と並べてみましょう。測定条件については前掲の記事「MySQL, PostgreSQLと全文検索性能を比較する」をご覧ください。同じ類似文書検索とはいえ、見つかる結果はそれなりに異なります。DoqueDBはなかなか優秀だと思うのですが、ひいき目でしょうか?

DoqueDB, MySQL+Mroonga, PostgreSQL+PGroongaの類似文書検索結果
順位 DoqueDB (Bigram) MySQL+Mroonga, PostgreSQL+PGroonga
TokenBigram TokenMecab
1 手塚治虫 手塚治虫 手塚治虫
2 マァチャンの日記帳 明治節 ごちそうさん (2013年のテレビドラマ)
3 手塚プロダクション 速読術 ネオ・ファウスト
4 南部正太郎 新宝島 もんじゅ訴訟
5 手塚眞 ごちそうさん (2013年のテレビドラマ) マァチャンの日記帳
6 リボンの騎士 中村書店 リヒャルト・ゾルゲ
7 福井英一 医政局 感傷旅行
8 ブラック・ジャック 鉄火 ギルガメシュ
9 魔神ガロン 福翁百話 チャールズ・チャップリン
10 どろろ 妲己のお百 ルードウィヒ・B
11 ジャングル大帝 トキワ荘 オサムシ
12 ネオ・ファウスト アンチヒーロー (テレビドラマ) 近視
13 まんが道 壁村耐三 ギルガメシュ叙事詩
14 火の鳥 (漫画) 少女漫画 エディプスコンプレックス
15 馬場のぼる ジャングル大帝 バンパイヤ
16 水野英子 陽だまりの樹 ゾルゲ諜報団
17 ぼくのそんごくう 赤塚不二夫 エンキドゥ
18 萩尾望都 木久蔵ラーメン 新宝島 (曲)
19 新宝島 種痘 増元るみ子
20 石ノ森章太郎 桂春団治 (3代目) 鉄火
21 ブラック・ジャック創作秘話〜手塚治虫の仕事場から〜 手塚治虫文化賞 ユニコ
22 辰巳ヨシヒロ ゲゲゲの鬼太郎 ジェットエンジン
23 大人漫画 ブラック・ジャック ゲゲゲの鬼太郎
24 ジュン (漫画) 京阪本線 路地裏ナキムシ楽団
25 浦沢直樹 どろろ 新宝島
26 漫画少年 井上成美 グリンゴ
27 酒井七馬 新宝島 (曲) 京阪本線
28 三つ目がとおる 桂春団治 (初代) 種痘
29 東京シャッターガール 林家木久扇 天使の玉ちゃん
30 藤子・F・不二雄 てなもんや三度笠 (映画) 天津乙女
31 ダスト8 てなもんや幽霊道中 フライシャー・スタジオ
32 ぱいどん 近視 少女漫画
33 茨木保 ぱいどん 西遊記の成立史
34 PLUTO 種痘所 赤塚不二夫
35 どついたれ 日本の漫画の歴史 手塚治虫文化賞
36 ドン・ドラキュラ エロ劇画誌 瞬きもせず (漫画)
37 さいとう・たかを 指定金融機関 ヒゲオヤジ
38 笹川ひろし 森安なおや 鉄火巻
39 動物漫画 年賀状 燃焼器
40 少年・手塚治虫の宝塚 藤子・F・不二雄 シャマシュ
41 ストーリー漫画 手塚治虫の作品一覧 近親相姦
42 ミクロイドS レオン・クロワザ 阪急バス宝塚営業所
43 竹内オサム 夢幻紳士 石井花子
44 W3事件 つげ義春 つげ義春
45 里中満智子 転失気 フンババ
46 鉄腕アトム 虫プロダクション ルナパーク (大阪)
47 壁村耐三 水木しげる ニンスン
48 COM (雑誌) 若おかみは小学生! (映画) トプシー (象)
49 手塚治虫の作品一覧 梶井基次郎 トキワ荘
50 人間ども集まれ! 手塚光照 タニシ
51 チェイサー (漫画) 天津乙女 ルナパーク
52 宝塚市立手塚治虫記念館 長谷邦夫 勝木敏之
53 ブラック・ジャック 危険な賭け 大人漫画 エロ劇画誌
54 ロストワールド (漫画) 奇形精子症 東京ヤクルトスワローズ
55 化石島 加藤正世 パラパラ
56 吉本浩二 火星博士 ねずみ男
57 矢口高雄 酒井七馬 分島花音
58 火の鳥 (1994年の宝塚歌劇) 感傷旅行 石ノ森章太郎
59 福元一義 福澤諭吉 劉聡
60 藤子不二雄A 青木鶴子 年賀状
61 ワンサくん 劇画 鬼太郎
62 漫画生物学 マァチャンの日記帳 水滸伝の成立史
63 新世界ルルー 幽霊男 摠禅寺 ※1
64 芥真木 勝木敏之 JUMPing CAR ※1
65 横山光輝 西遊記の成立史 申師任堂 ※1
66 海のトリトン 水滸伝の成立史 コミックトム
67 ふしぎなメルモ 石ノ森章太郎 酒井七馬
68 鉄腕アトム (アニメ第1作) 杉浦茂 せむしの仔馬
69 人間昆虫記 てなもんや東海道 長谷邦夫
70 藤子不二雄 とろろ昆布 医学を基礎とするまちづくり
71 ザ・クレーター 近畿方言 アトムズマーチ
72 アセチレン・ランプ (手塚治虫) テンポラリー・クラウン ゴミムシ
73 永井豪 漫画評論 藤子・F・不二雄
74 地底国の怪人 昆蟲姦察 鷲ノ繪
75 マンガ少年 牛首村 ケモナー
76 虫プロダクション 福井英一 トランストリップ (2013年の映画)
77 長谷邦夫 ストーリー漫画 第二次世界大戦
78 桐木憲一 さいとう・たかを 性教育
79 さいふうめい 手塚プロダクション 浅めし食堂
80 ばるぼら 箕作阮甫 水木しげる
81 白土三平 劉粲 ゾルゲ事件
82 陽だまりの樹 北隆館 林家三平 (初代)
83 丸山昭 課試 快傑ハリマオ
84 楳図かずお 阪急バス宝塚営業所 1965年のサンケイスワローズ
85 マウリシオ・デ・ソウザ 非定型精神病 天然痘
86 トイレのピエタ 手塚眞 天の牡牛
87 フィルムは生きている 大槻俊斎 千夜一夜物語のあらすじ
88 コミックトム 円谷英二 劉粲
89 バンパイヤ 秋田騒動 東映アニメーション
90 手塚治虫書店 開明墨汁 日本の漫画の歴史
91 さそうあきら 林家三平 (初代) 悪書追放運動
92 鉄腕アトム (アニメ第2作) 桂春団治 (2代目) 伊達政宗
93 諸星大二郎 緑色のベレー帽 新世界 (大阪)
94 みなもと太郎 手塚良仙 リアナ・ワーナー失踪事件
95 ロケットくん 東京大空襲 三遠南信自動車道
96 W3 東京電力 (1925-1928) 笠原良策
97 おけさのひょう六 スーパーワイド 谷豊
98 ユニコ 新・仮面ライダー 眼鏡
99 針すなお 漫画少年 おしりかじり虫
100 サファイア リボンの騎士 永井豪 ルパン三世 ハリマオの財宝を追え!!
※1 PostgreSQL+PGroongaでは申師任堂が63位に上がり、摠禅寺とJUMPing CARが それぞれ順位を1つ下げます。

対策2:初期検索の精密度を上げる

対策1では検索結果をフィードバックすることで検索精度を改善する方法を示しましたが、対話的操作に頼らずに、初期検索そのものの精度を上げる方向はないのでしょうか?

検索語数の上限を増やす

上で見てきたとおり、検索対象テキストからは10語の検索語しか生成されていません。類似文書検索の精度はそれである程度カバーできていることは確かですが、対象テキストに特徴的な語が数多く含まれている場合、検索語数の上限を増やすことで検索の精密度を上げられそうです。試してみましょう。

Wikipedia日本語版から項目「ボーイング727」の本文で類似文書検索します。727は機体尾部に3発のエンジンをもつT字尾翼機です。美しい航空機ですね。検索に使うSQLは以下のとおりです。

SELECT id, title FROM jawiki
  WHERE content CONTAINS FREETEXT('...項目「ボーイング727」本文...')
  ORDER BY SCORE(content) DESC LIMIT 100;

検索語数の上限をデフォルトの10から30に変更するには、CONTAINS FREETEXTにオプションWORD LIMIT 30を指定します。

SELECT id, title FROM jawiki
  WHERE content CONTAINS FREETEXT('...項目「ボーイング727」本文...' WORD LIMIT 30)
  ORDER BY SCORE(content) DESC LIMIT 100;

検索語数の上限がそれぞれ10と30のとき、類似文書検索結果は以下のようになりました。

検索語数上限が10と30のときの類似文書検索結果
順位 検索語数上限10 検索語数上限30
1 153678,ボーイング727 153678,ボーイング727
2 217704,ダグラス DC-8 217704,ダグラス DC-8
3 226711,ボーイング707 226711,ボーイング707
4 217710,コンベア880 160435,ボーイング737
5 160435,ボーイング737 763349,ボーイング747
6 543320,タロム航空 217710,コンベア880
7 4419842,トライジェット 238405,ボーイング717
8 870584,マクドネル・ダグラス MD-80 154934,パンアメリカン航空
9 238405,ボーイング717 169037,ロッキード L-1011 トライスター
10 166378,デ・ハビランド DH.106 コメット 169751,ボーイング757
11 34172,ボーイング 166378,デ・ハビランド DH.106 コメット
12 169751,ボーイング757 513983,ブラニフ航空
13 4419974,ツインエンジンジェット 231250,ロッキード コンステレーション
14 339588,ダグラス DC-7 34172,ボーイング
15 4422525,クワッドジェット 227538,ボーイング377
16 301707,Il-62 (航空機) 339588,ダグラス DC-7
17 231250,ロッキード コンステレーション 1665702,ボーイング747-SP
18 4426751,ジェットエイジ 4422525,クワッドジェット
19 425635,Y-10 (航空機) 1478929,ファン・トリップ
20 113646,マクドネル・ダグラス DC-9 1926040,日本航空の歴史
21 154934,パンアメリカン航空 870584,マクドネル・ダグラス MD-80
22 428342,ロッキード L-188 155998,マクドネル・ダグラス DC-10
23 441269,ホーカー・シドレー トライデント 96135,マクドネル・ダグラス MD-11
24 466517,ビッカース VC10 36796,ボーイング777
25 80372,旅客機 428342,ロッキード L-188
26 822198,ワールド・エアウェイズ 822198,ワールド・エアウェイズ
27 3212333,エアステア 336907,ダグラス DC-6
28 898725,ボーイングとエアバス 369583,英国海外航空
29 227538,ボーイング377 113646,マクドネル・ダグラス DC-9
30 3984712,環境制御システム (航空機) 687667,コンゴーニャス空港
31 622031,ボーイング367-80 80372,旅客機
32 1478929,ファン・トリップ 159982,ボーイング767
33 52969,マクドネル・ダグラス 160016,ヴァリグ・ブラジル航空
34 169037,ロッキード L-1011 トライスター 366874,全日空の航空事故およびインシデント
35 21646,ジェット機 466517,ビッカース VC10
36 1244392,遠東航空128便ハイジャック事件 29428,エアバスA320
37 44505,機体記号 1609659,パシフィック・サウスウエスト航空
38 808585,旅客機のコックピット 164017,エアバスA310
39 169070,Tu-154 (航空機) 74821,キャセイパシフィック航空
40 539860,1990年広州白雲空港衝突事故 2374394,ボーイング737 クラシック
41 29428,エアバスA320 4426751,ジェットエイジ
42 687667,コンゴーニャス空港 470068,ブリストル ブリタニア
43 763349,ボーイング747 52969,マクドネル・ダグラス
44 1573732,アメリカン航空11便テロ事件 217873,トランス・ワールド航空
45 172960,ブリティッシュ・エアウェイズ 4605556,レゾリュート湾空港
46 155998,マクドネル・ダグラス DC-10 1647242,トランス・ブラジル航空
47 86243,客室乗務員 172960,ブリティッシュ・エアウェイズ
48 336907,ダグラス DC-6 150244,エアバスA300
49 513983,ブラニフ航空 764319,ボーイング747-400
50 756590,補助動力装置 543320,タロム航空
51 94521,エアバス 27971,日本航空の航空事故およびインシデント
52 1926040,日本航空の歴史 622031,ボーイング367-80
53 470068,ブリストル ブリタニア 86243,客室乗務員
54 96135,マクドネル・ダグラス MD-11 309617,格安航空会社
55 135928,ツポレフ 4419974,ツインエンジンジェット
56 1025789,PFLP旅客機同時ハイジャック事件 445132,シュド・カラベル
57 919154,コメット連続墜落事故 3191346,マクドネル・ダグラス MD-90
58 487680,全日空羽田沖墜落事故 368514,ダグラス DC-4
59 268603,ボーイング2707 251705,ATA航空
60 420738,Tu-104 (航空機) 4419842,トライジェット
61 860595,ビジネスジェット 94521,エアバス
62 369583,英国海外航空 180001,ダグラス DC-3
63 460315,Yak-40 (航空機) 547115,テッド・スティーブンス・アンカレッジ国際空港
64 4683,アメリカ同時多発テロ事件 1907149,ボーイング747-300
65 367630,ボンバルディア CRJ 444404,アエロメヒコ航空
66 445132,シュド・カラベル 37094,アメリカン航空
67 4605556,レゾリュート湾空港 1768496,エアバスA300-600
68 269264,超音速輸送機 420738,Tu-104 (航空機)
69 1768496,エアバスA300-600 635159,チャイナエアラインの航空事故およびインシデント
70 159982,ボーイング767 1498513,政府専用機
71 1498513,政府専用機 919154,コメット連続墜落事故
72 1087227,TAM航空3054便オーバーラン事故 164372,ビッカース バイカウント
73 164372,ビッカース バイカウント 367630,ボンバルディア CRJ
74 471215,ダッソー メルキュール 487680,全日空羽田沖墜落事故
75 3227985,ボーイング737 ネクストジェネレーション 54054,エアフォースワン
76 20601,YS-11 471215,ダッソー メルキュール
77 2037401,機体 3602749,100人以上が死亡した航空事故および事件の一覧
78 669443,ボーイング747-8 60306,エアバスA321
79 3627100,ボーイング797 311435,イースタン航空
80 164017,エアバスA310 1025789,PFLP旅客機同時ハイジャック事件
81 538992,Mitsubishi SpaceJet 579907,テクニカルランディング
82 69016,ソニック・クルーザー 2658791,日本航空の運航機材
83 150244,エアバスA300 268603,ボーイング2707
84 3191346,マクドネル・ダグラス MD-90 301707,Il-62 (航空機)
85 295849,YX 570138,英国海外航空機空中分解事故
86 60308,エアバスA319 664223,KC-135 (航空機)
87 6987,コンコルド 94388,日本国政府専用機
88 3471818,フライ・ブリティッシュ政策 6987,コンコルド
89 2374394,ボーイング737 クラシック 20601,YS-11
90 367579,エンブラエル E-Jet 150526,エアバスA330
91 295856,YXX 137443,カンタス航空
92 94388,日本国政府専用機 205654,イラン航空
93 2597983,ボーイング737MAX 521895,グアルーリョス国際空港
94 178223,Tu-144 (航空機) 394976,エコノミークラス
95 914777,モハーヴェ空港 717307,大韓航空の航空事故およびインシデント
96 3602749,100人以上が死亡した航空事故および事件の一覧 3984712,環境制御システム (航空機)
97 43342,ハイジャック 1974853,ユナイテッド航空
98 812468,燃料投棄 425635,Y-10 (航空機)
99 1609659,パシフィック・サウスウエスト航空 1096808,サントス・ドゥモン空港
100 36796,ボーイング777 169070,Tu-154 (航空機)

比較すると、ボーイング社の機種名が軒並み上位に移動したことがわかります。

 ボーイング707:3位 → 3位 (変わらず)
 ボーイング737:5位 → 4位
 ボーイング747:43位 → 5位
 ボーイング717:9位 → 7位
 ボーイング757:12位 → 10位
 ボーイング377:29位 → 15位
 ボーイング747-SP:圏外 → 17位
 ボーイング777:100位 → 24位
 ボーイング767:70位 → 32位

これでわかるのは、検索語数の上限を増やすと、内容により多くの共通部分をもつ検索結果が選ばれやすくなるということです。類似度の高い文書が数多くあるときには、このようなやり方が有効です。

検索に使われた語を確認する

こちらについても、実際に使われた検索語を確認してみましょう。上限変更により削除された検索語はなく、追加のみ行われたことがわかります。

検索語数上限10, 30のときの検索語 (language, categoryを省略)
No. 上限10のときの検索語 上限30のときの検索語
1 {'旅客' scale 0.96 df 20441} {'日 本国' scale 0.27 df 35127}
2 {'ボウイング 707' scale 0.28 df 250} {'字 尾翼' scale 0.27 df 116}
3 {'旅客 機' scale 0.29 df 2101} {'ボウイング 社' scale 0.27 df 504}
4 {'ボウイング 727' scale 0.28 df 230} {'事故' scale 0.94 df 31781}
5 {'エンジン' scale 0.96 df 23335} {'コンベア 880' scale 0.27 df 55}
6 {'ジエツト' scale 0.96 df 8986} {'路線' scale 0.94 df 46630}
7 {'ボウイング' scale 0.98 df 2548} {'dc -' scale 0.28 df 859}
8 {'ハイジヤツク' scale 0.95 df 765} {'旅客 機' scale 0.29 df 2101}
9 {'航空' scale 0.98 df 33092} {'ダグラス dc' scale 0.27 df 163}
10 {'ジエツト 旅客' scale 0.28 df 346} {'707' scale 0.93 df 774}
11 {'事件' scale 0.94 df 60440}
12 {'100 型' scale 0.28 df 207}
13 {'100' scale 0.95 df 90552}
14 {'ダグラス' scale 0.92 df 4328}
15 {'ボウイング 707' scale 0.28 df 250}
16 {'ボウイング' scale 0.98 df 2548}
17 {'エンジン' scale 0.96 df 23335}
18 {'200' scale 0.95 df 44313}
19 {'航空' scale 0.98 df 33092}
20 {'- 100' scale 0.28 df 1889}
21 {'ハイジヤツク' scale 0.95 df 765}
22 {'ボウイング 727' scale 0.28 df 230}
23 {'日本' scale 0.94 df 530076}
24 {'ジエツト' scale 0.96 df 8986}
25 {'200 型' scale 0.28 df 194}
26 {'ジエツト 旅客' scale 0.28 df 346}
27 {'- 200' scale 0.28 df 1023}
28 {'年代' scale 0.95 df 126073}
29 {'旅客' scale 0.96 df 20441}
30 {'航空 会社' scale 0.27 df 3666}

なお、関連語拡張でも、追加される検索語の上限はデフォルトで10です。関連語拡張では必ずしも上限まで検索語が追加されるわけではありませんが、こちらもLIMIT指定で上限を変更できます。

SELECT id, title FROM jawiki
  WHERE content CONTAINS FREETEXT('...項目「手塚治虫」本文...' WORD LIMIT 30
  EXPAND (FROM (SELECT content FROM jawiki WHERE id IN (92229, 384376)) LIMIT 30)
  ORDER BY SCORE(content) DESC LIMIT 100;

どう使い分ければいいの?

類似文書検索の結果を改善する方法として、2つの手法を説明してきました。これらはどのように使い分ければよいのでしょうか?それぞれのメリットをもう一度整理してみます。

共通:検索結果の順位が入れ替わります
どちらの手法でも、検索語の基本部分は変化しません。したがって、当初検索された結果は変更後の結果にも含まれます。変化するのは順位だけ、ということになります。

関連語拡張:別の観点を加味します
関連語拡張では、当初の検索テキストに含まれなかった検索語が追加されることがあります。 これにより、検索結果に新たな文書が加わったり、あるいは特定範囲の検索結果がより強調される結果になります。

検索語数上限変更:類似度をより精密に測ります
検索語数の上限を増やすと、元の検索テキストと類似度の高い文書がより強調され、検索結果の上位に現れることになります。

改善のようすを図にすると、おおまかに以下のようになります。

改善方法の使い分け.png

2つの改善手法は排他的ではないため、組み合わせて利用することもできます。注意しなければならないのは、いずれの手法も検索速度に大きく影響するということです。したがって、必要な場面を絞って実施するようにしてください。関連語拡張は対話的に実施するものなので、実施するかどうかの選択は容易ですが、初期検索語数の拡大は無条件に適用されることになるため、検索精度が必要なケースをよく検討してご利用ください。

おわりに

今回も長々とお付き合いいただきありがとうございました。類似文書検索結果の改善という、ほかではあまり取り上げられることのない、ある意味重箱の隅をつつくようなテーマについて説明してきました。ピンポイントな話題ではありますが、ご自身の課題解決にお役立ていただけましたら幸いです。

全文検索エンジンGroongaの登場以降、データベースでの日本語全文検索・類似文書検索も、ある意味あって当然の機能として語られることが増えてきたように思います。とはいうものの、競合なくして今後の進化は期待できません。DoqueDBは、日本語での検索機能に新たな切り口を加えることで、この分野にさらなる発展の機縁をもたらしたいと考えています。皆様からのご支援をよろしくお願いいたします。

よろしければDoqueDBのWebサイトにもご訪問ください。

www.doquedb.ricoh.co.jp [DoqueDB Webサイト]

最後に、これまでの記事のリンクを再掲しておきます。それではまたお会いしましょう!

第1回:DoqueDB:もうひとつの全文検索データベース
第2回:DoqueDB:デモサイトで青空文庫を検索しよう
第3回:DoqueDB:MySQL, PostgreSQLと構文を比較してみる
第4回:DoqueDB:MySQL, PostgreSQLと正規化を比較してみる
第5回:DoqueDB:Sudachi辞書で同義語検索しよう

0
0
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
0
0