Os motores de busca podem parecer mágicos. Você digita o que está procurando em uma caixa de texto e - ping! - Aparece apenas alguns milissegundos depois. É claro que todos sabemos que o Google depende de mais do que uma varinha mágica para produzir resultados de pesquisa relevantes. mas o que exatamente ele usa?

Bem, qualquer mecanismo de pesquisa tem três fases distintas: navegar na web para encontrar e ler páginas da web, indexar as páginas da web encontradas e responder às consultas dos usuários para produzir um conjunto de resultados classificados.

Neste artigo, não vamos falar nada sobre as atividades de spidering, mas você pode imaginá-lo como um programa especial que lê uma página da Web, analisa o HTML de origem e segue os links de URL encontrados. As páginas são então armazenadas e analisadas.

A indexação é um algoritmo interessante. A finalidade de indexar as páginas da Web encontradas através do spidering é produzir resultados de pesquisa rápidos e precisos. Se não for rápido, o usuário irá para outro lugar; se não for preciso, então idem.

Foi aí que o Google superou seus concorrentes no início: era mais rápido (desde o carregamento da página até a produção dos resultados) e era mais preciso (devido ao uso do algoritmo PageRank). Depois que o mecanismo de pesquisa indexou um grande número de páginas, ele pode começar a responder a consultas de pesquisa.

O índice deve ser construído de tal forma que o mecanismo de pesquisa possa produzir uma lista de páginas da Web que satisfaçam a consulta e classificar os resultados - rapidamente - para que os resultados mais aplicáveis ​​e relevantes sejam mostrados primeiro. Portanto, o índice é de suma importância, com o algoritmo de classificação sendo igualmente significativo.

Afinal, antes do Google e do PageRank, havia outros mecanismos de busca, como o AltaVista, que sabiam como indexar. Foi o ranking do Google que mudou tudo. O tipo padrão de estrutura de dados para índices de texto é conhecido como um arquivo invertido. Suponha que tenhamos um conjunto de documentos de texto. A primeira etapa é analisar o conteúdo analisando o texto para identificar as palavras individuais (ou tokens) no texto..

Uma vez que identificamos as palavras, escrever um analisador é bem simples. Podemos usar algo como uma máquina de estado (ou autômato) ou expressões regulares (que reconhecidamente foram projetadas para esse tipo de tarefa de análise de texto). Mas o que estamos realmente procurando?

A resposta simples e intuitiva é "os bits entre o espaço em branco". Mas essa resposta simples revela uma diferença entre como nós humanos digitalizamos o texto e como o computador faz. Por exemplo, dê outra olhada na primeira sentença deste parágrafo. Implementando esta definição como um programa (e usando colchetes para delimitar os símbolos aqui), veríamos palavras como [simples,], ['bits] e [espaço..

Como isso é um pouco básico demais, podemos refinar a definição de que "as palavras são os bits entre o espaço em branco e a pontuação". Mas, novamente, caímos em uma armadilha: para a primeira sentença deste parágrafo, essa definição produziria agora as palavras [que] e [s] para a palavra 'isso'.

Então, provavelmente, a melhor resposta - pelo menos para fins de indexação de texto em inglês - é escrever um analisador que, quando ele vir um caractere de pontuação, verifica o caractere após o sinal de pontuação..

Se é uma carta, então é mais provável que seja uma abreviação como "isso é" ou "é", e deve ser incluída na palavra. Melhor ainda, esses documentos contêm coisas como endereços de e-mail e URLs. Eles podem ser vistos como "palavras" por si só, e esse algoritmo de parser de palavras também funcionaria com eles.

Naturalmente, para outras linguagens, a análise de palavras pode exigir outros algoritmos, dependendo de questões como o conjunto de caracteres que está sendo usado (por exemplo, texto ideográfico seria interessante) ou as regras gramaticais para o idioma. Ao analisar o texto, é provável que encontremos palavras duplicadas.

Para um índice simples, como o que estamos usando aqui, tudo o que precisamos saber é se um determinado documento inclui uma determinada palavra. Não estamos particularmente interessados ​​em saber se o documento usa essa palavra uma vez, duas ou mil vezes. Afinal, quando exibimos a lista de resultados de pesquisa, o usuário clicará em um determinado link e acessará o URL específico para navegar no documento..

Em nosso exercício de análise, devemos ignorar duplicatas e buscar uma lista de palavras usadas. O próximo passo é jogar fora as palavras que não têm significado pesquisável, porque todo documento as usará. Exemplos dessas palavras de parada (como são chamadas) são 'o', 'a', 'é', 'eu', 'em' e assim por diante (e essas últimas três palavras também!).

Toda aplicação de um algoritmo de indexação de texto usará seu próprio conjunto de palavras de parada, e essas listas serão construídas e mantidas em tempo de execução a partir do conteúdo que está sendo visto. Depois de tudo isso, teremos uma tabela de nomes de documentos com uma lista de palavras para cada documento, como mostra a Figura 1..

figura 1: Um índice avançado lista todas as palavras encontradas em um documento específico

Aqui eu nomeei os documentos como números e, na prática, teríamos outra tabela que referencia esses números para a URL real do documento. O próximo passo é inverter essa tabela; Afinal de contas, para uma busca, vamos receber uma palavra e temos que identificar os documentos que contêm essa palavra..

A palavra deve ser a chave e, no momento, a tabela é digitada pelo número do documento. O que temos é uma tabela, como mostra a Figura 2. A tabela é digitada por palavra e os dados de cada registro da tabela são uma lista de números de documentos. Essa estrutura é conhecida como um arquivo invertido. A partir de uma tabela de palavras por documento, acabamos com uma tabela de documentos por palavra.

Figura 2: Esse índice invertido é uma lista que mostra quais documentos contêm uma determinada palavra