Desidero utilizzare Lucene per calcolare Precisione e Richiamo.Richiamo di precisione in lucene java
ho fatto questi passaggi:
fatto alcuni file di indice. Per fare questo ho usato il codice dell'indicizzatore e ho indicizzato i file
.txt
che esistono in questo percorsoC:/inn
(ci sono 4 file di testo in questa cartella) e li prendiamo nella cartella "outt" impostando il percorso dell'indice suC:/outt
nel codice dell'indicizzatore.Creato un pacchetto chiamato
lia.benchmark
e una classe al suo interno che si chiama "PrecisionRecall" e aggiungereexternaljars
(rightclick -> generazione Java percorso -> aggiungere vasi esterni) e ha aggiuntoLucene-benchmark-.3.2.0jar
eLucene-core-3.3.0jar
Set il percorso
topicsfile
nel codice aC:/lia2e/src/lia/benchmark/topics.txt
e
qrelsfile
aC:/lia2e/src/lia/benchmark/qrels.txt
e dir a "C:/outt".Ecco il codice:
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(); } }
qrels inizializzato e argomenti. Nella cartella documenti (C: \ inn) ho 4 file txt di cui 2 sono pertinenti alla mia query (la query è apple), quindi ho riempito qrels e argomenti. il file
le qrels come questo:
<top> <num> Number: 0 <title> apple <desc> Description: <narr> Narrative: </top>
e argomenti file in questo modo:
0 0 789.txt 1 0 0 101.txt 1
Ho provato anche il formato del percorso vale a dire, ad esempio "C: \ inn \ 789.txt" invece di "789.txt" ma i risultati sono zero:
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
Puoi dirmi cosa c'è di sbagliato in me?
Ho davvero bisogno di sapere perché i risultati sono zero.
Come tecnica di debug generale, se non si ottiene l'output che ci si aspetta, lavorare all'indietro e interrogare i valori precedenti e precedenti nel proprio programma fino a trovare i valori che * si * si aspettano. In questo modo puoi capire esattamente dove le cose stanno andando male. – Gian
Non so Lucene, ma non è necessario chiudere i tag e nel file qrels? –
pablosaraiva