<jupyter_start><jupyter_text>BuscadorEsse notebook implementa um buscador simples. A representação pra cada texto é criada a partir da TF-IDF.A representação da query (consulta, ou termos buscados)é construída a partir do vocabulário dos textos.O ranqueamento dos resultados é feito de acordo coma semelhança cosseno da query pros textos.Há várias oportunidades de melhoria. Algumas delas são discutidas ao longo do notebook.Os resultados, mesmo deste buscador ingênuo,são bastante satisfatórios.O buscador é capaz de retornar leis (neste caso)relacionadas à localidades ou personalidades.No entanto, o mesmo mecanismo pode ser utilizadopra quaisquer outros textos, por exemplo o Diário Oficial.Alguns exemplos de buscas são: "winterianus" - retorna a Lei Municipal sobre citronelas;"Elydio Azevedo" - retorna Lei Municipal que concede título de cidadão feirense;"Rua Espassonavel" - retorna Lei Municipal que cita a rua.<jupyter_code>import pandas as pd
laws = pd.read_json('leis.json')
laws.drop(['documento'], inplace=True, axis=1)
print(laws.info())
print(laws.nunique())
laws
print(laws.loc[len(laws)-1, 'texto'])<jupyter_output><empty_output><jupyter_text>Buscas por textoNo notebook _similar_laws_ vimos que TF-IDF encontra Leis bastante similares entre si.Será que conseguimos também encontrar leis similares a uma query?Primeiro, devemos construir a representação das leis com TF-IDF.Após termos as representações,limpamos o texto da consulta utilizando o mesmo método de limpeza das leis.Depois, criar uma representação da consulta utilizando o IDF do modelo treinado.Finalmente, calcular a similaridade desta consultapara todas as leis na base e retornar as mais próximas.<jupyter_code>from scripts.nlp import remove_portuguese_stopwords
laws['texto_limpo'] = laws['texto'].apply(remove_portuguese_stopwords)
from sklearn.feature_extraction.text import CountVectorizer, TfidfTransformer
vectorizer = CountVectorizer()
X = vectorizer.fit_transform(laws['texto_limpo'])
X
transformer = TfidfTransformer()
X_tfidf = transformer.fit_transform(X)

X_tfidf
query = ['rua espassonavel']
query[0] = remove_portuguese_stopwords(query[0])
query = vectorizer.transform(query)
query = transformer.transform(query)
from sklearn.metrics.pairwise import cosine_similarity
import numpy as np

best_matches = cosine_similarity(query, X_tfidf)
best_matches_idx = np.argsort(best_matches)
for i in range(1,5):
    idx = best_matches_idx[0, -i]
    print(laws.loc[idx, 'texto'])
    print('\n---Next Result:---\n')<jupyter_output><empty_output>
{'fraction_non_alphanumeric': 0.07692307692307693, 'fraction_numerical': 0.0027613412228796844, 'mean_word_length': 6.5476190476190474, 'pattern_counts': {'":': 0, '<': 9, '<?xml version=': 0, '>': 9, 'https://': 0, 'lorem ipsum': 0, 'www.': 0, 'xml': 0}, 'pii_count': 0, 'substrings_counts': 0, 'word_list_counts': {'cursed_substrings.json': 0, 'profanity_word_list.json': 0, 'sexual_word_list.json': 0, 'zh_pornsignals.json': 0}}
{'chain_length': '2', 'dir': 'jupyter-structured-clean-dedup', 'id': '427416', 'license': 'MIT', 'n_tokens_mistral': 865, 'n_tokens_neox': 842, 'n_words': 257, 'path': 'analysis/2021-01-21-guilhermelowa-search-engine.ipynb', 'repo_name': 'AndreAngelucci/analises', 'size': '2535'}