yuu_nkjm blog
2010-05-11(Tue) 編集
[Windows][Windows 7 (64bit)][Network] Windowsでホスト名(NetBIOS名)とIPアドレスの関係を調べる
IPアドレスからホスト名(NetBIOS名),ホスト名(NetBIOS名)からIPアドレスを調べる - yuu_nkjm blog(2010-05-10)にまとめ直しました.
[ツッコミを入れる]
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 + ")");
}
}
}
[ツッコミを入れる]