Spaces:
No application file
No application file
| """ | |
| Data Scientist.: Dr.Eddy Giusepe Chirinos Isidro | |
| """ | |
| """Importando Bibliotecas:""" | |
| import requests | |
| from bs4 import BeautifulSoup | |
| import spacy | |
| import networkx as nx | |
| import matplotlib.pyplot as plt | |
| import pandas as pd | |
| """coleta e pré-processamento de dados (usamos a página da Wikipedia):""" | |
| url = "https://pt.wikipedia.org/wiki/William_Shakespeare" | |
| # Envie uma solicitação HTTP para o URL e recupere o conteúdo HTML: | |
| response = requests.get(url) | |
| # Analise o conteúdo HTML usando BeautifulSoup: | |
| soup = BeautifulSoup(response.text, "html.parser") | |
| # Extraia o conteúdo do texto de um elemento HTML específico com o id "mw-content-text": | |
| text = soup.find("div", id="mw-content-text").text | |
| # Substitua caracteres de nova linha por espaços e limite o texto aos primeiros 1.000 caracteres: | |
| text = text.replace("\n", " ") | |
| text = text[:1500] | |
| print(text) | |
| """Usamos Reconhecimento de Entidade Nomeada (NER) - usamos um modelo pré-treinado para o português:""" | |
| nlp = spacy.load("pt_core_news_lg") | |
| # Processe o texto com o pipeline de NLP do spaCy: | |
| doc = nlp(text) | |
| # Inicialize listas vazias para armazenar entidades reconhecidas e seus rótulos: | |
| entities = [] | |
| labels = [] | |
| # Extraia entidades nomeadas e seus rótulos: | |
| for ent in doc.ents: | |
| entities.append(ent.text) | |
| labels.append(ent.label_) | |
| print("\n") | |
| print('Entidades:', entities) | |
| print("") | |
| print('Labels:', labels) | |
| """Extraindo Relações entre Entidades:""" | |
| # Inicialize uma lista vazia para armazenar relações: | |
| relations = [] | |
| # Iterar através de frases no texto processado: | |
| for sent in doc.sents: | |
| sent_doc = nlp(sent.text) | |
| subject = None | |
| object = None | |
| predicate = None | |
| # Iterar através de tokens na frase para identificar sujeito, objeto e predicado: | |
| for token in sent_doc: | |
| if token.dep_ == "nsubj": | |
| subject = token.text | |
| if token.dep_ == "pobj": | |
| object = token.text | |
| if token.dep_ == "ROOT": | |
| predicate = token.text | |
| # Se sujeito, objeto e predicado forem encontrados, armazene a relação: | |
| if subject and object and predicate: | |
| relation = (subject, predicate, object) | |
| relations.append(relation) | |
| print('Relações:', relations) | |
| """Criando um DataFrame:""" | |
| # Crie pares de entidades consecutivas: | |
| entity_pairs = list(zip(entities, entities[1:])) | |
| # Certifique-se de que as relações e os pares de entidades tenham o mesmo comprimento: | |
| relations = relations[:len(entity_pairs)] | |
| # Extraia a source e target de pares de entidades: | |
| source = [i[0] for i in entity_pairs] | |
| target = [i[1] for i in entity_pairs] | |
| # Certifique-se de que as relações tenham o mesmo comprimento que a source e o target: | |
| missing_relations = ["N/A"] * (len(entity_pairs) - len(relations)) | |
| relations += missing_relations | |
| # Crie um DataFrame para representar o 'knowledge graph': | |
| kg_df = pd.DataFrame({'source': source, 'target': target, 'edge': relations}) | |
| print(kg_df) | |
| """Construindo o Gráfico de Conhecimento:""" | |
| # Crie um gráfico direcionado do DataFrame usando NetworkX: | |
| G = nx.from_pandas_edgelist(kg_df, "source", "target", edge_attr=True, create_using=nx.MultiDiGraph()) | |
| """Visualizando o Gráfico de Conhecimento:""" | |
| # Calcule o comprimento máximo da palavra nos rótulos de cada nó: | |
| max_word_lengths = [max(len(word) for word in node.split()) for node in G.nodes()] | |
| # Calculate adaptive node sizes based on the maximum word length in each label | |
| node_sizes = [max_word_length * 400 for max_word_length in max_word_lengths] | |
| # Create a figure for the graph visualization | |
| plt.figure(figsize=(12, 12)) | |
| fig = plt.figure(figsize=(12, 12)) | |
| # Define the layout for the graph using a spring layout with a seed for reproducibility | |
| pos = nx.spring_layout(G, seed=42) | |
| # Define the node colors for different types of entities | |
| node_colors = [] | |
| for node in G.nodes(): | |
| if node in ["William Shakespeare", "English", "Stratford-upon-Avon", "London", "England"]: | |
| node_colors.append("#ff7f0e") # Laranja para localizações | |
| else: | |
| node_colors.append("#1f77b4") # Blue for people | |
| # Draw nodes and edges with improved aesthetics and adaptive node sizes | |
| nx.draw(G, pos, node_color=node_colors, edge_color="#888888", node_size=node_sizes, font_size=10, | |
| font_color="white", font_weight="bold", alpha=0.9, linewidths=0.5, width=1.0, cmap=plt.cm.viridis) | |
| # Create a dictionary to store node labels with line breaks for long labels | |
| node_labels = {} | |
| for node in G.nodes(): | |
| label = node | |
| if len(node) > 2: # Add line break for labels with more than two words | |
| label = '\n'.join(node.split()) | |
| node_labels[node] = label | |
| # Draw node labels with automatic placement and text wrapping | |
| nx.draw_networkx_labels(G, pos, labels=node_labels, font_size=10, font_color="white", font_weight="bold", alpha=0.9, | |
| verticalalignment="center", horizontalalignment="center") | |
| # Set the title for the graph | |
| plt.title("William Shakespeare Knowledge Graph", fontsize=16) | |
| fig.set_facecolor("#00000F") | |
| # Turn off the axis | |
| plt.axis('off') | |
| # Display the knowledge graph | |
| plt.show() | |