RONDHUIT REPORT Vol.8 – LUCENE SCORING TIPS & TRICKS

Excel で学ぶ！Lucene のスコア計算	 
2011 年 3 月 24 日株式会社 ロンウイット
Lucene や Solr では、ユーザのクエリに対してイン

阿部 慎一朗1.	 ベクトル空間モデルの基礎

デックス内のドキュメントを検索し、検索語にヒットしたドキュメントをユーザに提示する。その際、「ランキング」と呼ばれるドキュメントの順位付け

ベクトル空間モデルにおけるスコアは、ユーザクエを行い適切に並び替えを行う。
「ランキング」が適切リとドキュメントの「コサイン類似度」によって求になされることにより、ユーザは探していたドキュめられる。ユーザのクエリに含まれる単語を使い、メントを素早く探し求めることができる。ランキン「タームベクトル V」を形成し、ユーザクエリのグはユーザクエリとヒットした各ドキュメントとのV(q)とドキュメントの V(d)のなす角θの余弦(cos類似度（関連度）を数学的に計算して行う。ユーザθ)をスコアとする。

クエリとヒットしたひとつのドキュメントの類似度の計算を本書では「スコア計算」と呼ぶ。Lucene

下図のように、2 次元のベクトル（ユーザクエリが 2ではブール代数モデルとベクトル空間モデルをカス単語の場合は 2 次元となる）で説明すれば、ベクトタマイズして組み合わせて使っているが、このスコルのなす角の余弦が１に近いほど類似しているといア計算は Similarity クラスというところで行われてうことになる。

いる。
そ の 計 算 内 容 に つ い て は Similarity ク ラ ス のJavadoc で説明されているが、Lucene 2.9 から非常に読みやすく改訂されている：
Similarity クラスの Javadoc
http://lucene.apache.org/java/2_9_4/api/all/org/apache/lucene/search/Similarity.html
コサイン類似度の公式は次のとおりである。
改訂についてhttps://issues.apache.org/jira/browse/LUCEN
E-1908
本書では Lucene 流にカスタマイズされたベクトル空間モデルのスコア計算を、Excel を使ってシミュレーションすることを試みる。別紙の Excel をダウ

ここで V(q)・V(d)は内積、|V(q)||V(d)|はノルムンロードして実行しつつ本書をお読みいただきたい。

である。この式を表現したのが別紙 Excel の表（１）だ。
このシンプルなモデルには問題がある。次のように

Copyright © RONDHUIT Co.,Ltd.
1

RONDHUIT REPORT Vol.8 – LUCENE SCORING TIPS & TRICKS“Apache OR Solr”で検索した場合の、４つのドキュモデルの doc-len-norm を加味して計算しているのメントのスコア計算をこの式を使ってやってみよう。

が別紙 Excel の表（２）である。

その結果、ドキュメント２のスコアが最も高くなる
すると、ドキュメント２、３、４のスコアが同値にように改善されたことがわかる。

なってしまう。ドキュメント全体から考えれば、ドキュメント２のスコアが最も高くなるべきである。

なお、Lucene のスコア概念モデルでは次の項目もこの問題は、ドキュメント２、３、４のノルムがみ定義しているが、簡単化のため Excel の表では省略な同じになってしまっていることから発生している。

している。

この公式では、ドキュメントの単語数による長さが考慮されていない。

項目

説明

coord-factor (q,d)

ドキュメントの中で一致するクエリタームの数を考慮する係数2.	 「Lucene 流」スコア計算	 

query-boost (q)特定クエリタームに対して恣意的に重み付ける係数~ 概念モデル ~そこで Lucene では、上記の問題を回避しつつ、スコア計算の精度を高めるために、次のように計算式

3.	 「Lucene 流」スコア計算	 をカスタマイズしている（スコア概念モデル）。

~ 実践モデル ~
さて、Lucene の実際のスコア計算では、前述のスコア概念モデルに対し、tf-idf の重み付けを考慮して再定義している。tf-idf とは、ドキュメントやクエリ

この式ではドキュメントのノルムを外に出して、次内で単語が出現する頻度（tf）と、インデックス内にの項目に置き換えていることがわかる。

