私たちはJavaでLuceneを使用して文書を検索し、関連性があるかどうかを調べています。言葉 Luceneの類似点を使用して同じ結果を得る
- VSM類似性とポーターのステマーなしストップワード
- 標準ステマとVSMの類似性と言葉
- VSM類似性を停止し、停止します。私たちは、6種類の方法で検索していますポーターステマとの類似性と停止の言葉
- ポーターのステマーとBM25の類似性と標準ステマーとなし、ストップワード
- BM25類似性や言葉 に停止
検索構成3と6の結果は同じであり、構成1,2,4および5の結果も同じです。これは、アナライザー(ステムマー)を変更するだけで何かが変更されることを示します。
私たちはオブジェクトが期待どおりであるかどうかをチェックするためにデバッグを試みましたが、すべてが順不同であるように見えます。また、インデックス作成と検索の際に同じ類似点を使用することを覚えています。
私たちは間違って何をしていますか?設定を正しく適用するためのコードがありませんか?
public IndexWriterConfig index(List<DocumentInCollection> docs) throws IOException
{
Analyzer analyz;
IndexWriterConfig config;
if (analyzer.equals("vsm") && stopwords && stemmer)
{
//VSM cosine similarity with TFIDF + stopwords + stemmer
CharArraySet stopWords = EnglishAnalyzer.getDefaultStopSet();
analyz = new EnglishAnalyzer(stopWords);
config = new IndexWriterConfig(analyz);
config.setSimilarity(new ClassicSimilarity());
}
else if (analyzer.equals("vsm") && !stopwords && stemmer)
{
//VSM cosine similarity with TFIDF - stopwords + stemmer
analyz = new EnglishAnalyzer(CharArraySet.EMPTY_SET);
config = new IndexWriterConfig(analyz);
config.setSimilarity(new ClassicSimilarity());
}
else if (analyzer.equals("vsm") && stopwords && !stemmer)
{
//VSM cosine similarity with TFIDF - stopwords - stemmer
CharArraySet stopWords = StandardAnalyzer.STOP_WORDS_SET;
analyz = new StandardAnalyzer(stopWords);
config = new IndexWriterConfig(analyz);
config.setSimilarity(new ClassicSimilarity());
}
else if (analyzer.equals("bm25") && stopwords && stemmer)
{
//Analyzer + stopwords + stemmer
CharArraySet stopWords = EnglishAnalyzer.getDefaultStopSet();
analyz = new EnglishAnalyzer(stopWords);
config = new IndexWriterConfig(analyz);
//BM25 ranking method
config.setSimilarity(new BM25Similarity());
}
else if (analyzer.equals("bm25") && !stopwords && stemmer)
{
//Analyzer - stopwords + stemmer
analyz = new EnglishAnalyzer(CharArraySet.EMPTY_SET);
config = new IndexWriterConfig(analyz);
//BM25 ranking method
config.setSimilarity(new BM25Similarity());
}
else if (analyzer.equals("bm25") && stopwords && !stemmer)
{
//Analyzer + stopwords - stemmer
CharArraySet stopWords = StandardAnalyzer.STOP_WORDS_SET;
analyz = new StandardAnalyzer(stopWords);
config = new IndexWriterConfig(analyz);
//BM25 ranking method
config.setSimilarity(new BM25Similarity());
}
else
{
//some default
analyz = new StandardAnalyzer();
config = new IndexWriterConfig(analyz);
config.setSimilarity(new ClassicSimilarity());
}
IndexWriter w = new IndexWriter(corpus, config);
//total 153 documents with group 5
for (DocumentInCollection doc1 : docs) {
if (doc1.getSearchTaskNumber() == 5) {
Document doc = new Document();
doc.add(new TextField("title", doc1.getTitle(), Field.Store.YES));
doc.add(new TextField("abstract_text", doc1.getAbstractText(), Field.Store.YES));
doc.add(new TextField("relevance", Boolean.toString(doc1.isRelevant()), Field.Store.YES));
w.addDocument(doc);
totalDocs++;
if (doc1.isRelevant()) relevantDocs++;
}
}
w.close();
return config;
}
public List<String> search(String searchQuery, IndexWriterConfig cf) throws IOException {
printQuery(searchQuery);
List<String> results = new LinkedList<String>();
//Constructing QueryParser to stem search query
QueryParser qp = new QueryParser("abstract_text", cf.getAnalyzer());
Query stemmedQuery = null;
try {
stemmedQuery = qp.parse(searchQuery);
} catch (ParseException e) {
e.printStackTrace();
}
// opening directory for search
IndexReader reader = DirectoryReader.open(corpus);
// implementing search over IndexReader
IndexSearcher searcher = new IndexSearcher(reader);
searcher.setSimilarity(cf.getSimilarity());
// finding top totalDocs documents qualifying the search
TopDocs docs = searcher.search(stemmedQuery, totalDocs);
// representing array of hits from TopDocs
ScoreDoc[] scored = docs.scoreDocs;
// adding matched doc titles to results
for (ScoreDoc aDoc : scored) {
Document d = searcher.doc(aDoc.doc);
retrieved++;
//relevance and score are printed out for debug purposes
if (d.get("relevance").equals("true")) {
relevantRetrieved++;
results.add("+ " + d.get("title") + " | relevant: " + d.get("relevance") + " | score: " + aDoc.score);
} else {
results.add("- " + d.get("title") + " | relevant: " + d.get("relevance") + " | score: " + aDoc.score);
}
}
return results;
}
どうすれば2つの文字列を比較できますか?あるタイプの分析装置に基づいて、彼らの類似性が何であるか知りたいのですが...これを行う方法を知っていますか? – Digao
解決策が見つからなかった場合は、これに関する質問を開きます。私はこの1つのケースでLuceneを使用しており、存在していても完全に忘れていました。 –