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