void ProcesadorConsulta::filtrarPosiciones(list<int> & posiciones, Posicion posicion) { list<int> pos = posicion.getPosiciones(); list<int> :: iterator itPosiciones = pos.begin(); posiciones.push_back(*itPosiciones); }
int ProcesadorConsulta::procesarPosiciones(list<Posicion> & posiciones) { list<Posicion> :: iterator itPosiciones = posiciones.begin(); list<int> pos; list<Posicion> posicionesMinimas; int distancia = -1; Posicion posicionActual = *itPosiciones; ++itPosiciones; Posicion posicionSiguiente; Posicion posicionCalculada; bool procesar = true; while(itPosiciones != posiciones.end() && procesar) { posicionSiguiente = *itPosiciones; posicionCalculada = this->compararPosiciones(posicionActual,posicionSiguiente,posicionesMinimas); posicionActual = posicionCalculada; if(posicionCalculada.getPosiciones().size() == 0) procesar = false; ++itPosiciones; } //Actualizo la lista de posiciones con la minima. posiciones.clear(); list<Posicion> :: iterator itPosicionesMinimas = posicionesMinimas.begin(); while(itPosicionesMinimas != posicionesMinimas.end()) { Posicion posActual = *itPosicionesMinimas; posiciones.push_back(posActual); itPosicionesMinimas++; } itPosicionesMinimas = posicionesMinimas.begin(); //Una vez que tenemos todas las posiciones en una misma lista las comparamos while(itPosicionesMinimas != posicionesMinimas.end()) { Posicion posicionActual = *itPosicionesMinimas; this->filtrarPosiciones(pos,posicionActual); ++itPosicionesMinimas; } if(procesar) distancia = compararPosiciones(pos); return distancia; }
list<int> ProcesadorConsulta::filtrarRanqueada(Palabra palabra) { list<int> documentos; // cantidadApariciones representa la cantidad de libros donde hay coincidencias int cantidadApariciones = (palabra.getApariciones()).size(); int frecTerminoEnDoc = 0; list<Aparicion>::iterator itAparicionFiltrada; list<Posicion> posicionEnDoc; list<Posicion>::iterator itPosicionEnDoc; list<int>::iterator itPosicionDocumentos; Aparicion aparicion; Posicion posicion; float pesoGlobal, mayorPeso, pesoTerminosEnDocumento, normaDocumento, sumaParcial; CalculadorDePesoGlobal calcPesoGlobal; int cantPalabras = 0; int cantDocumentosTermino = 0; list<Aparicion> apariciones = palabra.getApariciones(); ProcesadorNorma procesadorNorma; itAparicionFiltrada = apariciones.begin(); // por cada documento hay una aparicion for (int a = 0; a<cantidadApariciones; a++){ sumaParcial = 0; pesoTerminosEnDocumento = 0; aparicion = *itAparicionFiltrada; // Calculo el peso: // para eso recorro la lista de posiciones (cada una representa a una palabra) y calculo su peso y su frecuencia cantPalabras = (aparicion.getPosiciones()).size(); posicionEnDoc = aparicion.getPosiciones(); itPosicionEnDoc = posicionEnDoc.begin(); for (int c = 0; c < cantPalabras; c++){ posicion = *itPosicionEnDoc; frecTerminoEnDoc = (posicion.getPosiciones()).size(); cantDocumentosTermino = procesadorNorma.buscarPesoTermino(posicion.getIdPalabra()); pesoGlobal = calcPesoGlobal.calcularPesoGlobalTermino(cantDocumentosTermino); sumaParcial += frecTerminoEnDoc * pesoGlobal; ++itPosicionEnDoc; } normaDocumento = procesadorNorma.consultarNorma(aparicion.getIdDocumento()); pesoTerminosEnDocumento = sumaParcial / normaDocumento; // Si la lista de documentos esta vacia, no importa el peso que tenga, sera siempre el de mayor peso hasta ahora if (documentos.empty()){ documentos.push_back(aparicion.getIdDocumento()); mayorPeso = pesoTerminosEnDocumento; } else { // Comparo pesos if (pesoTerminosEnDocumento > mayorPeso){ int cantDocumentosADevolver = documentos.size(); // Vacio la lista de documentos for (int d = 0; d<cantDocumentosADevolver; d++){ documentos.pop_back(); } // Inserto el id del documento con mayor peso documentos.push_back(aparicion.getIdDocumento()); mayorPeso = pesoTerminosEnDocumento; } else if (pesoTerminosEnDocumento == mayorPeso){ // Si el peso es el mismo, agrego el id del documento a la lista documentos.push_back(aparicion.getIdDocumento()); } } ++itAparicionFiltrada; } return documentos; }
Posicion ProcesadorConsulta::compararPosiciones(Posicion posicionActual, Posicion posicionSiguiente, list<Posicion> & posicionesMinimas) { list<int> posiciones1 = posicionActual.getPosiciones(); list<int> posiciones2 = posicionSiguiente.getPosiciones(); list<int> :: iterator itPosiciones1 = posiciones1.begin(); list<int> :: iterator itPosiciones2; int distanciaMinima = 0; int distanciaMinimaAnterior = 0; Posicion posicionMinima; while(itPosiciones1!= posiciones1.end()) { int pos1Actual = *itPosiciones1; itPosiciones2 = posiciones2.begin(); while(itPosiciones2 != posiciones2.end()) { int pos2Actual = *itPosiciones2; if(pos1Actual < pos2Actual) { distanciaMinima = abs(pos2Actual - pos1Actual); if(distanciaMinimaAnterior == 0) distanciaMinimaAnterior = distanciaMinima; if(distanciaMinima < distanciaMinimaAnterior) { distanciaMinimaAnterior = distanciaMinima; posicionesMinimas.clear(); crearPosicionesNuevas(posicionActual.getPalabra(),pos1Actual,posicionSiguiente.getPalabra(),pos2Actual,posicionesMinimas); } else if(distanciaMinima == distanciaMinimaAnterior) crearPosicionesNuevas(posicionActual.getPalabra(),pos1Actual,posicionSiguiente.getPalabra(),pos2Actual,posicionesMinimas); } itPosiciones2++; } itPosiciones1++; } list<Posicion> :: iterator itPosicionesMinimas = posicionesMinimas.begin(); bool encontrado = false; while(itPosicionesMinimas != posicionesMinimas.end() && !encontrado) { Posicion posicionActual = *itPosicionesMinimas; if(posicionActual.getPalabra() == posicionSiguiente.getPalabra()) { posicionMinima = posicionActual; encontrado = true; } itPosicionesMinimas++; } return posicionMinima; }