/// <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; } }
/// <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; }
/// <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; } }
/// <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; } }
/// <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; }
/// <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; }
/// <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; }
/// <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); } }
/// <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); }
/// <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; }
/// <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; }
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; }
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; }
/// <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); }
/// <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); } }
//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); }
//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; }
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; }
/// <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 }
/// <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; }
/// <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); }