Beispiel #1
0
        /// <summary>
        /// Threads
        /// </summary>
        private static void Threads_VisaoLogica()
        {
            List <string> Vocabulario_Arquivo = new List <string>();
            string        ArquivoAtual;

            lock (ReadOnlyObject)   //Bloqueia acesso a pilha Documentos
            {
                //Le e retira o documento da pilha
                ArquivoAtual = Documentos.Peek();
                Documentos.Dequeue();
            }

            try
            {
                StreamReader sr = new StreamReader(ArquivoAtual, Encoding.UTF8); //Novo leitor

                while (!sr.EndOfStream)
                {
                    string[] splitAux = { " ", "<", ">", "/key", "/think" };
                    string[] Linha    = TratamentoDeTexto.TransformacaoLexica(sr.ReadLine()).Split(splitAux, StringSplitOptions.RemoveEmptyEntries); //Divide as palavras

                    foreach (string Palavra in Linha)                                                                                                //Para cada palavra
                    {
                        if (!Vocabulario_Arquivo.Contains(Palavra) && Palavra != "" && Palavra != null)                                              //Verifica se ja existe na lista
                        {
                            Vocabulario_Arquivo.Add(Palavra);                                                                                        //Adiciona na lista
                        }
                    }
                }

                sr.Close();                 //Fecha arquivo

                Vocabulario_Arquivo.Sort(); //Ordena vocabulario

                string[] aux = ArquivoAtual.Split('\\');

                string caminho = Configuracoes.Diretorio_VisaoLogica() + "\\" + aux[aux.Count() - 1];


                //Escreve arquivo de visao logica do arquivo
                File.WriteAllLines(caminho, Vocabulario_Arquivo, Encoding.UTF8);

                ModuloFuncionando = false;
            }
            catch (Exception ex)
            {
                RegistroDeExcessoes.Incluir(new Excessao("Erro ao tentar ler, escrever e processar arquivo", ex.ToString()));
            }

            return;
        }
Beispiel #2
0
        /// <summary>
        /// Frequencia do termo no documento
        /// </summary>
        private static int Frequencia(int IndiceVoc, int IndiceDoc)
        {
            int cont = 0;

            try
            {
                if (VetorDocumentosBM25 == null)
                {
                    //Vetor de documentos e linhas destes
                    VetorDocumentosBM25 = new string[Arquivos_Info.Count()][];

                    string[] splitAux = { " ", "<", ">", "/key", "/think" };

                    ListaLogs.Add("Carregando arquivos");
                    foreach (FileInfo Arquivo in Arquivos_Info.OrderBy(p => p.Name))    //Para cada arquivo
                    {
                        Porcentagem = (cont * 100 / Arquivos_Info.Count()).ToString();
                        string[] aux = TratamentoDeTexto.TransformacaoLexica(File.ReadAllText(Arquivo.FullName)).Split(splitAux, StringSplitOptions.RemoveEmptyEntries);
                        VetorDocumentosBM25[cont++] = aux;  //Carrega todas as linhas
                    }
                }

                string Termo = Vocabulario[IndiceVoc];

                cont = 0;

                foreach (string item in VetorDocumentosBM25[IndiceDoc])
                {
                    if (item == Termo)
                    {
                        cont++;
                    }
                }
            }
            catch (Exception ex)
            {
                RegistroDeExcessoes.Incluir(new Excessao("Erro ao calcular frequencia do termo", ex.ToString()));

                ModuloFuncionando = false;
            }

            if (cont > 9)
            {
                return(9);
            }
            else
            {
                return(cont);
            }
        }
Beispiel #3
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
        }
