Esta é uma implementação básica de um mecanismo de busca de arquivos baseado em python para responder consultas em arquivos de texto em um sistema local. Usamos "ponderação de termo tf-idf" e "semelhança de cosseno" para classificar a relevância dos documentos correspondentes. Os cálculos do tf-idf são pré-computados, tornando a pesquisa muito mais rápida. Também para agilizar a busca foi utilizado Stemming (Porter Stemmer). É fornecida uma interface de usuário básica usando a biblioteca Tkinter do Python.
python2 createIndex_tfidf.py stopwords.dat testIndex.dat titleIndex.dat
createIndex_tfidf.py será executado apenas uma vez para calcular os valores tdf-idf no corpus
python2 queryIndex_tfidf.py stopwords.dat testIndex.dat titleIndex.dat
No geral, três arquivos diferentes são criados nesta etapa:
títuloIndex.dat
Este arquivo armazena o docId exclusivo (id do documento) que é atribuído a cada documento do corpus.
testIndex.dat
Neste é criado um arquivo de índice (também conhecido como estrutura de dados de índice invertido) que contém informações sobre todos os termos exclusivos (exceto palavras irrelevantes) que aparecem em todos os documentos. Cada documento recebe um ID exclusivo começando em 0, conforme armazenado no titleIndex. isso. As informações sobre um termo são armazenadas no arquivo de índice da seguinte forma: term|docID0:pos1,pos2;docID1:pos3,pos4,pos5;…..|tf0,tf1,tf2...|idf Aqui tf0,tf1,tf2 representa a frequência do termo em docID0,docID1,docID2 respectivamente. idf representa a frequência inversa do documento e pos1 representa a posição do termo no respectivo documento e assim por diante.
linhas.dat
Este arquivo armazena as informações sobre as linhas em que o termo está presente em diversos documentos. Esta informação de linha é representada como: term|docID0:line1,line2;docID1:line3,line4,line5
Antes da criação desses arquivos, todos os termos dos documentos são verificados na lista de palavras irrelevantes. Se um termo aparecer em palavras irrelevantes, ele será ignorado, caso contrário, suas informações serão armazenadas nos arquivos acima. Além disso, cada termo é derivado por Porter Stemmer antes de ser adicionado ao índice.
Neste, em primeiro lugar, todas as informações dos arquivos linhas.dat,titleIndex.dat e testIndex.dat são novamente armazenadas usando dicionário em Python.
Agora, os diferentes tipos de consultas suportadas são:
Consultas de uma palavra (OWQ) Esta é uma consulta de termo único e sua saída é uma lista de documentos contendo o termo solicitado junto com os números das linhas onde o termo está presente no respectivo documento.
Consultas multipalavras (MWQ) A entrada no MWQ é uma sequência de palavras e a saída é a lista de documentos que contêm qualquer um dos termos da consulta junto com os números das linhas.
Consultas de frase (PQ) A entrada em PQ é novamente uma sequência de palavras, e os documentos correspondentes são aqueles que contêm todos os termos de consulta na ordem especificada.
Agora que encontramos a lista de documentos nos quais a consulta está presente é hora de classificá-los. O esquema de classificação que usamos aqui é baseado no tf-idf. Tf-Idf é um esquema de ponderação que atribui a cada termo em um documento um peso com base na frequência do termo (tf) e na frequência inversa do documento (idf). Os termos com maiores pontuações de peso são considerados mais importantes. É um dos esquemas de ponderação mais populares na recuperação de informações.
A frequência do termo (tf) de um termo é específica do documento. É basicamente o número de ocorrências do termo t no documento D. É bastante lógico escolher tf como parâmetro porque à medida que um termo aparece mais no documento ele se torna mais importante. Podemos representar um documento por um vetor cujo tamanho é igual ao não. de termos exclusivos no documento e cada valor denota a contagem do termo no documento fornecido. A representação de documentos como vetores em um espaço vetorial comum é conhecida como modelo de espaço vetorial e é fundamental para a recuperação de informação. Mas aqui está uma desvantagem. À medida que o tamanho do documento crescer, o peso do tf aumentará à medida que a frequência dos termos aumentará. Portanto, um documento que contenha as mesmas informações de outro documento, copiado mais de uma vez, será considerado mais importante. Para erradicar esta desvantagem, dividiremos cada valor de um vetor pela sua norma, de modo que o vetor se torne um vetor unitário.
Não podemos usar apenas frequências de termos para calcular o peso de um termo no documento, porque tf considera todos os termos igualmente importantes. No entanto, alguns termos ocorrem mais raramente e são mais discriminativos do que outros. Se usarmos tf puramente como medida de classificação, então se pesquisarmos um tópico como ondas sonoras, poderemos acabar obtendo muitos documentos contendo ondas de luz e outras ondas, já que a frequência do termo é o único parâmetro.
Para mitigar esse efeito, utilizamos a frequência inversa dos documentos. A frequência documental de um termo é basicamente o número de documentos que contêm o termo. Portanto, a frequência inversa do documento (idf) de um termo é o número de documentos no corpus dividido pela frequência do documento de um termo. Geralmente descobriu-se que o fator de idf é bastante grande e melhores resultados são obtidos se usarmos log(idf). Como log é uma função crescente, podemos utilizá-la sem prejudicar nossos resultados.
Definimos tanto tf quanto idf, e agora podemos combiná-los para produzir a pontuação final de um termo t no documento d. Representaremos novamente o documento como um vetor, com cada entrada sendo o peso tf-idf do termo correspondente no documento. O peso tf-idf de um termo t no documento d é simplesmente a multiplicação de seu tf por seu idf.
Agora que construímos os vetores de cada documento com base no peso tf-idf. É hora de responder a uma consulta usando os vetores de documento fornecidos. Em primeiro lugar, criaremos um vetor de consulta de forma semelhante à que criamos o vetor de documento, ou seja, com base na pontuação tf-idf (considerando a consulta de um documento em si). Agora que temos nosso vetor de consulta pronto, encontraremos todos os documentos nos quais nossa consulta está presente. Agora pegaremos o produto escalar do vetor de consulta e o vetor do documento no qual a consulta está presente. Quanto maior o produto escalar , mais semelhante é o vetor de consulta com o vetor de documento , o que significa que o ângulo entre o vetor de documento e o vetor de consulta é pequeno. Essa técnica de encontrar semelhança entre consulta e documento é chamada de similaridade de cosseno.