A text analysis based technique for movie recommendation
License: GNU General Public License v3.0
Python 97.78%Shell 2.22%
movie-recommendation's Introduction
Movie Recommendation
Um sistema inteligente de recomendação de filmes.
Uso
Os principais programas que compõem esta aplicação são:
csv_to_json.py: gera o arquivo .json com os dados a serem utilizados.
full_generation.py: realiza todo o processo de clusterização e geração de imagens (matrizes de distância e dendrogramas).
user_permission.py: Obtém a permissão de acesso do usuário.
user_data.py: Realiza a coleta dos filmes ranqueados pelo usuário.
recommend.py: Gera uma lista de recomendações de filmes para o usuário.
Os demais programas são funções e testes. Para funcionamento correto do programa, é necessário que o arquivo tmdb_5000_movies.csv esteja presente na pasta dataset. Além disso, é necessário um token de API para utilização dos dados do TMDB, você pode obter um token gratuito seguindo o processo descrito nesta página: https://developers.themoviedb.org/3/getting-started/introduction
Precisamos obter uma lista de filmes que o usuário assistiu com indicação de se o usuário gostou do filme. Uma vez que não desejamos que o usuário preencha uma lista quando for utilizar o programa, pretendemos obter estas informações a partir de um provedor externo, a princípio optamos pelo TMDb, mas uma análise de sua API é necessária.
A princípio estamos utilizando os dados do TMDb, com o dataset disponibilizado no Kaggle (https://www.kaggle.com/tmdb/tmdb-movie-metadata#tmdb_5000_movies.csv). O dataset possui 5000 filmes, porém nem todos possuem informação completa, mas podemos utilizar a própria API do TMDb para construir outro dataset ou expandir este.
A partir da escolha da API, devemos construir uma listagem de filmes que o usuário assistiu e que estão presentes em nossa base de dados, mantendo a informação de se o usuário gostou ou não do filme.
Utilizaremos o Dataset considerando título do filme, sumário e gêneros. O título do filme será utilizado para referência posterior no momento de recomendação de filmes e análise dos resultados. O gênero do filme será considerado para verificação da precisão dos resultados, esperamos que filmes do mesmo cluster possuam gêneros semelhantes. Por fim, o sumário será utilizado para a construção da matriz de distância, para tal, removeremos stop words e tomaremos os bigramas.
A abordagem de construção dos clusters foi baseada em: https://gmarti.gitlab.io/ml/2017/09/07/how-to-sort-distance-matrix.html
Os métodos disponíveis a principio são são: ward, single, average, complete; Porém o método single não consegue ser executado, uma vez que atinge o limite de recursão. Para solucionar, a construção de uma abordagem iterativa seria o mais recomendado, porém também pode-se aumentar o limite de recursão do python (sys.setrecursionlimit(10000)), considerando que o tamanho do dataset não irá aumentar.
Com base na matriz construída, devemos avaliar métricas da clusterização, podendo se valer das categorias dos filmes e outras informações disponíveis para verificar precisão, acurácia e demais valores que venham a caber em uma análise dos resultados. Ainda, cabe aqui a análise de tais métricas de modo a comparar as diferentes metodologias e algoritmos citados nas etapas anteriores.
A matriz de distância está sendo construída utilizando a distância de Jaccard, porém outros métodos podem ser utilizados, e podem ser comparados para verificar eficiência (métodos já prontos no algoritmo: binary jaccard, masi, edit). Além disso, não se espera que os filmes possuam grande semelhança, na verdade, espera-se que poucos pares de palavras sejam coincidentes nos sumários, de forma que o escalonamento dos valores pode ajudar na clusterização. Para tal, pode-se utilizar uma função de escalonamento que mantenha os valores entre 0 e 1 (-x²+2x; 1/(1+e^(-10x+5)); e^(-3(x-1)²) ). Os dados da matriz estão sendo salvos em um arquivo .txt para referência e um .npy para uso nas etapas posteriores.
Com base nos clusters e nos filmes assistidos pelo usuário, devemos recomendar novos filmes para ele. Para tal, consideraremos os clusters de forma isolada, e então aplicaremos um método similar ao k-neighboors, se aproximando de filmes que o usuário gostou e distanciando de filmes que não gostou, e então recomendado um filme que ele ainda não assistiu com base na proximidade ao resultado obtido.