AIdeaText commited on
Commit
7dcf2f9
1 Parent(s): 9addec4

Update modules/semantic_analysis.py

Browse files
Files changed (1) hide show
  1. modules/semantic_analysis.py +17 -31
modules/semantic_analysis.py CHANGED
@@ -88,6 +88,13 @@ POS_TRANSLATIONS = {
88
  def count_pos(doc):
89
  return Counter(token.pos_ for token in doc if token.pos_ != 'PUNCT')
90
 
 
 
 
 
 
 
 
91
  def extract_entities(doc):
92
  entities = {
93
  "Personas": [],
@@ -97,7 +104,7 @@ def extract_entities(doc):
97
  }
98
 
99
  for ent in doc.ents:
100
- if ent.label_ == "PER":
101
  entities["Personas"].append(ent.text)
102
  elif ent.label_ in ["LOC", "GPE"]:
103
  entities["Lugares"].append(ent.text)
@@ -112,6 +119,8 @@ def visualize_context_graph(doc, lang):
112
  G = nx.Graph()
113
  entities = extract_entities(doc)
114
 
 
 
115
  # Add nodes
116
  for category, items in entities.items():
117
  for item in items:
@@ -120,47 +129,28 @@ def visualize_context_graph(doc, lang):
120
  # Add edges
121
  for sent in doc.sents:
122
  sent_entities = [ent for ent in sent.ents if ent.text in G.nodes()]
123
- person = next((ent for ent in sent_entities if ent.label_ == "PER"), None)
124
- if person:
125
- for ent in sent_entities:
126
- if ent != person:
127
- G.add_edge(person.text, ent.text)
128
 
129
  # Visualize
130
  plt.figure(figsize=(20, 15))
131
  pos = nx.spring_layout(G, k=0.5, iterations=50)
132
 
133
- color_map = {"Personas": "lightblue", "Conceptos": "lightgreen", "Lugares": "lightcoral", "Fechas": "lightyellow"}
134
  node_colors = [color_map[G.nodes[node]['category']] for node in G.nodes()]
135
 
136
  nx.draw(G, pos, node_color=node_colors, with_labels=True, node_size=3000, font_size=8, font_weight='bold')
137
 
138
  # Add a legend
139
- legend_elements = [plt.Rectangle((0,0),1,1,fc=color, edgecolor='none') for color in color_map.values()]
140
- plt.legend(legend_elements, color_map.keys(), loc='upper left', bbox_to_anchor=(1, 1))
 
141
 
142
  plt.title("Análisis del Contexto" if lang == 'es' else "Context Analysis" if lang == 'en' else "Analyse du Contexte", fontsize=20)
143
  plt.axis('off')
144
 
145
  return plt
146
 
147
- def create_semantic_graph(doc, lang):
148
- G = nx.Graph()
149
- pos_counts = count_pos(doc)
150
-
151
- for token in doc:
152
- if token.pos_ != 'PUNCT':
153
- G.add_node(token.text,
154
- pos=token.pos_,
155
- color=POS_COLORS.get(token.pos_, '#CCCCCC'), # Color gris por defecto
156
- size=pos_counts.get(token.pos_, 1) * 100) # Tamaño mínimo si no hay conteo
157
-
158
- for token in doc:
159
- if token.dep_ != "ROOT" and token.head.text in G.nodes and token.text in G.nodes:
160
- G.add_edge(token.head.text, token.text, label=token.dep_)
161
-
162
- return G, pos_counts
163
-
164
  def visualize_semantic_relations(doc, lang):
165
  G = nx.Graph()
166
  word_freq = Counter(token.text.lower() for token in doc if token.pos_ not in ['PUNCT', 'SPACE'])
@@ -200,8 +190,4 @@ def perform_semantic_analysis(text, nlp, lang):
200
  doc = nlp(text)
201
  context_graph = visualize_context_graph(doc, lang)
202
  relations_graph = visualize_semantic_relations(doc, lang)
203
-
204
- # Extraer entidades para mostrar en forma de lista
205
- entities = extract_entities(doc)
206
-
207
- return context_graph, relations_graph, entities
 
88
  def count_pos(doc):
89
  return Counter(token.pos_ for token in doc if token.pos_ != 'PUNCT')
90
 
91
+ import spacy
92
+ import networkx as nx
93
+ import matplotlib.pyplot as plt
94
+ from collections import Counter
95
+
96
+ # Mantén las definiciones de POS_COLORS y POS_TRANSLATIONS que ya tienes
97
+
98
  def extract_entities(doc):
99
  entities = {
100
  "Personas": [],
 
104
  }
105
 
106
  for ent in doc.ents:
107
+ if ent.label_ == "PERSON":
108
  entities["Personas"].append(ent.text)
109
  elif ent.label_ in ["LOC", "GPE"]:
110
  entities["Lugares"].append(ent.text)
 
119
  G = nx.Graph()
120
  entities = extract_entities(doc)
121
 
122
+ color_map = {"Personas": "lightblue", "Conceptos": "lightgreen", "Lugares": "lightcoral", "Fechas": "lightyellow"}
123
+
124
  # Add nodes
125
  for category, items in entities.items():
126
  for item in items:
 
129
  # Add edges
130
  for sent in doc.sents:
131
  sent_entities = [ent for ent in sent.ents if ent.text in G.nodes()]
132
+ for i in range(len(sent_entities)):
133
+ for j in range(i+1, len(sent_entities)):
134
+ G.add_edge(sent_entities[i].text, sent_entities[j].text)
 
 
135
 
136
  # Visualize
137
  plt.figure(figsize=(20, 15))
138
  pos = nx.spring_layout(G, k=0.5, iterations=50)
139
 
 
140
  node_colors = [color_map[G.nodes[node]['category']] for node in G.nodes()]
141
 
142
  nx.draw(G, pos, node_color=node_colors, with_labels=True, node_size=3000, font_size=8, font_weight='bold')
143
 
144
  # Add a legend
145
+ legend_elements = [plt.Rectangle((0,0),1,1,fc=color, edgecolor='none', label=category)
146
+ for category, color in color_map.items()]
147
+ plt.legend(handles=legend_elements, loc='upper left', bbox_to_anchor=(1, 1))
148
 
149
  plt.title("Análisis del Contexto" if lang == 'es' else "Context Analysis" if lang == 'en' else "Analyse du Contexte", fontsize=20)
150
  plt.axis('off')
151
 
152
  return plt
153
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
154
  def visualize_semantic_relations(doc, lang):
155
  G = nx.Graph()
156
  word_freq = Counter(token.text.lower() for token in doc if token.pos_ not in ['PUNCT', 'SPACE'])
 
190
  doc = nlp(text)
191
  context_graph = visualize_context_graph(doc, lang)
192
  relations_graph = visualize_semantic_relations(doc, lang)
193
+ return context_graph, relations_graph