Exemple #1
0
        /// <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
        }
Exemple #2
0
        //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);
        }