import pandas as pd import networkx as nx import numpy as np # CARREGANDO DATAFRAME df_rio = pd.read_csv('./dataset.csv') df_rio['original_id'] = df_rio['original'] + '/' + df_rio['original_photo'] df_rio['compare_id'] = df_rio['compare'] + '/' + df_rio['compare_photo'] # CRIANDO GRAFO G = nx.Graph() for index, row in df_rio.iterrows(): if row['original_id'] not in G: G.add_node(row['original_id']) if row['compare_id'] not in G: G.add_node(row['compare_id']) weight = row['distance'] G.add_edge(row['original_id'], row['compare_id'], weight=weight) def get_graph(): return G def get_page_rank_graph(): # CRIANDO GRAFO PARA PAGE RANKING G_pr = nx.Graph() for index, row in df_rio.iterrows(): if row['original_id'] not in G_pr: G_pr.add_node(row['original_id']) if row['compare_id'] not in G_pr: G_pr.add_node(row['compare_id']) weight = np.abs(row['distance'] - 1) G_pr.add_edge(row['original_id'], row['compare_id'], weight=weight) return G_pr # ALGORITMOS DE RECOMENDAÇÃO def recommend_dijkstra(graph, original_id): distances, paths = nx.single_source_dijkstra( graph, original_id, weight='weight') recommended_paths = sorted( paths.items(), key=lambda item: distances[item[0]]) return recommended_paths def recommend_floyd_warshall(graph, original_id): distances = nx.floyd_warshall_numpy(graph, weight='weight') nodes = list(graph.nodes()) original_index = nodes.index(original_id) recommended_indices = sorted( range(len(nodes)), key=lambda i: distances[original_index][i]) recommended_paths = [(nodes[i], distances[original_index][i]) for i in recommended_indices] return recommended_paths def recommend_page_rank(graph, start_node): personalization = {node: 0 for node in graph.nodes()} personalization[start_node] = 1 personalized_pagerank_scores = nx.pagerank( graph, personalization=personalization, weight='weight') recommended_paths = sorted( personalized_pagerank_scores.items(), key=lambda item: item[1], reverse=True) return recommended_paths