⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 avaliador.java

📁 Calculate TFIDF using MySQL and Lucene on Cystic Fibrosis
💻 JAVA
📖 第 1 页 / 共 2 页
字号:
		} 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 + -