Exemple #1
0
        /// <summary>
        /// Carrega a colecao de documentos
        /// </summary>
        public static void CarregarListaArquivos()
        {
            ListaLogs.Add("");
            try
            {
                Arquivo = new string[Arquivos_Info.Count()];

                int cont = 0;

                //Adiciona cada arquivo do diretorio no vetor, ordenados pelo nome
                foreach (FileInfo item in Arquivos_Info.OrderBy(p => p.Name))
                {
                    Porcentagem = (cont * 100 / Arquivos_Info.Count()).ToString() + "%";

                    Arquivo[cont++] = item.FullName;
                }

                Porcentagem = "100%";
            }
            catch (Exception ex)
            {
                RegistroDeExcessoes.Incluir(new Excessao("Erro ao carregar lista de arquivos", ex.ToString()));

                ModuloFuncionando = false;
            }
        }
Exemple #2
0
        /// <summary>
        /// Refaz visao logica, vocabulario e vetores binarios
        /// </summary>
        public static void Reconstruir()
        {
            try
            {
                VerificarDiretorios();

                //DirectoryInfo Diretorio = new DirectoryInfo(Configuracoes.Diretorio_VisaoLogica());
                //Diretorio.Delete(true);
                //File.Delete(Configuracoes.Caminho_Vocabulario());
                //File.Delete(Configuracoes.Caminho_VetoresBinarios());

                VerificarDiretorios();

                Documentos           = new Queue <string>();                                                        //Documentos do diretorio
                Diretorio_Documentos = new DirectoryInfo(Configuracoes.Diretorio_Documentos());                     //Informacoes do diretorio
                Arquivos_Info        = Diretorio_Documentos.GetFiles("*.txt", SearchOption.AllDirectories);         //Informacoes dos arquivos
                Arquivo              = new string[Arquivos_Info.Count()];
                Vocabulario          = new List <string>();                                                         //Lista de palavras do vocabulario
                QuantidadeDocumentos = Diretorio_Documentos.GetFiles("*.txt", SearchOption.AllDirectories).Count(); //Quantidade de documentos no diretorio

                //Construir_VisaoLogica();
                //Construir_Vocabulario();
                Construir_VetoresBinarios();
            }
            catch (Exception ex)
            {
                RegistroDeExcessoes.Incluir(new Excessao("Erro ao tentar reconstruir elementos do modelo", ex.ToString()));
                ModuloFuncionando = false;
            }

            return;
        }
Exemple #3
0
        /// <summary>
        /// Novo objeto BM25
        /// </summary>
        public BM25()
        {
            ModuloFuncionando = true;

            try
            {
                Diretorio_Documentos = new DirectoryInfo(Configuracoes.Diretorio_Documentos());             //Informacoes do diretorio
                Arquivos_Info        = Diretorio_Documentos.GetFiles("*.txt", SearchOption.AllDirectories); //Informacoes dos arquivos

                N = Diretorio_Documentos.GetFiles("*.txt", SearchOption.AllDirectories).Count();

                if (Vocabulario.Count() == 0)
                {
                    Vocabulario.AddRange(File.ReadAllLines(Configuracoes.Caminho_Vocabulario()));
                }

                //if (BMMatriz == null)
                //    CarregarVetores();

                if (FrequenciaIndividual == null)
                {
                    string[] aux = File.ReadAllLines(Configuracoes.Diretorio_MP() + "Tamanho dos documentos.txt");

                    FrequenciaIndividual = new int[aux.Count()];

                    for (int i = 0; i < aux.Count(); i++)
                    {
                        FrequenciaIndividual[i] = int.Parse(aux[i]);
                    }
                }

                if (avg_doclen == 0)
                {
                    avg_doclen = double.Parse(File.ReadAllText(Configuracoes.Diretorio_MP() + "Tamanho medio dos documentos.txt"));
                }


                int cont = 0;
                //Adiciona cada arquivo do diretorio no vetor, ordenados pelo nome
                if (Arquivo == null)
                {
                    Arquivo = new string[Arquivos_Info.Count()];

                    foreach (FileInfo item in Arquivos_Info.OrderBy(p => p.Name))
                    {
                        Porcentagem = (cont * 100 / Arquivos_Info.Count()).ToString() + "%";

                        Arquivo[cont++] = item.FullName;
                    }

                    Porcentagem = "100%";
                }
            }
            catch (Exception ex)
            {
                RegistroDeExcessoes.Incluir(new Excessao("Erro na inicialização do modelo BM25", ex.ToString()));

                ModuloFuncionando = false;
            }
        }
