/// <summary> /// Consulta base de de dados utilizando o modelo probabilistico /// </summary> public SortedDictionary <string, double> Consultar(string Frase) { try { Frase = TratamentoDeTexto.Eliminacao_Stopwords(Frase); DocumentoseRelevantes = new SortedDictionary <string, double>(); //Colecao de arquivos com nome e relevancia //if (VocabularioContem(Termo)) //Se o vocabulario contem o termo //{ foreach (string Termo in Frase.Split(' ')) { if (Vocabulario.Contains(Termo)) //Se o vocabulario contem o termo { //int Indice = Vocabulario.IndexOf(TermoDoVocabulario); //Indice do termo no vocabulario int Indice = Vocabulario.IndexOf(Termo); //Indice do termo no vocabulario int n = 0; //Quantidade de documentos que contem o termo for (int i = 0; i < listaBinaria[Indice].Length; i++) //Percorre Matriz { if (listaBinaria[Indice][i] == true) //Se contem o termo no documento { n++; //Incrementa o numero de documentos que contem o termo } } //Calcula peso com base na formaula do modelo probabilistico double Peso = Math.Log((QuantidadeDocumentos + 0.5) / (n + 0.5), 2); for (int i = 0; i < listaBinaria[Indice].Length; i++) //Para cada elemento de matriz { if (listaBinaria[Indice][i] == true) //Se o termo existe no arquivo { try { if (DocumentoseRelevantes.ContainsKey(Arquivo[i])) //Se o documento ja estiver na colecao { DocumentoseRelevantes[Arquivo[i]] = double.Parse(DocumentoseRelevantes[Arquivo[i]].ToString()) + Peso; //Incrementa o peso } else { DocumentoseRelevantes.Add(Arquivo[i], Peso); //Armazena o peso } } catch (Exception) { ModuloFuncionando = false; } } } } else if (VocabularioContem(Termo)) { int Indice = Vocabulario.IndexOf(TermoDoVocabulario); //Indice do termo no vocabulario int n = 0; //Quantidade de documentos que contem o termo for (int i = 0; i < listaBinaria[Indice].Length; i++) //Percorre Matriz { if (listaBinaria[Indice][i] == true) //Se contem o termo no documento { n++; //Incrementa o numero de documentos que contem o termo } } //Calcula peso com base na formaula do modelo probabilistico double Peso = Math.Log((QuantidadeDocumentos + 0.5) / (n + 0.5), 2); for (int i = 0; i < listaBinaria[Indice].Length; i++) //Para cada elemento de matriz { if (listaBinaria[Indice][i] == true) //Se o termo existe no arquivo { try { if (DocumentoseRelevantes.ContainsKey(Arquivo[i])) //Se o documento ja estiver na colecao { DocumentoseRelevantes[Arquivo[i]] = double.Parse(DocumentoseRelevantes[Arquivo[i]].ToString()) + Peso; //Incrementa o peso } else { DocumentoseRelevantes.Add(Arquivo[i], Peso); //Armazena o peso } } catch (Exception ex) { RegistroDeExcessoes.Incluir(new Excessao("Erro no meodelo probabilístico clássico", ex.ToString())); ModuloFuncionando = false; } } } } } } catch (Exception ex) { RegistroDeExcessoes.Incluir(new Excessao("Erro no modelo probabiístico clássico", ex.ToString())); ModuloFuncionando = false; DocumentoseRelevantes = null; } return(DocumentoseRelevantes); //Documentos relevantes encontrados }
//Metrica de similaridade do BM25 public SortedDictionary <string, double> Similaridade_BM25(string Frase) { SortedDictionary <string, double> DocumentoseRelevantes = new SortedDictionary <string, double>(); //Colecao de arquivos com nome e relevancia try { Frase = TratamentoDeTexto.Eliminacao_Stopwords(Frase); foreach (string Termo in Frase.Split(' ')) { if (Vocabulario.Contains(Termo)) //Se o vocabulario contem o termo { int Indice = Vocabulario.IndexOf(Termo); //Indice do termo no vocabulario int ni = 0; //Quantidade de documentos que contem o termo bool[] aux = new bool[4]; for (int i = 0; i < listaBinariaBM25[Indice].Length; i += 4) //Percorre Matriz { aux[0] = listaBinariaBM25[Indice][i + 0]; aux[1] = listaBinariaBM25[Indice][i + 1]; aux[2] = listaBinariaBM25[Indice][i + 2]; aux[3] = listaBinariaBM25[Indice][i + 3]; if (BinParaInt(aux) != 0) //Se contem o termo no documento { ni++; //Incrementa o numero de documentos que contem o termo } } //Calcula peso com base na formaula do modelo probabilistico double Peso = Math.Log10((N - ni + 0.5) / (ni + 0.5)); for (int i = 0; i < listaBinariaBM25[Indice].Length; i += 4) //Para cada elemento de matriz { aux[0] = listaBinariaBM25[Indice][i + 0]; aux[1] = listaBinariaBM25[Indice][i + 1]; aux[2] = listaBinariaBM25[Indice][i + 2]; aux[3] = listaBinariaBM25[Indice][i + 3]; if (BinParaInt(aux) != 0) //Se o termo existe no arquivo { if (DocumentoseRelevantes.ContainsKey(Arquivo[i / 4])) //Se o documento ja estiver na colecao { DocumentoseRelevantes[Arquivo[i / 4]] = double.Parse(DocumentoseRelevantes[Arquivo[i / 4]].ToString()) + Bij(BinParaInt(aux), FrequenciaIndividual[i / 4]) * Peso; //Incrementa o peso } else { DocumentoseRelevantes.Add(Arquivo[i / 4], Bij(BinParaInt(aux), FrequenciaIndividual[i / 4]) * Peso); //Armazena o peso } } } } else if (VocabularioContem(Termo)) { int Indice = Vocabulario.IndexOf(TermoDoVocabulario); int ni = 0; bool[] aux = new bool[4]; for (int i = 0; i < listaBinariaBM25[Indice].Length; i += 4) //Percorre Matriz { aux[0] = listaBinariaBM25[Indice][i + 0]; aux[1] = listaBinariaBM25[Indice][i + 1]; aux[2] = listaBinariaBM25[Indice][i + 2]; aux[3] = listaBinariaBM25[Indice][i + 3]; if (BinParaInt(aux) != 0) //Se contem o termo no documento { ni++; //Incrementa o numero de documentos que contem o termo } } //Calcula peso com base na formaula do modelo probabilistico double Peso = Math.Log10((N - ni + 0.5) / (ni + 0.5)); for (int i = 0; i < listaBinariaBM25[Indice].Length; i += 4) //Para cada elemento de matriz { aux[0] = listaBinariaBM25[Indice][i + 0]; aux[1] = listaBinariaBM25[Indice][i + 1]; aux[2] = listaBinariaBM25[Indice][i + 2]; aux[3] = listaBinariaBM25[Indice][i + 3]; if (BinParaInt(aux) != 0) //Se o termo existe no arquivo { if (DocumentoseRelevantes.ContainsKey(Arquivo[i / 4])) //Se o documento ja estiver na colecao { DocumentoseRelevantes[Arquivo[i / 4]] = double.Parse(DocumentoseRelevantes[Arquivo[i / 4]].ToString()) + Bij(BinParaInt(aux), FrequenciaIndividual[i / 4]) * Peso; //Incrementa o peso } else { DocumentoseRelevantes.Add(Arquivo[i / 4], Bij(BinParaInt(aux), FrequenciaIndividual[i / 4]) * Peso); //Armazena o peso } } } } } } catch (Exception ex) { RegistroDeExcessoes.Incluir(new Excessao("Erro ao calcular similaridade no BM25", ex.ToString())); ModuloFuncionando = false; } return(DocumentoseRelevantes); }