Sistema de busca semântica para filmes usando o CMU Movie Summary Corpus. O projeto atende ao trabalho de disciplina de Projeto e Análise de Algoritmos e compara abordagens de busca para responder perguntas em linguagem natural.
Dada uma pergunta sobre filmes, o sistema busca sinopses parecidas e monta uma resposta final com apoio de um LLM local via Ollama.
- Word2Vec Average + Cosseno: representa cada sinopse pela média dos vetores das palavras e faz busca por similaridade de cosseno.
- Sentence Embeddings + Cosseno: gera embeddings de sentenças com
SentenceTransformere faz busca por cosseno. - Sentence Embeddings + HNSW: usa
SentenceTransformer+FAISS HNSWpara acelerar a busca aproximada. - Resposta final com LLM local: formata a resposta usando
Ollama.
cinema_benchmark/
├── app.py # Interface web (Streamlit)
├── data/
│ ├── cmu-movie-summary-corpus/
│ └── tratada/
├── src/
│ ├── aplicar_modelos.py
│ ├── download_data.py
│ ├── llmformater.py
│ ├── modelos_embeddings.py
│ ├── motor_busca.py
│ ├── salvar_data_tratada.py
│ ├── tratar_data.py
│ ├── frontend/ # Camada de serviço do Streamlit
│ ├── sentence_cosseno/
│ └── sentence_hnsw/
└── tests/
Python 3.11+recomendadopip- Conexão com a internet para baixar o corpus e os modelos na primeira execução
Ollamainstalado localmente, se você quiser gerar a resposta final com LLM
Crie e ative um ambiente virtual:
python -m venv .venv
.\.venv\Scripts\Activate.ps1Instale as dependências:
pip install -r requirements.txtSe o NLTK pedir dados adicionais, baixe o pacote de stopwords na primeira execução ou rode:
python -c "import nltk; nltk.download('stopwords')"- Baixar o corpus do CMU Movie Summary Corpus:
python cinema_benchmark\src\download_data.py- Processar e salvar os dados tratados:
python cinema_benchmark\src\salvar_data_tratada.pyIsso gera cinema_benchmark/data/tratada/filmes_processados.csv.
Gerar a matriz de embeddings Word2Vec:
python cinema_benchmark\src\aplicar_modelos.pyExecutar a busca interativa:
python cinema_benchmark\src\motor_busca.pyNo menu, escolha 1.
Executar o pipeline completo com uma pergunta de exemplo:
python cinema_benchmark\src\sentence_cosseno\pipeline_sentence_cosseno.py "a movie about adventure and exploration"Esse pipeline constrói o índice, faz a busca e salva métricas.
Gerar o índice HNSW:
python cinema_benchmark\src\sentence_hnsw\pipeline_hnsw.pyDepois usar o menu principal:
python cinema_benchmark\src\motor_busca.pyNo menu, escolha 2.
Alternativa gráfica ao menu de terminal. Permite escolher o embedding, a técnica de busca e o top-k (padrão 5), digitar um prompt em inglês e ver o filme mais similar, a lista ranqueada e uma resposta opcional via LLM.
Instale a dependência (já inclusa se você rodou pip install -r requirements.txt streamlit):
pip install streamlitExecute o app a partir da raiz do projeto:
streamlit run cinema_benchmark/app.pyDepois abra http://localhost:8501 no navegador.
Importante: para usar a resposta final via LLM na interface, o
Ollamaprecisa estar rodando e com o modelo já baixado (veja a seção LLM local). Sem isso, a busca funciona normalmente, mas a resposta em texto ficará indisponível.
Notas:
- Word2Vec + Cosseno e SentenceTransformer + HNSW usam o corpus completo (42204 filmes).
- SentenceTransformer + Cosseno gera os embeddings de todo o corpus na 1ª busca (~1min) e salva em
data/tratada/embeddings_sentence.npypara as próximas. - A combinação Word2Vec + HNSW não existe (sem índice) e fica indisponível na interface.
- A resposta em texto via LLM é opcional e requer o
Ollamarodando com o modelo baixado.
O arquivo cinema_benchmark/src/llmformater.py usa Ollama para formatar a resposta final. O modelo padrão é qwen2.5:1.5b.
Para que a resposta em texto funcione (tanto no terminal quanto na interface Streamlit), o Ollama precisa estar rodando e o modelo precisa ter sido baixado previamente.
ollama --versionSe não estiver instalado, baixe em https://ollama.com/download.
Em geral o Ollama já inicia como serviço em segundo plano após a instalação. Se precisar iniciar manualmente:
ollama serveDeixe esse terminal aberto (ou garanta que o serviço esteja ativo) enquanto usa o projeto.
O comando ollama pull baixa o modelo para a máquina local (só é necessário uma vez):
ollama pull qwen2.5:1.5bVocê pode conferir os modelos já baixados com:
ollama listollama run qwen2.5:1.5bSe preferir outro modelo local, baixe-o com ollama pull <nome-do-modelo>, ajuste o nome no código ou passe outro valor no parâmetro modelo de formatar_resposta_llm.
Executar a suíte de testes:
python -m pytest -qSe o pytest não estiver instalado, reinstale as dependências com pip install -r requirements.txt.
- Os modelos
SentenceTransformereFAISSpodem demorar na primeira execução por causa do download. - O
Word2Vecdo Gensim também pode baixar um modelo grande na primeira vez. - O arquivo
motor_busca.pyintegra a busca e a resposta final com LLM local.
Uso acadêmico para fins de disciplina.