2011-08-24 9 views
15

Chcę użyć Lucene do obliczenia precyzji i przypomnienia.Precyzyjne przywoływanie w lucene java

zrobiłem kroki:

  1. poczyniła pewne pliki indeksów. W tym celu użyłem kodu indeksującego i zindeksowanych plików .txt, które istnieją na tej ścieżce C:/inn (w tym folderze znajdują się 4 pliki tekstowe) i przenoszą je do folderu "outt", ustawiając ścieżkę indexpath na C:/outt w kodzie Indexer.

  2. Utworzono pakiet o nazwie lia.benchmark i klasę wewnątrz niego, który jest nazywany "PrecisionRecall" i dodać externaljars (kliknij prawym przyciskiem myszy -> Java build path -> dodać słoików zewnętrznych) i dodano Lucene-benchmark-.3.2.0jar i Lucene-core-3.3.0jar

  3. Set ścieżka topicsfile w kodzie do C:/lia2e/src/lia/benchmark/topics.txt i
    do C:/lia2e/src/lia/benchmark/qrels.txt i dir do "C:/outt".

    Oto kod:

    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. zainicjowany qrels i tematów. W folderze dokumentów (C: \ inn) mam 4 pliki txt, z których 2 ma znaczenie dla mojego zapytania (zapytanie to jabłko), więc wypełniłem pytania i tematy. złożyć

    się qrels tak:

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

    i tematy złożyć tak:

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

    Próbowałem też format Path czyli na przykład "C: \ inn \ 789.txt" zamiast z "789.txt" ale wyniki są zerowe:

    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 
    

Czy możesz mi powiedzieć, co jest ze mną nie tak?

Naprawdę muszę wiedzieć, dlaczego wyniki są zerowe.

+1

Jako ogólna technika debugowania, jeśli nie otrzymasz oczekiwanego wyjścia, pracuj wstecz i wczytuj wartości wcześniej i wcześniej w swoim programie, aż znajdziesz wartości, których * nie * możesz oczekiwać. W ten sposób możesz dokładnie określić, gdzie coś jest nie tak. – Gian

+0

Nie wiem o Lucene, ale czy nie jest konieczne zamykanie znaczników i w pliku qrels? – pablosaraiva

Odpowiedz

3

Obawiam się, że format, qrels.txt jest źle: the javadoc proponuje następujące:

Oczekiwany format wejściowy:

qnum 0 doc-name  is-relevant 

dwa wiersze przykładowe:

19 0 doc303  1 
19 0 doc7295  0 

(wiem, że to 2.3.0 javadoc, ale format nie został zmieniony w 3.0)

Wygląda na to, że pliki zostały zamienione: TrecTopicsReader spodziewa się, co masz w qrels.txt; TrecJudge spodziewa się, co masz w topics.txt.