Chcę użyć Lucene do obliczenia precyzji i przypomnienia.Precyzyjne przywoływanie w lucene java
zrobiłem kroki:
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żceC:/inn
(w tym folderze znajdują się 4 pliki tekstowe) i przenoszą je do folderu "outt", ustawiając ścieżkę indexpath naC:/outt
w kodzie Indexer.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 dodanoLucene-benchmark-.3.2.0jar
iLucene-core-3.3.0jar
Set ścieżka
topicsfile
w kodzie doC:/lia2e/src/lia/benchmark/topics.txt
i
doC:/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(); } }
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.
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
Nie wiem o Lucene, ale czy nie jest konieczne zamykanie znaczników i w pliku qrels? –
pablosaraiva