2010-12-01 7 views
1

je dois calculer la précision et de la valeur de rappel dans Lucene et j'utiliser ce code source pour faireavec précision et le rappel de mesure dans Lucene

public class PrecisionRecall { 

public static void main(String[] args) throws Throwable { 

File topicsFile = new File("C:/Users/Raden/Documents/lucene/LuceneHibernate/LIA/lia2e/src/lia/benchmark/topics.txt"); 
File qrelsFile = new File("C:/Users/Raden/Documents/lucene/LuceneHibernate/LIA/lia2e/src/lia/benchmark/qrels.txt"); 
Directory dir = FSDirectory.open(new File("C:/Users/Raden/Documents/myindex")); 
Searcher searcher = new IndexSearcher(dir, true); 

String docNameField = "filename"; 

PrintWriter logger = new PrintWriter(System.out, true); 

TrecTopicsReader qReader = new TrecTopicsReader(); //#1 
QualityQuery qqs[] = qReader.readQueries(   //#1 
    new BufferedReader(new FileReader(topicsFile))); //#1 

Judge judge = new TrecJudge(new BufferedReader(  //#2 
    new FileReader(qrelsFile)));      //#2 

judge.validateData(qqs, logger);      //#3 

QualityQueryParser qqParser = new SimpleQQParser("title", "contents"); //#4 

QualityBenchmark qrun = new QualityBenchmark(qqs, qqParser, searcher, docNameField); 
SubmissionReport submitLog = null; 
QualityStats stats[] = qrun.execute(judge,   //#5 
     submitLog, logger); 

QualityStats avg = QualityStats.average(stats);  //#6 
avg.log("SUMMARY",2,logger, " "); 
dir.close(); 
} 
} 

et voici le contenu de topicsfile

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

ce qui est le contenu de qrelsfile

# Format: 
# 
#  qnum 0 doc-name  is-relevant 
# 
# 

0 0 apache1.0.txt  1 
0 0 apache1.1.txt  1 
0 0 apache2.0.txt  1 

maintenant le problème se produit lorsque je courais cette source code qui affiche la valeur de la précision et rappel à zéro. voici le résultat quand j'ai couru le code source.

0 - contents:apache contents:source 

0 Stats: 
Search Seconds:   0.047 
DocName Seconds:  0.039 
Num Points:   56.000 
Num Good Points:  0.000 
Max Good Points:  3.000 
Average Precision:  0.000 
MRR:     0.000 
Recall:     0.000 
Precision At 1:   0.000 
Precision At 2:   0.000 
Precision At 3:   0.000 
Precision At 4:   0.000 
Precision At 5:   0.000 
Precision At 6:   0.000 
Precision At 7:   0.000 
Precision At 8:   0.000 
Precision At 9:   0.000 
Precision At 10:  0.000 
Precision At 11:  0.000 
Precision At 12:  0.000 
Precision At 13:  0.000 
Precision At 14:  0.000 
Precision At 15:  0.000 
Precision At 16:  0.000 
Precision At 17:  0.000 
Precision At 18:  0.000 
Precision At 19:  0.000 
Precision At 20:  0.000 



SUMMARY 
Search Seconds:   0.047 
DocName Seconds:  0.039 
Num Points:   56.000 
Num Good Points:  0.000 
Max Good Points:  3.000 
Average Precision:  0.000 
MRR:     0.000 
Recall:     0.000 
Precision At 1:   0.000 
Precision At 2:   0.000 
Precision At 3:   0.000 
Precision At 4:   0.000 
Precision At 5:   0.000 
Precision At 6:   0.000 
Precision At 7:   0.000 
Precision At 8:   0.000 
Precision At 9:   0.000 
Precision At 10:  0.000 
Precision At 11:  0.000 
Precision At 12:  0.000 
Precision At 13:  0.000 
Precision At 14:  0.000 
Precision At 15:  0.000 
Precision At 16:  0.000 
Precision At 17:  0.000 
Precision At 18:  0.000 
Precision At 19:  0.000 
Precision At 20:  0.000 

maintenant tu peux me dire ce que j'avais fait mal ce qui rend les valeurs de précision et de rappel pour être des zéros? et qu'est-ce que cela signifie quand la précision et la valeur de rappel sont nulles? la raison pour laquelle je fais cela est parce que j'ai besoin de mesurer la performance de mon moteur de recherche, et la précision et le rappel est l'un des moyens pour moi de l'atteindre.

merci bien

Répondre

1

Précision = 0 signifie qu'aucun de vos résultats étaient corrects. Voir the wikipedia article, par exemple.

Je suggère d'essayer une requête individuelle, et voir ce que sont vos résultats. Vous avez probablement un problème avec votre tokenizer; peut-être que vous n'êtes pas en train de faire les choses correctement, etc.

+0

oui vous avez raison.Je vais regarder dedans alors. :-) – jacobian

1

Je crois que le problème réside dans la procédure d'indexation. Si vous regardez bien à

QualityBenchmark qrun = 
     new QualityBenchmark(qqs, qqParser, searcher, docNameField); 

vous verrez que la recherche est lancée pour les matchs de deux les requête et documents noms (= Lucene regarde des valeurs dans le domaine du nom "filename") dans l'indice de Lucene.

Cela signifie que lorsque vous indexez, vous devez créer un champ document explicite qui stocke les IDs des fichiers txt dans votre corps (dans votre cas, leurs noms), par exemple déclarer

public static final String FIELD_NAME = "filename"; 

puis plus tard

document.add(new TextField(FIELD_NAME, "apache1.0.txt", Field.Store.YES)); 

et de même pour les 2 autres fichiers. Sinon, il ne peut pas renvoyer les hits aux noms dans les fichiers de configuration. J'ai eu le même problème, mais après avoir ajouté le nouveau champ personnalisé, cela a fonctionné comme un charme :-)

N.B. Le format des deux fichiers de configuration de l'analyse comparative est basé sur le format TREC9; un exemple de fichier qrels.txt peut être trouvé à http://trec.nist.gov/data/qrels_eng/ et un échantillon topics.txt fichier au http://trec.nist.gov/data/topics_eng/topics.501-550.txt.