INFOPRO-OUG
ゆるふわ検索エンジン
解説資料
2022年7月8日（金）14:05～14:35
INFOSTA OUG ライフサイエンス分科会
株式会社エムエムツインズ 田邊 稔

ゆるふわ検索エンジンの基本処理フロー① 検索テキストを１つの文書と見なし、形態素解析を行い、全単語数に占める各単語の割合（TF値）を計算する② TF値を使ってベクトル計算を行いTF-IDF値を算出し、次元（単語）と次元値（スコア）からその文書の特徴を示す上位ｎ個の単語を抽出③ 上位ｎ個の単語を使って文書を検索し、単語ｎ個のうち１個でもヒットすればその文書を選定対象とする④ 選定対象となった文書についてベクトル計算を行い、TF-IDF値を算出す
る⑤ 検索テキスト文書（1）と選定対象となった文書（n）の間で類似度（距離）を計算を行う⑥ 検索テキスト文書と距離が近い文書順にソートして返す※現在のところ、文書種別や特定の単語にウエイト付けはしていない

参考）ベクトル空間法による検索（１／４）• TF-IDF ＝ TF（単語の出現頻度）＊ IDF（各単語のレア度）• つまり、｢その単語がよく出現するほど｣、｢その単語がレアなほど｣大きい値を示すものとなります。この計算を ｢各文書の各単語ごと｣に行うことで、文書の特徴を判別し易くします。TF-IDF計算で求めた特徴（量）は ｢特徴ベクトル｣ とも呼ばれています。

参考）ベクトル空間法による検索（２／４）• 文書をTF-IDFによってベクトル化したものとする。
• ベクトル化された文書との照合を行うためには、検索文字列もベクトル化する必要がある。検索文字列を一つの文書とみなすことで、前述の計算式を適用してベクトル化することができる。
• これによって、検索対象の文書群も検索文字列も同じ多次元空間（次元数は、全単語の数）上のベクトルとして表現される。
• あとはベクトル同士の比較を行う。
• ベクトル間の類似度は、ベクトル間の角度の小さい（ベクトルが近い）方が類似度が大きいものとする。

参考）ベクトル空間法による検索（３／４）
例えば次のような３つのベクトルを考えてみる。

•角度αが角度βより小さいので、文書Aに近いのは文書Bということがわかる。
•実際には、ベクトル間の角度を計測する必要はない。
•cos類似度（コサイン類似度）を用いて、角度が小さいほど類似度が大きな値になるように計算を行う。

参考）ベクトル空間法による検索（４／４）※「a・b」はベクトルAとBの内積、||a||はベクトルaの大きさ•検索文とすべての文書の類似度を計算し、その類似度の大きな順に検索結果とする。
•すべての文書に対して、この計算式をそのまま適用すると、検索結果を得るまでの時間が大きくなる。実際には、様々な工夫を凝らすことで、検索時の計算量を減らす。例えば、文書のベクトルの大きさは、検索文に関係なく事前に計算できるので、その値を保持しておけば、検索のたびごとに計算する必要はない。

ベクトル計算を単純化してみる（１／６）•文書A： ‘オロパタジン，オロパタジン，オロパタジン，投与，塩酸'•文書B： ‘オロパタジン，皮膚炎，皮膚炎，アレルゲン'•文書C： ‘オロパタジン，酸化鉄，アレルゲン'
まず表1では、全文書に含まれる全ての単語を重複なく列に取り、各文書（A／B／C）を行に取り、各セルにその単語の出現回数を記載した。
＼オロパタジン

塩酸

アレルゲン

投与

酸化鉄皮膚炎文書Aでの出現回数

310100

文書Bでの出現回数

101002

文書Cでの出現回数

101010

表1 各文書における各単語の出現回数（BoW：Bag of Words）

ベクトル計算を単純化してみる（２／６）
・表1のデータを基にtf値を計算する。各文書（例：「文書A」）における「ある単語」（例：「オロパタジン」）の出現回数（例：3回）を、全文書に含まれる全ての単語の数（例：表1の列数である5列）で割ればよい。3÷5＝0.6となる。
・同様にして全ての計算を行ったのが表2である。表2の「文書A」行の「オロパタジン」列を見ると、確かに0.60という数値が記載されている。
＼オロパタジン

塩酸

アレルゲン投与

酸化鉄皮膚炎文書Aでのtf値

0.600.2000.2000

文書Bでのtf値

0.2500.25000.50

