【问题标题】:Precision recall in lucene javalucene java中的精确召回
【发布时间】:2011-11-02 12:09:23
【问题描述】:

我想用 Lucene 来计算 Precision 和 Recall。

我做了这些步骤:

  1. 制作了一些索引文件。为此,我使用了索引器代码并索引了此路径 C:/inn 中存在的 .txt 文件(此文件夹中有 4 个文本文件),并通过在索引器中将 indexpath 设置为 C:/outt 将它们放入“outt”文件夹中代码。

  2. 创建了一个名为lia.benchmark的包和一个名为“PrecisionRecall”的类,并添加externaljars(右键单击-> Java构建路径->添加外部jar)并添加Lucene-benchmark-.3.2.0jar和Lucene-core-3.3.0jar

  3. 将代码中的topicsfile 路径设置为C:/lia2e/src/lia/benchmark/topics.txt,
    将qrelsfile 设置为C:/lia2e/src/lia/benchmark/qrels.txt,并将目录设置为“C:/outt”。

    代码如下:

    package lia.benchmark;        
    import java.io.File;  
    import java.io.PrintWriter;  
    import java.io.BufferedReader;  
    import java.io.FileReader;  
    import org.apache.lucene.search.*;  
    import org.apache.lucene.store.*;  
    import org.apache.lucene.benchmark.quality.*;  
    import org.apache.lucene.benchmark.quality.utils.*;  
    import org.apache.lucene.benchmark.quality.trec.*;  
    
     public class PrecisionRecall {  
    
       public static void main(String[] args) throws Throwable {  
    
      File topicsFile = new File("C:/lia2e/src/lia/benchmark/topics.txt");  
             File qrelsFile = new File("C:/lia2e/src/lia/benchmark/qrels.txt");  
             Directory dir = FSDirectory.open(new File("C:/outt"));  
             IndexSearcher searcher = new IndexSearcher(dir, true);  
    
             String docNameField = "filename";  
    
             PrintWriter logger = new PrintWriter(System.out, true);  
    
             TrecTopicsReader qReader = new TrecTopicsReader();   
             QualityQuery qqs[] = qReader.readQueries(                        
                     new BufferedReader(new FileReader(topicsFile)));  
    
             Judge judge = new TrecJudge(new BufferedReader(          
                    new FileReader(qrelsFile)));                                          
    
             judge.validateData(qqs, logger);                                          
    
             QualityQueryParser qqParser = new SimpleQQParser("title", "contents");  
    
             QualityBenchmark qrun = new QualityBenchmark(qqs, qqParser, searcher, docNameField);  
       SubmissionReport submitLog = null;  
             QualityStats stats[] = qrun.execute(judge,                   
                       submitLog, logger);  
    
            QualityStats avg = QualityStats.average(stats);          
            avg.log("SUMMARY",2,logger, "  ");  
       dir.close();  
      }  
    } 
    
  4. 已初始化 qrel 和主题。在文档文件夹(C:\inn)中,我有 4 个 txt 文件,其中 2 个与我的查询相关(查询是苹果),所以我填写了 qrels 和主题。

    qrels 文件如下:

    <top>  
        <num> Number: 0 
        <title> apple
        <desc> Description:  
        <narr> Narrative:  
    </top>  
    

    和这样的主题文件:

    0    0      789.txt           1
    0    0      101.txt           1
    

    我也尝试了路径格式,例如“C:\inn\789.txt”而不是“789.txt” 但结果为零:

    0 - contents:apple
    0 Stats:
    Search Seconds: 0.016
    DocName Seconds: 0.000
    Num Points: 2.000
    Num Good Points: 0.000
    Max Good Points: 2.000
    Average Precision: 0.000
    MRR: 0.000
    Recall: 0.000
    Precision At 1: 0.000
    SUMMARY
    Search Seconds: 0.016
    DocName Seconds: 0.000
    Num Points: 2.000
    Num Good Points: 0.000
    Max Good Points: 2.000
    Average Precision: 0.000
    MRR: 0.000
    Recall: 0.000
    Precision At 1: 0.000
    

你能告诉我我有什么问题吗?

我真的需要知道为什么结果为零。

【问题讨论】:

  • 作为一种通用的调试技术,如果你没有得到你期望的输出,那么在你的程序中越来越早地向后工作并询问值,直到你找到你做的值> 期待。这样您就可以准确找出问题所在。
  • 我不知道Lucene,但是qrels文件中的<desc>和<narr>标签是不是必须要关闭?</narr></desc>

标签: java lucene search-engine


【解决方案1】:

恐怕qrels.txt 格式不对:the javadoc 建议如下:

预期的输入格式:

 qnum  0   doc-name     is-relevant

两个示例行:

 19    0   doc303       1
 19    0   doc7295      0

(我知道它是 2.3.0 javadoc,但格式在 3.0 中没有改变)

看来您已经交换了文件:TrecTopicsReader 期待您在 qrels.txt 中拥有的内容; TrecJudge 期待您在 topics.txt 中拥有的内容。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-03-20
    • 2021-09-13
    • 2021-10-23
    • 2017-09-21
    • 1970-01-01
    • 2015-08-11
    • 2020-04-18
    • 2017-04-13
    相关资源
    最近更新 更多