おける単語の稀少価値（idf）によって単語を重み付けるアルゴリズムである。この結果、スコア精度を項目説明より高めた Lucene のスコア実践モデルが提供されdoc-len-norm(d)ドキュメントの単語数の長さを考慮する。次のモデル公式が最終的なスコア計算式となる。

る係数
doc-len-norm=1/√単語数
doc-boost(d)特定ドキュメントに対して恣意的に重み付ける係数

上記公式では、次の項目を積上げたものからスコア前述と同じ 4 つのドキュメントに対し、スコア概念が計算できると定義されている。

Copyright © RONDHUIT Co.,Ltd.
2

RONDHUIT REPORT Vol.8 – LUCENE SCORING TIPS & TRICKSの数を df とすると、idf(t)=log(N/(df+1))+1 と項目説明なる。たとえば、すべての文書に対象単語が出現す

coord(q,d)

ドキュメントの中で一致するクエリターる場合は、限りなく１に近くなり、ほとんど出現しムの数を考慮する係数ない場合は大きな値になる。

queryNorm(q)異なるクエリ間でスコアを比較できるよ
うにするための正規化係数

前述の４つのドキュメントを、スコア実践モデルのtf(t in d)

ドキュメント(d)の中での単語(t)の頻度

tf、idf、norm を加味して計算しているのが別紙

idf(t)

インデックス内の単語(t)の希少価値

t.getBoost()Excel の表（３）である。

検索クエリの中で特定クエリタームを重み付ける係数

norm(t,d)

特定ドキュメントを重み付ける係数、特定フィールドを重み付ける係数、ドキュメン
トの単語数の長さを考慮する係数、をまとめた係数

Lucene のスコア実践モデルでは、Lucene のスコア概念モデルから、ドキュメントのノルムをまとめて「norm(t,d)」に置き換えている。また、V(q)・V(d)の部分は、重み係数を 1 から tf-idf に置き換えてい今回の簡単なサンプルでは、ドキュメント数とドキュメント内の単語数も少ないため、tf-idf の重み付けの価値がはっきりわからないが、実際の場面では威力を発揮するはずである。

る。
「Σtf(t in d)idf(t)^2」の部分は 2 次元の場合、次のように説明できる。

4.	 おわりに	 V(q)・V(d)=( vq1, vq2 ) ( vd1, vd2 )T=vq1*vd1+vq2*vd2=tf(q1)idf(t)*tf(d1)idf(t)+tf(q2)idf(t)*tf(d2)idf(t)本書では、全文検索のスコア計算におけるベクトル=tf(t in q1)idf(t)*tf(t in d1)idf(t)空間モデルの基礎を最初に説明し、Lucene 流にい+tf(t in q2)idf(t)*tf(t in d2)idf(t)=idf(t)*tf(t in d1)idf(t) + idf(t)*tf(t in d2)idf(t)	 

かにカスタマイズしているかを解説した。別紙 Excel※=idf(t)2*tf(t in d1) + idf(t)2*tf(t in d2)=∑ (tf(t in d)*idf(t)2)

ファイルとともに本書をお読みいただき、Luceneや Solr のスコア計算について理解を深めていただけt

れば幸いである。

※ tf(t in q)は常に１なので省略。

tf と idf の具体的な計算方法は抽象クラス Similarity（株）ロンウイットについての具象クラスである DefaultSimilarity にて次のとロンウイットはオープンソースの全文検索エンジンおり実装されている。

Lucene /Solr を企業システムに導入する支援サービス事業を展開している。
お問い合わせ先項目説明

tf

1 ドキュメントの中で単語がどれだけ頻繁に出現〒100-0005 東京都千代田区丸の内 1-8-3

するかを表す。多く出現するほど高い数値となる。

丸の内 トラストタワー本館 20 階

tf = 出現頻度^(1/2)

電話：03-5288-5927

idf

全ドキュメントの中で単語がどれだけ稀かを表す。
稀であるほど高い数値となる。インデックス内のドキュメント総数が N で単語 t を含むドキュメント

FAX：03-5288-5928

メール：sales@rondhuit.com
ホームページ：http://www.rondhuit.com/

Copyright © RONDHUIT Co.,Ltd.
3