文書Cでのtf値

0.3300.33

00.330

表2 各文書における各単語の出現頻度（tf：term frequency）

ベクトル計算を単純化してみる（３／６）
次にidf値を計算する。計算の前提として、「ある単語」が含まれる文書の数を表3にまとめる。
＼オロパタジン

塩酸

アレルゲン投与

酸化鉄皮膚炎全文書（3個）中での文書の数

312111

表3 各単語を含む文書の数

ベクトル計算を単純化してみる（４／６）
・表3を基に、全文書の数（例：表2の行数である3行）を、「ある単語」（例：「オロパタジン」）が含まれる文書の数（例：文書A／B／Cの3個）で割り、その計算値の自然対数（log）値を算出する。
log(3÷3)＝0となる。「アレルゲン」は2つの文書に含まれるのでlog(3÷2)＝0.41となり、「皮膚炎」は1つの文書に含まれるのでlog(3÷1)＝1.1となる。
・同様にして全ての計算を行ったのが表4である。表4の「皮膚炎」列を見ると、確かに1.10という数値が記載されている。

＼オロパタジン

塩酸

アレルゲン

投与

酸化鉄

皮膚炎

idf値

01.10

0.41

1.10

1.101.10

表4 各単語の文書間でのレア度（idf：inverse document frequency）

ベクトル計算を単純化してみる（５／６）
・最後に、tf値（表2）とidf値（表4）を掛け算すればよい。文書Aの「オロパタジン」は0.60×0＝0となり、文書Bの「皮膚炎」は0.50×1.10＝0.55となる。
・同様にして全ての計算を行ったのが表5である。表5の「文書B」行の「皮膚炎」列を見ると、確かに0.55という数値が記載されている。
＼オロパタジン

塩酸

アレルゲン

投与

酸化鉄

皮膚炎

文書Aでのtfidf値

00.2200.2200

文書Bでのtfidf値

000.10000.55

文書Cでのtfidf値

000.1400.370

表5 各文書における各単語の重要度（tf-idf）ベクトル計算を単純化してみる（６／６）
以上でtf-idfの計算は完了となる。文書A／B／Cに対する3つの特徴ベクトルが作成されている（表5の3行）。この3つを表の行と列に取り、各行と各列で示す2つのベクトル同士のコサイン類似度の値を表の各セルに記載したのが表6である。
＼文書A

文書B

文書C

文書A

100

文書B

010.06

文書C00.061

表6 各文書の特徴ベクトル同士で計算したコサイン類似度の一覧表

例えば表6の「文書B」行を見ると、•「文書B」と「文書A」の類似度は0（無関係）•「文書B」と「文書B」の類似度は同じなので1（同じ） ★原則、検索結果から除外する•「文書B」と「文書C」の類似度は0.06（わずかに類似）となっている。

単純化したベクトル計算結果の考察
 3文書ともに出現している単語（「オロパタジン」）は，文書の特徴を表しているとはいえないと評価されたことを表している．
 逆に「皮膚炎」のTF-IDF値は0.55となっているため，文書Bにのみ出現している「皮膚炎」は文書Aの他の単語「投与」や文書Cの他の単語「酸化鉄」と比較して文書の特徴をよく表している
 文書Aと同様に，文書B、C共に出現している「オロパタジン」についてはTF-IDF値が0.0になっているため，文書の特徴を表しているとはいえないと評価されている．
 一方，「皮膚炎」はどちらも文書Bにしか出現しないため，TF-IDF値は0.55と大きくなっている．ここで注目してほしいのは，「皮膚炎」のTF-IDF値(0.55)と比べて，「酸化鉄」のTF-IDF値(0.37)が低くなっている点である．
これは一方にしか出現しない単語が複数ある場合，出現頻度が高い方が文書の特徴をよく表していると評価されたことを表している．
 このように，TF-IDF値を計算することで文書に出現している単語のうち，どの単語が文書の特徴をよく表しているかが評価できる．