Beispiel #4
0
        private static void ConstruirMatrizBM()
        {
            try
            {
                Diretorio_Documentos = new DirectoryInfo(Configuracoes.Diretorio_Documentos());             //Informacoes do diretorio
                Arquivos_Info        = Diretorio_Documentos.GetFiles("*.txt", SearchOption.AllDirectories); //Informacoes dos arquivos

                Vocabulario.AddRange(File.ReadAllLines(Configuracoes.Caminho_Vocabulario()));
                int tamanhovocabulario = Vocabulario.Count;

                BMMatriz = new string[tamanhovocabulario];

                int Contador = 0;
                int Aux      = 0;
                Contador = 0;
                int NumMaximoThreads = 10;


                DirectoryInfo D  = new DirectoryInfo(Configuracoes.Diretorio_ColecaoBM25());
                FileInfo[]    AD = D.GetFiles("*.txt", SearchOption.AllDirectories);

                IndiceBM25 = AD.Count();
                //IndiceBM25 = 2200; tamanhovocabulario = 2201;
                Contador = IndiceBM25;


                if (IndiceBM25 != tamanhovocabulario)
                {
                    Thread[] NovaThread = new Thread[tamanhovocabulario];

                    //Vetor de documentos e linhas destes
                    VetorDocumentosBM25 = new string[Arquivos_Info.Count()][];

                    string[] splitAux = { " ", "<", ">", "/key", "/think" };


                    int cont = 0;
                    ListaLogs.Add("Carregando arquivos");
                    foreach (FileInfo Arquivo in Arquivos_Info.OrderBy(p => p.Name))    //Para cada arquivo
                    {
                        Porcentagem = (cont * 100 / Arquivos_Info.Count()).ToString();
                        string[] aux = TratamentoDeTexto.TransformacaoLexica(File.ReadAllText(Arquivo.FullName)).Split(splitAux, StringSplitOptions.RemoveEmptyEntries);
                        VetorDocumentosBM25[cont++] = aux;  //Carrega todas as linhas
                    }

                    ListaLogs.Add("Iniciando threads");

                    for (int i = IndiceBM25; i < tamanhovocabulario; i++)
                    {
                        Porcentagem = (i * 100 / tamanhovocabulario).ToString() + "%";

                        NovaThread[i]          = new Thread(Threads_ConstruirMatrizBM); //Thread para o arquivo
                        NovaThread[i].Priority = ThreadPriority.Highest;

                        NovaThread[i].Start();       //Inicia thread

                        Aux++;                       //Incrementa contador

                        if (Aux >= NumMaximoThreads) //Controla quantidade de threads lancadas
                        {
                            ListaLogs.Add("Aguardando threads terminarem");
                            for (int j = Contador; j <= i; j++)  //Aguarda cada thread acabar
                            {
                                NovaThread[j].Join();
                            }

                            ListaLogs.Add("Escrevendo buffer");
                            for (int j = Contador; j <= i; j++)  //Aguarda cada thread acabar
                            {
                                File.WriteAllText(Configuracoes.Diretorio_ColecaoBM25() + "\\" + j + ".txt", BMMatriz[j], Encoding.UTF8);
                                BMMatriz[j] = null;
                            }

                            Aux       = 0;
                            Contador += NumMaximoThreads;    //Controle de ultima thread que terminou o processamento

                            ListaLogs.Add("Iniciando threads");
                        }
                    }

                    Porcentagem = "100%";

                    ListaLogs.Add("Aguardando threads terminarem");
                    for (int j = Contador; j < tamanhovocabulario; j++)    //Aguarda as threads restantes acabarem
                    {
                        NovaThread[j].Join();
                    }

                    ListaLogs.Add("Escrevendo buffer");
                    for (int j = Contador; j < tamanhovocabulario; j++)  //Aguarda cada thread acabar
                    {
                        File.WriteAllText(Configuracoes.Diretorio_ColecaoBM25() + "\\" + j + ".txt", BMMatriz[j], Encoding.UTF8);
                        BMMatriz[j] = null;
                    }
                }

                VetorDocumentosBM25 = null;

                ListaLogs.Add("Agrupando vetores BM25");

                try
                {
                    for (int i = 0; i < tamanhovocabulario; i++)
                    {
                        Porcentagem = (i * 100 / tamanhovocabulario).ToString() + "%";

                        BMMatriz[i] = File.ReadAllText(Configuracoes.Diretorio_ColecaoBM25() + "\\" + i + ".txt", Encoding.UTF8);    //Adiciona na matriz
                    }

                    Porcentagem = "100%";
                }
                catch (Exception ex)
                {
                    ListaLogs.Add("Memória insuficiente");

                    BMMatriz = null;

                    RegistroDeExcessoes.Incluir(new Excessao("Erro ao agrupar vetores BM25", ex.ToString()));

                    ModuloFuncionando = false;

                    return;
                }

                try
                {
                    ListaLogs.Add("Escrevendo agrupamento de vetores de BM25");
                    //Escreve todas as linhas
                    File.WriteAllLines(Configuracoes.Caminho_VetoresBM25(), BMMatriz, Encoding.UTF8);
                }
                catch (Exception ex)
                {
                    RegistroDeExcessoes.Incluir(new Excessao("Erro ao escrever vetores BM25", ex.ToString()));

                    ModuloFuncionando = false;
                }
            }
            catch (Exception ex)
            {
                RegistroDeExcessoes.Incluir(new Excessao("Erro ao escrever vetores BM25", ex.ToString()));

                ModuloFuncionando = false;
            }

            return;
        }
Beispiel #5
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);
        }