📄 avaliador.java
字号:
} catch (IOException e) {
e.printStackTrace();
}
}
private static void addDoc(IndexWriter w, Documento documento) throws IOException {
Document doc = new Document();
doc.add(new Field("numeroRegistro", documento.getNumeroRegistro(), Field.Store.YES, Field.Index.NO));
doc.add(new Field("titulo", documento.getTitulo(), Field.Store.YES, Field.Index.ANALYZED, Field.TermVector.YES));
if (documento.getTextoAbstract() != null) {
doc.add(new Field("textoAbstract", documento.getTextoAbstract(), Field.Store.YES, Field.Index.ANALYZED, Field.TermVector.YES));
}
doc.add(new Field("tituloAbstract", documento.getTituloAbstract(), Field.Store.YES, Field.Index.ANALYZED, Field.TermVector.YES));
doc.add(new Field("textoCompleto", documento.getTextoCompleto(), Field.Store.YES, Field.Index.ANALYZED, Field.TermVector.YES));
w.addDocument(doc);
}
public static double[] calculaPrecisionRecallLucene(String campoConsulta, String tipoQuery, EntityManager em) {
double[] totalArrayPrecision = new double[11];
try {
List<Pergunta> queryPergunta = em.createQuery("select p from Pergunta p").getResultList();
double numeroPerguntas = queryPergunta.size();
IndexReader indexReader = IndexReader.open("index");
Searcher searcher = new IndexSearcher(indexReader);
File fileStopWords = new File("stopwords.txt");
String[] listaStopWords = listaStopWords(fileStopWords);
for (Pergunta p: queryPergunta) {
double[] precisionRecallPergunta = new double[11];
String pergunta = p.getQuery().replaceAll("\\?", "").replaceAll("\n", " ").replaceAll("\\(", "").replaceAll("\\)", "").replaceAll(":", "").replaceAll("^", "").replaceAll("~", "").replaceAll("!", "");
SnowballAnalyzer analyzer = new SnowballAnalyzer("English", listaStopWords);
QueryParser queryParser = new QueryParser(campoConsulta, analyzer);
TopDocCollector collector = new TopDocCollector(600);
if (tipoQuery.equals(Avaliador.BOOLEANQUERY)) {
org.apache.lucene.search.Query query = queryParser.parse(pergunta);
System.out.print("Pergunta n鷐ero: " + queryPergunta.indexOf(p) + " - ");
System.out.println(query.toString());
searcher.search(query, collector);
} else if (tipoQuery.equals(Avaliador.PRHASEQUERY)) {
String perguntaModificada = "\"" + pergunta + "\"";
queryParser.setPhraseSlop(100);
org.apache.lucene.search.Query query = queryParser.parse(perguntaModificada);
System.out.print("Pergunta n鷐ero: " + queryPergunta.indexOf(p) + " - ");
System.out.println(query.toString());
searcher.search(query, collector);
} else {
org.apache.lucene.search.Query queryAuxiliar = queryParser.parse(pergunta);
String perguntaModificada = queryAuxiliar.toString().replaceAll(campoConsulta + ":", "");
StringBuilder sb = new StringBuilder();
StringTokenizer tokenizer = new StringTokenizer(perguntaModificada, " ");
while (tokenizer.hasMoreElements()) {
String token = tokenizer.nextToken().toLowerCase();
boolean encontrei = false;
for (int i = 0; i < listaStopWords.length; i++) {
if (token.equals(listaStopWords[i])) {
encontrei = true;
break;
}
}
if (!encontrei) {
sb.append(token + "~0.6 ");
}
}
org.apache.lucene.search.Query query = queryParser.parse(sb.toString());
System.out.print("Pergunta n鷐ero: " + queryPergunta.indexOf(p) + " - ");
System.out.println(query.toString());
searcher.search(query, collector);
}
ScoreDoc[] hits = collector.topDocs().scoreDocs;
List<Documento> respostasEncontradas = new ArrayList<Documento>();
for (int i = 0; i < hits.length; i++) {
int docId = hits[i].doc;
Document d = searcher.doc(docId);
String numeroRegistro = d.get("numeroRegistro").trim();
Documento documento = (Documento) em.createQuery("select d from Documento d where d.numeroRegistro = ?").setParameter(1, numeroRegistro).getSingleResult();
respostasEncontradas.add(documento);
}
double numeroRespostasRelevantes = Double.parseDouble(p.getNumeroResultados());
List<ItemScore> respostasRelevantes = p.getItens();
List<PrecisionRecall> documentosRelevantes = verificaDocumentosRelevantes(respostasEncontradas, respostasRelevantes, numeroRespostasRelevantes);
calculaPrecision(precisionRecallPergunta, documentosRelevantes);
acumula(precisionRecallPergunta, totalArrayPrecision);
}
searcher.close();
indexReader.close();
geraMediaPrecision(totalArrayPrecision, numeroPerguntas);
} catch (Exception e) {
e.printStackTrace();
}
return totalArrayPrecision;
}
public static void processaDocumentos(EntityManager em, String campo) {
Map<String, List<FrequenciaTermo>> listaInvertida = new HashMap<String, List<FrequenciaTermo>>();
List<Documento> listDocumentos = em.createQuery("select d from Documento d").getResultList();
for (Documento d: listDocumentos) {
System.out.println("Avaliando documento: " + d.getNumeroRegistro());
String infoCampo;
if (campo.equals(Avaliador.TITULO)) {
infoCampo = trataString(d.getTitulo());
} else {
infoCampo = trataString(d.getTextoAbstract());
}
String numeroRegistro = d.getNumeroRegistro();
StringTokenizer tokenizer = new StringTokenizer(infoCampo, " ");
while (tokenizer.hasMoreElements()) {
String key = tokenizer.nextToken();
List<FrequenciaTermo> documentos = listaInvertida.get(key);
if (documentos == null) {
documentos = new ArrayList<FrequenciaTermo>();
FrequenciaTermo frequenciaTermo = new FrequenciaTermo();
frequenciaTermo.setNumeroDocumento(numeroRegistro);
frequenciaTermo.setQuantidade(1);
documentos.add(frequenciaTermo);
listaInvertida.put(key, documentos);
} else {
boolean encontrou = false;
for (FrequenciaTermo ft: documentos) {
if (ft.getNumeroDocumento().equals(numeroRegistro)) {
ft.setQuantidade(ft.getQuantidade() + 1);
encontrou = true;
}
}
if (!encontrou) {
FrequenciaTermo frequenciaTermo = new FrequenciaTermo();
frequenciaTermo.setNumeroDocumento(numeroRegistro);
frequenciaTermo.setQuantidade(1);
documentos.add(frequenciaTermo);
}
}
}
}
Set s = listaInvertida.keySet();
Iterator it = s.iterator();
while (it.hasNext()) {
String key = (String) it.next();
System.out.println("palavra: " + key);
List<FrequenciaTermo> lista = listaInvertida.get(key);
for (FrequenciaTermo f: lista) {
System.out.println("Doc: " + f.getNumeroDocumento() + " - Quantidade: " + f.getQuantidade());
}
}
List<Pergunta> listPerguntas = em.createQuery("select p from Pergunta p").getResultList();
for (Pergunta p: listPerguntas) {
String perguntaModificada = trataString(p.getQuery());
StringTokenizer tokenizer = new StringTokenizer(perguntaModificada, " ");
while (tokenizer.hasMoreElements()) {
String key = tokenizer.nextToken();
List<FrequenciaTermo> lista = listaInvertida.get(key);
System.out.println("Tamanho da lista: " + lista.size());
}
}
System.out.println("Tudo esta ok");
}
private static String trataString(String conteudo) {
String conteudoModificado = conteudo.trim().toLowerCase().replaceAll("\\?", "").replaceAll("\n", " ").replaceAll("\\(", "").replaceAll("\\)", "").replaceAll(":", "").replaceAll("^", "").replaceAll("~", "").replaceAll("!", "").replaceAll("[0-9]*", "").replaceAll("\\.", "").replaceAll(",", "");
File fileStopWords = new File("stopwords.txt");
String[] listaStopWords = listaStopWords(fileStopWords);
StringBuilder sb = new StringBuilder();
StringTokenizer tokenizer = new StringTokenizer(conteudoModificado, " ");
while (tokenizer.hasMoreElements()) {
String token = tokenizer.nextToken();
boolean encontrei = false;
for (int i = 0; i < listaStopWords.length; i++) {
if (token.equals(listaStopWords[i])) {
encontrei = true;
break;
}
}
if (!encontrei) {
char[] conteudoToken = token.toCharArray();
Stemmer stemmer = new Stemmer();
stemmer.add(conteudoToken, conteudoToken.length);
stemmer.stem();
sb.append(stemmer.toString() + " ");
}
}
return sb.toString().toUpperCase();
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -