<jupyter_start><jupyter_text>Sparse Document Retriever - ExperimentoRanqueia textos de acordo com um outro texto de entrada através das estratégias TF-IDF, BM25 ou Glove Embeddings. **Em caso de dúvidas, consulte os [tutoriais da PlatIAgro](https://platiagro.github.io/tutorials/).**  Declaração de parâmetros e hiperparâmetrosDeclare parâmetros com o botão  na barra de ferramentas.A variável `dataset` possui o caminho para leitura do arquivos importados na tarefa de "Upload de dados".Você também pode importar arquivos com o botão  na barra de ferramentas.<jupyter_code># dataset = "/tmp/data/paracrawl_en_pt_test.csv" #@param {type:"string"}
dataset = "reports_contexts.csv" 
column = "context" #@param {type:"string",label:"Coluna do dataframe de entrada com os contextos para ranquear"}
question = "Qual é o melhor herbicida para erva da ninha ?" #@param {type:"string",label:"Pergunta para a qual os contextos devem ser ranqueados"}

#Hyperparams
retriever_type = "tdidf" #@param ["bm25","tfidf","word2vec"] {type:"string",label:"Tipo de retriever esparço",description:"O retriever pode ser BM25 Okapi, TF-IDF e Word2Vec"}
bm25_k1 = 2 #@param {type:"integer",label:"Argumento k1 do BM25",description:"O argumento k1 do bm25 representa as características da frequência de saturação dos tokens. Ou seja, ele limita o quando cada token pode afetar o score do documento"}
bm25_b = 0.75 #@param {type:"integer",label:"Argumento b do BM25",label:"O argumento b do bm25 é determina o efeito do tamanho de um documento comparado com a média. Quanto maior b maior o efeito}
top = 10 #@param {type:"integer",label:"Quantidade de contextos para retornados"}
if bm25_b<0 or bm25_b>1:
    raise ValueError("O valor de bm25_b deve estar entre 0 e 1")
    
if bm25_k1<1:
    raise ValueError("O valor de bm25_k1 deve ser maior ou igual a 1")<jupyter_output><empty_output><jupyter_text>Acesso ao conjunto de dados¶O conjunto de dados utilizado nesta etapa será o mesmo carregado através da plataforma.O tipo da variável retornada depende do arquivo de origem:* pandas.DataFrame para CSV e compressed CSV: .csv .csv.zip .csv.gz .csv.bz2 .csv.xz* Binary IO stream para outros tipos de arquivo: .jpg .wav .zip .h5 .parquet etc<jupyter_code>import pandas as pd

df = pd.read_csv(dataset)<jupyter_output><empty_output><jupyter_text>Funções de apoio<jupyter_code>def build_result_dataframe(sim_contexts_ids,scores,contexts):
    sim_contexts = [contexts[i] for i in sim_contexts_ids[0]]
    df = pd.DataFrame({'doc_id':sim_contexts_ids[0],'score':scores[0],'sim_contexts':sim_contexts})
    df = df.sort_values(by=['score'], ascending=False).reset_index(drop=True)
    return df<jupyter_output><empty_output><jupyter_text>Conteúdo da tarefa<jupyter_code>from model_sparse_retriever import TfidfRetriever, W2VRetriever, BM25Retriever
if retriever_type == "bm25":
    kwargs={'k1':bm25_k1,'b':bm25_b}
    retriever = BM25Retriever(**kwargs)
elif retriever_type == "tfidf":
    retriever = TfidfRetriever()
elif retriever_type == "word2vec":
    ! wget https://storage.googleapis.com/platiagro/Vident/glove_s300_portugues.txt
    from gensim.models import KeyedVectors
    model = KeyedVectors.load_word2vec_format('glove_s300_portugues.txt')
    retriever = W2VRetriever(w2v_model=model)

report_contexts = df[column].to_numpy()
retriever.fit(contexts=report_contexts)
sim_contexts_ids, scores = retriever(questions=question, top=top)
df = build_result_dataframe(sim_contexts_ids,scores,report_contexts)
df.head(10)<jupyter_output><empty_output><jupyter_text>Salva resultados da tarefaA plataforma guarda o conteúdo de `/tmp/data/` para as tarefas subsequentes.Use essa pasta para salvar modelos, metadados e outros resultados.<jupyter_code>from joblib import dump

artifacts = {
    "model":retriever,
    "report_contexts":report_contexts,
}

dump(artifacts, "/tmp/data/sparse_retriever.joblib")<jupyter_output><empty_output>
{'fraction_non_alphanumeric': 0.10048580925594477, 'fraction_numerical': 0.019688059319867043, 'mean_word_length': 6.284916201117318, 'pattern_counts': {'":': 5, '<': 23, '<?xml version=': 0, '>': 22, 'https://': 2, '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': '5', 'dir': 'jupyter-structured-clean-dedup', 'id': '59279', 'license': 'MIT', 'n_tokens_mistral': 1484, 'n_tokens_neox': 1427, 'n_words': 370, 'path': 'tasks/nlp-sparse-document-retriever/Experiment.ipynb', 'repo_name': 'vitoryeso/tasks', 'size': '3911'}