Exemple #4
0
        /// <summary>
        /// Novo objeto Modelo_Probabilistico_Classico
        /// </summary>
        public Modelo_Probabilistico_Classico()
        {
            ModuloFuncionando = true;

            try
            {
                Diretorio_Documentos = new DirectoryInfo(Configuracoes.Diretorio_Documentos());                     //Informacoes do diretorio
                Arquivos_Info        = Diretorio_Documentos.GetFiles("*.txt", SearchOption.AllDirectories);         //Informacoes dos arquivos
                Vocabulario          = new List <string>();                                                         //Lista de palavras do vocabulario
                QuantidadeDocumentos = Diretorio_Documentos.GetFiles("*.txt", SearchOption.AllDirectories).Count(); //Quantidade de documentos no diretorio

                //Carrega vocabulario
                if (Vocabulario.Count() == 0)
                {
                    Vocabulario.AddRange(File.ReadAllLines(Configuracoes.Caminho_Vocabulario()));
                }

                if (listaBinaria == null)
                {
                    CarregarVetores();
                }

                if (Arquivo == null)
                {
                    CarregarListaArquivos();
                }
            }
            catch (Exception ex)
            {
                RegistroDeExcessoes.Incluir(new Excessao("Erro na inicialização do modelo", ex.ToString()));

                ModuloFuncionando = false;
            }
        }
Exemple #5
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;
        }
Exemple #6
0
        /// <summary>
        /// Constroi vocabulario
        /// </summary>
        private static void Construir_Vocabulario()
        {
            try
            {
                //Informacoes sobre o diretorio de visao logica
                DirectoryInfo DiretorioVL = new DirectoryInfo(Configuracoes.Diretorio_VisaoLogica());

                //Informacoes sobre os arquivos de visao logica
                FileInfo[] ArquivosVL = DiretorioVL.GetFiles("*.txt", SearchOption.AllDirectories);

                StreamReader sr;                                                                //Novo leitor

                List <string> Lista_Vocabulario = new List <string>();                          //Lista de vocabulario
                string Linha;                                                                   //Linha lida de um arquivo

                foreach (FileInfo Arquivo in ArquivosVL)                                        //Para cada arquivo
                {
                    sr = new StreamReader(Arquivo.FullName, Encoding.UTF8);                     //Abre arquivo

                    while (!sr.EndOfStream)                                                     //Enquanto o arquivo nao terminar
                    {
                        Linha = sr.ReadLine();                                                  //Le linha

                        if (!Lista_Vocabulario.Contains(Linha) && Linha != "" && Linha != null) //Se nao existir na linha
                        {
                            Lista_Vocabulario.Add(Linha);                                       //Adiciona palavra na lista
                        }
                    }

                    sr.Close(); //Fecha o arquivo
                }

                Lista_Vocabulario.Sort();   //Ordena a lista

                try
                {
                    //Escreve as palavras no arquivo
                    File.WriteAllLines(Configuracoes.Caminho_Vocabulario(), Lista_Vocabulario, Encoding.UTF8);
                }
                catch (Exception)
                {
                    ModuloFuncionando = false;
                }
            }
            catch (Exception ex)
            {
                RegistroDeExcessoes.Incluir(new Excessao("Erro ao tentar contruir vocabulário", ex.ToString()));
            }

            return;
        }
Exemple #7
0
        /// <summary>
        /// Constroi visao logica
        /// </summary>
        private static void Construir_VisaoLogica()
        {
            try
            {
                foreach (FileInfo Arquivo in Arquivos_Info)      //Empilha arquivos nao pilha
                {
                    Documentos.Enqueue(Arquivo.FullName);
                }

                int QuantDocumentos = Documentos.Count();          //Quantidade de documentos

                Thread[] NovaThread = new Thread[QuantDocumentos]; //Cria uma thread para cada documento

                //Variaveis auxiliares para controle de threads lancadas
                int Aux              = 0;
                int Contador         = 0;
                int NumMaximoThreads = 5;

                //Dispara NumMaximoThreads threads de cada vez
                for (int i = 0; i < QuantDocumentos; i++)
                {
                    NovaThread[i] = new Thread(Threads_VisaoLogica); //Thread para o arquivo

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

                    Aux++;                                           //Incrementa contador

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

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

                for (int j = Contador; j < QuantDocumentos; j++)    //Aguarda as threads restantes acabarem
                {
                    NovaThread[j].Join();
                }
            }
            catch (Exception ex)
            {
                RegistroDeExcessoes.Incluir(new Excessao("Erro ao tentar contruir visão lógica", ex.ToString()));
            }

            return;
        }
Exemple #8
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);
            }
        }
Exemple #9
0
        /// <summary>
        /// Equacao Bij
        /// </summary>
        private double Bij(int fij, int len)
        {
            try
            {
                return(((k1 + 1) * fij) / (k1 * Math.Abs(((1 - b) + b * (len / avg_doclen))) + fij));
            }
            catch (Exception ex)
            {
                RegistroDeExcessoes.Incluir(new Excessao("Erro ao calcular Bij", ex.ToString()));

                ModuloFuncionando = false;
            }

            return(0);
        }
Exemple #10
0
        /// <summary>
        /// Carrega vetores binarios
        /// </summary>
        public static void CarregarVetores()
        {
            listaBinaria = new List <BitArray>();
            List <bool> encodedSource;
            BitArray    bits;

            try
            {
                ListaLogs.Add("|Carregando vetores MPC                                   |");
                StreamReader sr = new StreamReader(Configuracoes.Caminho_VetoresBinarios());

                while (!sr.EndOfStream)
                {
                    encodedSource = new List <bool>();

                    string source = sr.ReadLine();

                    for (int i = 0; i < source.Length; i++)
                    {
                        if (source[i] == '0')
                        {
                            encodedSource.Add(false);
                        }
                        else
                        {
                            encodedSource.Add(true);
                        }
                    }

                    bits = new BitArray(encodedSource.ToArray());

                    listaBinaria.Add(bits);
                }

                sr.Close();

                ListaLogs.Add("|Vetores carregados - - - - - OK                          |");
            }
            catch (Exception ex)
            {
                RegistroDeExcessoes.Incluir(new Excessao("Erro ao carregar vetores binários", ex.ToString()));

                ModuloFuncionando = false;
            }

            return;
        }
Exemple #11
0
        /// <summary>
        /// Calcula tamanho dos documentos
        /// </summary>
        private static void CalcularTamanhoDocumentos()
        {
            try
            {
                Diretorio_Documentos = new DirectoryInfo(Configuracoes.Diretorio_Documentos());             //Informacoes do diretorio
                Arquivos_Info        = Diretorio_Documentos.GetFiles("*.txt", SearchOption.AllDirectories); //Informacoes dos arquivos

                string   doc;
                int      QuantidadeDeArquivos = Arquivos_Info.Count();
                int      tamanhoindividual, tamanhototal = 0;
                string[] aux = new string[QuantidadeDeArquivos];

                int cont = 0;

                //Para cada documento
                foreach (FileInfo item in Arquivos_Info.OrderBy(p => p.Name))
                {
                    Porcentagem = (cont * 100 / QuantidadeDeArquivos).ToString() + "%";

                    doc = File.ReadAllText(item.FullName);  //Le texto do documento

                    tamanhoindividual = doc.Split(' ').Count();

                    aux[cont] = tamanhoindividual.ToString();

                    tamanhototal += tamanhoindividual;

                    cont++;
                }

                Porcentagem = "100%";

                avg_doclen = (float)(tamanhototal / QuantidadeDeArquivos);  //Tamanho medio dos documentos

                //Escreve as informacoes obtidas
                File.WriteAllLines(Configuracoes.Diretorio_MP() + "Tamanho dos documentos.txt", aux);
                File.WriteAllText(Configuracoes.Diretorio_MP() + "Tamanho medio dos documentos.txt", avg_doclen.ToString());
            }
            catch (Exception ex)
            {
                RegistroDeExcessoes.Incluir(new Excessao("Erro ao calcular tamanho de documento", ex.ToString()));

                ModuloFuncionando = false;
            }

            return;
        }
Exemple #12
0
        private static void Threads_ConstruirMatrizBM()
        {
            int i;

            lock (ReadOnlyObject4)   //Bloqueia acesso a pilha Documentos
            {
                i = IndiceBM25;
                IndiceBM25++;
            }

            try
            {
                string aux = "";

                for (int j = 0; j < Arquivos_Info.Count(); j++)
                {
                    //if (Matriz[i][j] == '1')
                    aux += Frequencia(i, j);
                    //else
                    //    aux += 0;
                }

                //BMMatriz[i] = aux;

                BMMatriz[i] = aux;
            }
            catch (Exception ex)
            {
                RegistroDeExcessoes.Incluir(new Excessao("Erro ao construir matriz BM25", ex.ToString()));

                ModuloFuncionando = false;
            }

            //try
            //{
            //    //Escreve todas as linhas
            //    //File.WriteAllText(Configuracoes.Diretorio_ColecaoBM25() + "\\" + i + ".txt", aux, Encoding.UTF8);
            //}
            //catch (Exception)
            //{
            //    ListaLogs.Add();
            //}

            return;
        }
Exemple #13
0
        private static void Threads_VetoresBinarios()
        {
            int i;

            lock (ReadOnlyObject2)   //Bloqueia acesso a pilha Documentos
            {
                i = Indice;
                Indice++;
            }

            try
            {
                string aux = "";

                for (int j = 0; j < VetorDocumentos.Count(); j++)       //Para cada documento
                {
                    if (VetorDocumentos[j].Contains(vb_Vocabulario[i])) //Se existe o termo no documento
                    {
                        aux += "1";                                     //Existe o termo
                    }
                    else
                    {
                        aux += "0"; //Nao existe o termo
                    }
                }
                //vb_Matriz[i] = aux;    //Adiciona na matriz

                //Escreve todas as linhas
                File.WriteAllText(Configuracoes.Diretorio_ColecaoVB() + "\\" + i + ".txt", aux, Encoding.UTF8);
            }
            catch (Exception ex)
            {
                RegistroDeExcessoes.Incluir(new Excessao("Erro ao tentar vetor binário", ex.ToString()));

                ModuloFuncionando = false;
            }

            return;
        }
Exemple #14
0
        /// <summary>
        /// Converte de binario para numero inteiro
        /// </summary>
        private static int BinParaInt(bool[] SeqBinaria)
        {
            double x = 0;

            try
            {
                for (int i = 0; i < 4; i++) //Percorre os bits e transforma para numero inteiro
                {
                    if (SeqBinaria[i])
                    {
                        x += Math.Pow(2, 3 - i);
                    }
                }
            }
            catch (Exception ex)
            {
                RegistroDeExcessoes.Incluir(new Excessao("Erro ao fazer conversão", ex.ToString()));

                ModuloFuncionando = false;
            }

            return((int)x);
        }
Exemple #15
0
        /// <summary>
        /// Verifica se as pastas necessarias existem
        /// </summary>
        private static bool VerificarDiretorios()
        {
            try
            {
                //Verifica se todas pastas existem e as criam caso nao existirem
                if (!File.Exists(Configuracoes.Diretorio_MP() + "DOCUMENTOS"))
                {
                    Directory.CreateDirectory(Configuracoes.Diretorio_MP() + "DOCUMENTOS");
                }

                if (!File.Exists(Configuracoes.Diretorio_MP() + "VISAO LOGICA"))
                {
                    Directory.CreateDirectory(Configuracoes.Diretorio_MP() + "VISAO LOGICA");
                }

                return(true);
            }
            catch (Exception ex)
            {
                RegistroDeExcessoes.Incluir(new Excessao("Erro ao tentar identificar diretórios", ex.ToString()));

                return(false);
            }
        }
Exemple #16
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);
        }
Exemple #17
0
        //Carregar vetores
        public static void CarregarVetores_BM25()
        {
            try
            {
                Diretorio_Documentos = new DirectoryInfo(Configuracoes.Diretorio_Documentos());             //Informacoes do diretorio
                Arquivos_Info        = Diretorio_Documentos.GetFiles("*.txt", SearchOption.AllDirectories); //Informacoes dos arquivos

                ListaLogs.Add("|Carregando vetores BM25                                   |");
                listaBinariaBM25 = new List <BitArray>();

                N = Diretorio_Documentos.GetFiles("*.txt", SearchOption.AllDirectories).Count();

                bool[] vetordebits = new bool[4];

                StreamReader sr = new StreamReader(Configuracoes.Caminho_VetoresBM25());

                while (!sr.EndOfStream)
                {
                    string source = sr.ReadLine();

                    BitArray x        = new BitArray(N * 4);
                    int      contador = 0;
                    for (int i = 0; i < source.Length; i++)
                    {
                        switch (source[i])
                        {
                        case '0': vetordebits = new bool[] { false, false, false, false }; break;

                        case '1': vetordebits = new bool[] { false, false, false, true }; break;

                        case '2': vetordebits = new bool[] { false, false, true, false }; break;

                        case '3': vetordebits = new bool[] { false, false, true, true }; break;

                        case '4': vetordebits = new bool[] { false, true, false, false }; break;

                        case '5': vetordebits = new bool[] { false, true, false, true }; break;

                        case '6': vetordebits = new bool[] { false, true, true, false }; break;

                        case '7': vetordebits = new bool[] { false, true, true, true }; break;

                        case '8': vetordebits = new bool[] { true, false, false, false }; break;

                        case '9': vetordebits = new bool[] { true, false, false, true }; break;

                        default: vetordebits = new bool[] { true, false, false, true };
                            break;
                        }

                        x[contador++] = vetordebits[0];
                        x[contador++] = vetordebits[1];
                        x[contador++] = vetordebits[2];
                        x[contador++] = vetordebits[3];
                    }

                    listaBinariaBM25.Add(x);
                }

                sr.Close();

                BMMatriz = null;
                ListaLogs.Add("|Vetores BM25 carregados - - - - - OK                          |");
            }
            catch (Exception ex)
            {
                RegistroDeExcessoes.Incluir(new Excessao("Erro ao calcular vetores do BM25", ex.ToString()));

                ModuloFuncionando = false;
            }

            return;
        }
Exemple #18
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;
        }
