Luceneで文章の類似文章検索
Luceneは普通に使うと単語からの検索なので文章との比較はできない。
が、実は文章のためのメソッドが用意されていた
MoreLikeThis
サンプルの修正が終わったので上記の修正開始
少し苦戦中
けどこれが完成すれば基本的な機能は完成でwebに実装するだけだ!
駄目だ・・・
多分Queryの生成がうまくいってない
import org.apache.jackrabbit.core.query.lucene.MoreLikeThis; import org.apache.lucene.analysis.Analyzer; import org.apache.lucene.analysis.ja.JapaneseAnalyzer; import org.apache.lucene.document.Document; import org.apache.lucene.index.CorruptIndexException; import org.apache.lucene.index.IndexReader; import org.apache.lucene.queryParser.ParseException; import org.apache.lucene.search.IndexSearcher; import org.apache.lucene.search.Query; import org.apache.lucene.search.ScoreDoc; import org.apache.lucene.search.TopDocs; class SearchJFilesFromDoc { public static void main(String[] args) throws CorruptIndexException, IOException, ParseException { System.setProperty("sen.home", "D:\\Software\\java\\sen"); String index = "C:\\Lucene\\index"; IndexReader reader = IndexReader.open(index); IndexSearcher searcher = new IndexSearcher(index); MoreLikeThis mlt = new MoreLikeThis(reader); Analyzer analyzer = new JapaneseAnalyzer(); mlt.setAnalyzer(analyzer); mlt.setFieldNames(new String[] { "contetns", "path" }); String user = "snkken"; String userTweet = "C:\\Lucene\\files\\" + user + ".txt"; Reader target = new StringReader(userTweet); Query query = mlt.like(target); System.out.println("Searching for: " + query.toString("contents")); TopDocs docs = searcher.search(query, 10); for (ScoreDoc scoreDoc : docs.scoreDocs) { int docId = scoreDoc.doc; Document doc = searcher.doc(docId); System.out.println("path" + doc.get("path")); } searcher.close(); } }
別のお話
単語を抽出する際の品詞を指定できるみたい。
類似ユーザー検索だと、名詞に限定したほうがいいよね。
wikipediaやはてなの固有名詞だけに限定するのもありかも
これはシステムが動いてからおいおい試していこう