添付文書Aの検索テキストの単語種類と出現回数(上位40）※参考として”mecab”による形態素解析の結果を示す
単語錠
患者
投与
性こと
アレロック剤名
有効コード等販売
皮膚オロパタジン
塩
塩酸
機能承認
場合
年
番号

出現回数
1211111098877666655555555

出現率0.0547945
0.0502283
0.0502283
0.0456621
0.0410959
0.0365297
0.0365297
0.0319635
0.0319635
0.0273973
0.0273973
0.0273973
0.0273973
0.0228311
0.0228311
0.0228311
0.0228311
0.0228311
0.0228311
0.0228311
0.0228311

0.0182648
mm
40.0182648
4アレルギー性
0.0182648
4
そう
0.0182648
4
回
0.0182648
4開始
0.0182648
4
期間
0.0182648
4
小児
0.0182648
4
注意
0.0182648
4
貯法
0.0182648
4痒
0.0136986
3
季節
0.0136986
3
月
0.0136986
3参照
0.0136986
3
治療0.0136986
3疾患
0.0136986
3症
・汎用的な単語の出現率が高く、それらが上位にくると、文書とし0.0136986
3
障害て特徴が出にくい（違った特徴を示す可能性が高い）ため、検索0.0136986
3
成人
キーワードとして除外する必要があるかもしれない
0.0136986
3
成分・逆に、薬名・病名などの専門用語だけになってもレア度が薄まってしまうため、汎用単語との組み合わせが必要だと思われる

添付文書A 検索結果1件目の単語データ（文書内の単語）
単語1件目のデータ（単語の種類数：29）

TF値

皮膚

0.146908799731450

薬物0.056625879212158

投与

0.138959356115520

療法0.055438252844027

炎

0.054439551287936

予防0.053999928569476

改善

0.113236884041180

オロパタジン

0.110384558751670

スコア

0.050162055445495

痒

0.102218423720910

塩0.048119623733256

皮脂0.088508234485528

週

0.043177873367830

病因

0.041875119383244

全般

0.034223734334758

発症

0.086839194931629

塩酸

0.072028998257008＃＃

0.033173789400023

欠乏0.071181478095087

Ｏｌｏｐａｔａｄｉｎｅ

0.032827626776812

例0.070461627972919

そう

0.030829936669388

治療

0.067554052598947～）／

0.028995631747207

効果0.027613449467600）／

0.026825669292128

群

0.026095295223200

症状

0.067542592903624

検討

0.061303137771454

添付文書A 検索結果2件目の単語データ（文書内の単語）
単語2件目のデータ（単語の種類数：33）

TF値

重症

0.112165691473690

交感神経

0.057851187335234

塩酸

0.104078598398890

異常0.056582674877825

アレルギー性0.103405030066460

治療0.054229170664292

心身

0.102022236884260

閉

0.051445708418109

鼻炎

0.101861564997970

鼻0.050365235044774

副作用0.090485900611388

錠0.045365823819914

障害

0.078372907991971

発現

0.045245487917357

毒性

0.075752650754368

塩0.034765324486183

フェキソフェナジン

0.074980950608016

剤

0.034012808381132

プソイドエフェドリン

0.073294328190358

耳鼻咽喉科

0.033563319919627

配合0.063482833369641

アレルギー

0.031161521378989

Ｆｅｘｏｆｅｎａｄｉｎｅ

0.063245886450739

ディレグラ

0.030692977381085

行動

0.060430157647438

化学0.029282996607214

Ｐｓｅｕｄｏｅｐｈｅｄｒｉｎｅ

0.060066312227987

抗0.027464382397979

呼吸投与

0.059493302312453

0.026138168678442

刺激

誘発0.058672143621269

0.025393618894754＃＃＃＃

0.024286536992455

添付文書A 検索結果149件目と150件目の単語データ（文書内の単語）
149件目のデータ（単語の種類数：13）

150件目のデータ（単語の種類数：20）

単語疼痛
治療
Ｔｒａｍａｄｏｌ
毒性
副作用

単語
バラシクロビル
ｍｇ
帯状疱疹
試験
盲
臨床
投与
検
塩酸
比較
錠
相
至用量
重3000
＃＃
適用
Ｖａｌａｃｉｃｌｏｖｉｒ
検討

TF値
0.23961954586283
0.21016816364117
0.19825389834301
0.19572240431943
0.19482396378551

Ａｃｅｔａｍｉｎｏｐｈｅｎ

0.17771620410419

トラマドール配合
アセトアミノフェン
慢性
塩酸錠
投与

0.16516364320957
0.15376952971758
0.14208001923851
0.13584928911021
0.11204510839979
0.09767653918757
0.09607066595641

・１件目、2件目に比べて単語の種類数が少ない
ため、各単語のTF値は高い
・150件目は記号、数字などノイズが多い

TF値
0.212457981477380
0.192441636734650
0.180907656577080
0.138694335250320
0.114380083169390
0.105086770803210
0.097150111641309
0.094578497551682
0.084978031651526
0.077965669301479
0.074080521293942
0.067495346441535
0.063737980584906
0.061639299952474
0.053994014027481
0.053812841047677
0.052183488943856
0.049453221624494
0.049042906613113
0.048215951056200

添付文書Aの検索結果の考察について• 正直なところ、正確には説明が付かない• 検索テキストおよび文書データ中の単語数によっても評価が変わる• 登録する文書データが増えれば評価も変わる• 薬名・病名などの専門用語＝「特徴的な単語」と評価されるとは限らない• 検索テキストや登録済みの文書データ中の記号や数字などノイズによる影響もある• 秘伝のタレ的な要素もある

TF-IDFの特性（１／２）• 文書中の「特徴的な単語」を捉えること• 「特徴的な単語」とは、その文書を代表する単語。
• 検索の場合には、すべての単語を均等に扱うのではなく、特徴的な単語を用いることで、より適切な文書を順位付けすることができる。
• その意味では、BOW （Bag of Words）よりはTF-IDFの方が、より特徴的な単語を表すことができていると言える。
• もちろん、TF-IDFの計算結果が特徴語を正確に表しているとは限らないが、単純な計算式で、それなりの効果が出ていると言える。

TF-IDFの特性（２／２）• 文書に含まれる単語数が多いほどTF値が小さく、単語数が少ないほどTF値が大きくなる（分母に「すべての単語の出現回数の和」をとっているため）• そのため、複数の文書から重要度の高い単語を抽出して絶対評価
でTF-IDF値を比較する場合、文書毎の単語数（つまり、ゆるふわ検索エンジンに登録する文書毎のテキストの量＋単語の種類数）の差による影響が多く出てしまう。

発展途上のゆるふわ検索エンジン
a. 形態素解析の課題（薬名や病名など専門用語が正確に解析できていない。記号や助詞などのノイズが正しく除去されていない。）
b. 特徴量（ベクトル）計算の課題（形態素解析が正しくないと特徴量計算も不正確となる）
c. 文書間の類似度（距離）計算の課題（ベクトル計算が正しくないと距離計算も不正確となる）
d. 検索速度と検索精度のトレードオフ（速度を出すために精度をやや落とさざるを得ない）
e. レスポンス向上のため、現在複数台のサーバに分散して並行検索（マルチサーチ）を行い、結果をマージしてスコア順にソートしているため、サーバ１台のみの場合とスコアが異なる可能性がある検索精度に関する当面の課題
1. 形態素解析における課題• 日本語用語抽出にあたっては形態素解析器および形態素辞書が必要であるが、多くのシステムで用いられている形態素辞書は、日常用いられる日本語文の解析を想定したものであり、対象分野の特殊性を考慮したものとはなっていない。
• 文書単位の辞書テーブルに記号などノイズが含まれている

2. 登録済みドキュメントのタイトルや抄録をそのまま入れてもランクインしないケースがあることに対する疑問に対して説明がしづらい。
• 類似度がまったく同じもの（類似度を1とする）については、基本的に検索結果から除外される仕様としていることも一要因。

将来的な拡張計画案（１／２）
案１）医学専門用語辞書の活用• 医学論文からのサンプルテキストに対して、一般用語からなる一般辞書ファイルと専門用語からなる専門辞書ファイルを用いて形態素解析を行い、辞書ファイルの違いによる形態素解析の精度を比較する。

案２）文書種別や特定の単語にウエイト付けを行う• 原著論文のウェイトを高める、主題と判断できる語のウェイトを高める等

案３）機械学習エンジンと従来型の全文検索エンジンの併用• ２つの検索エンジンの検索結果をどのように重みづけ＆ランキングするか将来的な拡張計画案（２／２）
案４）キーフレーズ抽出の活用• あまり本質的でない文言（記号、挨拶文、どのテキストにも出てきそうな文言など）を無視できる可能性が高いため

案５）患者がよく使う表現の活用• 患者表現辞書を使って患者テキストの表記ゆれを吸収した意味構造検索を実装するなど一般的な利用者向けのエンジンとする• 「胸が苦しい」と「胸がムカムカする」など症状の表記の揺れによりヒットしない問題• （１）MEDNLPの患者表現辞書• 「頭が痛い」と「頭は正常だが胃が痛い」など主語が違うのにヒットしてしまう
問題• （２）係り受け解析：病名に紐づく患者表現を取得