Exemple #19
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 #20
0
        /// <summary>
        /// Constroi vetores binarios
        /// </summary>
        private static void Construir_VetoresBinarios()
        {
            try
            {
                //Informacoes sobre o diretorio de visao logica
                DirectoryInfo vb_DiretorioVL = new DirectoryInfo(Configuracoes.Diretorio_VisaoLogica());

                //Informacoes sobre os arquivos de visao logica
                FileInfo[] vb_ArquivosVL = vb_DiretorioVL.GetFiles("*.txt", SearchOption.AllDirectories);

                //Carrega vocabulario
                vb_Vocabulario = File.ReadAllLines(Configuracoes.Caminho_Vocabulario());

                //Vetor de documentos e linhas destes
                VetorDocumentos = new string[vb_ArquivosVL.Count()][];
                //vb_ArquivosVL = null;

                //Matriz para vetores binarios
                string[] vb_Matriz = new string[vb_Vocabulario.Count()];

                //Contador auxiliar
                int Contador = 0;
                int Aux      = 0;

                int NumMaximoThreads   = 100;
                Thread[] NovaThread    = new Thread[vb_Vocabulario.Count()]; //Cria uma thread para cada documento
                int tamanhovocabulario = vb_Vocabulario.Count();

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

                Indice   = AD.Count();
                Contador = Indice;

                vb_DiretorioVL = null;

                if (Indice != tamanhovocabulario)
                {
                    int cont = 0;
                    ListaLogs.Add("Carregando arquivos");
                    foreach (FileInfo Arquivo in vb_ArquivosVL)                        //Para cada arquivo
                    {
                        VetorDocumentos[cont++] = File.ReadAllLines(Arquivo.FullName); //Carrega todas as linhas
                    }
                    ListaLogs.Add("Iniciando threads");


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

                        NovaThread[i]          = new Thread(Threads_VetoresBinarios); //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();
                            }

                            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 <= vb_Vocabulario.Count(); j++)    //Aguarda as threads restantes acabarem
                    {
                        NovaThread[j].Join();
                    }
                }

                vb_Vocabulario = null;

                ListaLogs.Add("Agrupando vetores binários");

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

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

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

                    vb_Matriz = null;

                    RegistroDeExcessoes.Incluir(new Excessao("Erro ao tentar agrupar os vetores binários", ex.ToString()));

                    return;
                }

                try
                {
                    ListaLogs.Add("Escrevendo agrupamento de vetores binários");
                    //Escreve todas as linhas
                    File.WriteAllLines(Configuracoes.Caminho_VetoresBinarios(), vb_Matriz, Encoding.UTF8);

                    vb_Matriz = null;
                }
                catch (Exception ex)
                {
                    RegistroDeExcessoes.Incluir(new Excessao("Erro ao tentar escrever agrupamento de vetores binários", ex.ToString()));

                    vb_Matriz         = null;
                    ModuloFuncionando = false;
                }
            }
            catch (Exception ex)
            {
                RegistroDeExcessoes.Incluir(new Excessao("Erro ao tentar criar os vetores binários", ex.ToString()));
            }

            return;
        }
Exemple #21
0
        /// <summary>
        /// Algoritmo de Sellers
        /// </summary>
        private static bool editDistance(string p_Padrao, string p_Linha, int p_Erros)
        {
            try
            {
                int  lact = 0;
                int  pC   = 0;
                int  nC   = 0;
                char y;

                int   v_TamanhoPadrao = p_Padrao.Length;
                int   p_TamanhoTexto  = p_Linha.Length;
                bool  v_ImprimeLinha  = false;
                int   v_NumVezesLinha = 0;
                int[] C = new int[200];

                for (int k = 0; k <= v_TamanhoPadrao; k++)
                {
                    C[k] = k;
                }

                if (lact == 0)
                {
                    lact = p_Erros + 1;
                }

                for (int pos = 1; pos <= p_TamanhoTexto; pos++)
                {
                    pC = 0;
                    nC = 0;
                    y  = p_Linha[pos - 1];

                    if (y > 0)
                    {
                        for (int i = 1; i <= lact; i++)
                        {
                            if (p_Padrao[i - 1] == y)
                            {
                                nC = pC;
                            }
                            else
                            {
                                if (pC < nC)
                                {
                                    nC = pC;
                                }

                                if (C[i] < nC)
                                {
                                    nC = C[i];
                                }

                                nC++;
                            }

                            pC   = C[i];
                            C[i] = nC;
                        }

                        while (C[lact] > p_Erros)
                        {
                            lact--;
                        }

                        if (lact == v_TamanhoPadrao)
                        {
                            v_ImprimeLinha = true;
                            v_NumVezesLinha++;
                        }
                        else
                        {
                            lact++;
                        }
                    }
                }

                if (v_ImprimeLinha)
                {
                    return(true);
                }
                else
                {
                    return(false);
                }
            }
            catch (Exception ex)
            {
                RegistroDeExcessoes.Incluir(new Excessao("Erro ao fazer casamento aproximado", ex.ToString()));
            }

            return(false);
        }