yuu_nkjm blog
2011-05-11(Wed) [長年日記]
[Lucene][NLP][Java] LuceneでTF(Term Frequency: 単語の出現頻度)を取得する
IndexSearcher.explain(検索にヒットした文書)というメソッドを呼ぶと,検索にヒットした文書のExplanationを取得できる.Explanation.toStringの中にTF(Term Frequency: 単語の出現頻度,回数)やPF(Phrase Frequency: フレーズの出現頻度)が文字列で格納されている.計算コストはかかるが,この文字列からTFやPFを切り出すことができる.
最初は全文検索システム Hyper Estraierを使おうと思ったんだけど,TFより高いレイヤ(スコアの高い文書の取得とか)でやる分には良さそうだったけど,TFを調べるのに適したAPIがなさそうだったので,Luceneを使うことにした.
サンプルコード
id:sleepy_yoshiさんのサンプルコードをお借りすると,こんな感じ.class HogeSearch { public static void main (String [] args) throws Exception { //最後らへん for (ScoreDoc scoreDoc : docs2.scoreDocs) { Explanation explanation = indexSearch.explain( query2, scoreDoc.doc); System.out.println(explanation.toString()); } } }
(出力)
━━━━━━━━━━━━━━━━━━━━━━━ 0.8784157 = (MATCH) weight(body:"あひ ひゃ" in 1), product of: 1.0 = queryWeight(body:"あひ ひゃ"), product of: 2.8109303 = idf(body: あひ=1 ひゃ=1) 0.3557541 = queryNorm 0.8784157 = fieldWeight(body:"あひ ひゃ" in 1), product of: 1.0 = tf(phraseFreq=1.0) ←←←←←←← 【ココ】 2.8109303 = idf(body: あひ=1 ひゃ=1) 0.3125 = fieldNorm(field=body, doc=1) ━━━━━━━━━━━━━━━━━━━━━━━
TFやPFを計算している箇所
TFやPFを計算し格納するのは,以下の箇所の様だ.
public class TermQuery extends Query { private class TermWeight extends Weight { public Explanation explain(IndexReader reader, int doc) throws IOException { if (termDocs != null) { try { if (termDocs.skipTo(doc) && termDocs.doc() == doc) { tf = termDocs.freq(); } } finally { termDocs.close(); } tfExplanation.setValue(similarity.tf(tf)); tfExplanation.setDescription("tf(termFreq("+term+")="+tf+")"); } } } }
public class PhraseQuery extends Query { private class PhraseWeight extends Weight { public Explanation explain(IndexReader reader, int doc) throws IOException { float phraseFreq; if (d == doc) { phraseFreq = scorer.freq(); } else { phraseFreq = 0.0f; } tfExplanation.setValue(similarity.tf(phraseFreq)); tfExplanation.setDescription("tf(phraseFreq=" + phraseFreq + ")"); } } }
- https://www.google.co.jp/ ×145
- https://www.google.com/ ×7
- http://d.hatena.ne.jp/sleepy_yoshi/20110405/p1 ×6
- http://search.aol.com/aol/search?s_chn=prt_ct17&v_... ×1
- http://d.hatena.ne.jp/sleepy_yoshi/touch/trackback... ×1
- https://www.google.com/search ×1
- term frequency ×8 / lucene 頻度 ×3 / 単語頻度 tf ×3 / c言語 term frequency ×3 / GMK出現 ×2 / LUCENE Weight ×2 / Term Lucene ×2 / lucene fieldnorm ×2 / Lucene Similarity ×2 / lucene tf pf ×2 / scorer.freq lucene ×2 / lucene idf ×2 / Frequency 単語 ×1 / java tf ×1 / 単語出現頻度 tf ×1 / lucene 正規表現 出現回数 ×1 / lucene windows ×1 / term frequency lucene ×1 / 頻度 TF ×1 / IndexSearcher explain 使い方 ×1 / freq lucene ×1 / 単語の出現頻度 tf ×1 / LUCENE 使い方 ×1 / 単語の出現回数 java ×1 / solr phraseFreq ×1 / 全単語 頻度 JAVA ×1 / lucene ヒットした ターム ×1 / lucene 単語 回数 ×1 / 頻度 tf ×1 / ターム 出現頻度 ×1 / 取得頻度 ×1 / Lucene Term 頻度 ×1 / 単語 頻度 java ×1 / lucene 全文書 取得 ×1 / idf lucene ×1 / Term Frequency ×1 / frequ 単語 ×1 / lucene サンプル コーディング ×1 / lucene.net freq ×1 / Term frequency ×1 / Lucene TF ×1 / C言語 単語 出現頻度 ×1 / 出現回数 C言語 ×1 / 頻度 計算の仕方 出現頻度 フレーズ ×1 / term frequency C言語 ×1 / word frequency java ×1 / lucene 使い方 ×1 / term frequency C言語 プログラム ×1 / elasticsearch 単語 頻度 ×1 / term frequency c言語 ×1 / tf 出現頻度 ×1 / Freq lucene ×1 / Lucene Term 出現回数 ×1 / lucene score explain ×1 / lucene similarity tf ×1 / lucene term freq ×1 / term frequency 単語頻度 方法 ×1 / lucene term ×1 / FREQ ソフト FTP ×1 / solr weighted term ×1 / java 単語 頻度 ×1 / lucene 単語頻度 ×1 / 単語 ツイッター 頻度 取得 ×1