2016-04-22 21 views
1

私たちはJavaでLuceneを使用して文書を検索し、関連性があるかどうかを調べています。言葉 Luceneの類似点を使用して同じ結果を得る

  • BM25ポーターのステマーと

    • 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; 
        } 
    
  • +0

    どうすれば2つの文字列を比較できますか?あるタイプの分析装置に基づいて、彼らの類似性が何であるか知りたいのですが...これを行う方法を知っていますか? – Digao

    +0

    解決策が見つからなかった場合は、これに関する質問を開きます。私はこの1つのケースでLuceneを使用しており、存在していても完全に忘れていました。 –

    答えて

    3

    まず、あなたは、通常は異なるスコア(したがって発注)、BM25とクラシックの類似点は、結果の異なるセットを返すように期待していません。一般に、類似性は、照会と一致することが既に判明している文書のスコアの計算方法を管理します。彼らは通常、同じ結果を返しますが、スコアが異なるため、順序が異なります。

    同じのスコアがbm25とvsmの設定で表示されている場合は、問題が発生しています。しかし、あなたのコードは私のダウントリミング、実行可能なテストバージョンに基づいて、私には大丈夫になります。https://gist.github.com/anonymous/baf279806702edb54fab23db6d8d19b9

    ストップワードフィルタは、本当に多くの場合、その大きな変化はありません。ストップワードが索引付けされるかどうかを制御します。ストップワードは "the"や "this"のような言葉です。ストップワードフィルタでは、索引付けされず、検索できません。ストップワードを検索している場合を除き、その違いは一般的には分かりません。繰り返しますが、このは、私のテストバージョンに基づいて正しく動作するように、と思われます。

    +0

    私はあなたの答えが気に入っています。もし私が追加してもらえれば、そのようなシステムの評価は正確さだけでなく、データセット全体の位置精度やMAPなどの指標で行うべきです。 – eliasah

    +0

    の類似性は、ドキュメントリストのドキュメント数によって影響を受けますか?あなたのコードがこのようになることが判明しました...私にはわかりません... – Digao

    関連する問題