AIdeaText commited on
Commit
9fbca90
·
verified ·
1 Parent(s): 96099cb

Update modules/text_analysis/semantic_analysis.py

Browse files
modules/text_analysis/semantic_analysis.py CHANGED
@@ -183,25 +183,48 @@ def perform_semantic_analysis(text, nlp, lang_code):
183
 
184
  def identify_key_concepts(doc, stopwords, min_freq=2, min_length=3):
185
  """
186
- Identifica conceptos clave en el texto.
 
 
 
 
 
 
 
187
  """
188
  try:
189
  word_freq = Counter()
190
 
 
 
 
 
 
 
191
  for token in doc:
192
- if (token.lemma_.lower() not in stopwords and
193
- len(token.lemma_) >= min_length and
194
- token.is_alpha and
195
- not token.is_punct and
196
- not token.like_num):
 
 
 
 
 
 
 
 
197
 
 
198
  word_freq[token.lemma_.lower()] += 1
199
 
 
200
  concepts = [(word, freq) for word, freq in word_freq.items()
201
  if freq >= min_freq]
202
  concepts.sort(key=lambda x: x[1], reverse=True)
203
 
204
- logger.info(f"Identified {len(concepts)} key concepts")
205
  return concepts[:10]
206
 
207
  except Exception as e:
@@ -209,9 +232,10 @@ def identify_key_concepts(doc, stopwords, min_freq=2, min_length=3):
209
  return []
210
 
211
  ########################################################################
 
212
  def create_concept_graph(doc, key_concepts):
213
  """
214
- Crea un grafo de relaciones entre conceptos.
215
  Args:
216
  doc: Documento procesado por spaCy
217
  key_concepts: Lista de tuplas (concepto, frecuencia)
@@ -224,26 +248,30 @@ def create_concept_graph(doc, key_concepts):
224
  # Crear un conjunto de conceptos clave para búsqueda rápida
225
  concept_words = {concept[0].lower() for concept in key_concepts}
226
 
 
 
 
 
 
227
  # Añadir nodos al grafo
228
  for concept, freq in key_concepts:
229
  G.add_node(concept.lower(), weight=freq)
230
 
231
  # Analizar cada oración
232
  for sent in doc.sents:
233
- # Obtener conceptos en la oración actual
234
  current_concepts = []
235
  for token in sent:
236
- if token.lemma_.lower() in concept_words:
 
237
  current_concepts.append(token.lemma_.lower())
238
 
239
  # Crear conexiones entre conceptos en la misma oración
240
  for i, concept1 in enumerate(current_concepts):
241
  for concept2 in current_concepts[i+1:]:
242
  if concept1 != concept2:
243
- # Si ya existe la arista, incrementar el peso
244
  if G.has_edge(concept1, concept2):
245
  G[concept1][concept2]['weight'] += 1
246
- # Si no existe, crear nueva arista con peso 1
247
  else:
248
  G.add_edge(concept1, concept2, weight=1)
249
 
@@ -251,7 +279,6 @@ def create_concept_graph(doc, key_concepts):
251
 
252
  except Exception as e:
253
  logger.error(f"Error en create_concept_graph: {str(e)}")
254
- # Retornar un grafo vacío en caso de error
255
  return nx.Graph()
256
 
257
  ###############################################################################
 
183
 
184
  def identify_key_concepts(doc, stopwords, min_freq=2, min_length=3):
185
  """
186
+ Identifica conceptos clave en el texto, excluyendo entidades nombradas.
187
+ Args:
188
+ doc: Documento procesado por spaCy
189
+ stopwords: Lista de stopwords
190
+ min_freq: Frecuencia mínima para considerar un concepto
191
+ min_length: Longitud mínima del concepto
192
+ Returns:
193
+ List[Tuple[str, int]]: Lista de tuplas (concepto, frecuencia)
194
  """
195
  try:
196
  word_freq = Counter()
197
 
198
+ # Crear conjunto de tokens que son parte de entidades
199
+ entity_tokens = set()
200
+ for ent in doc.ents:
201
+ entity_tokens.update(token.i for token in ent)
202
+
203
+ # Procesar tokens
204
  for token in doc:
205
+ # Verificar si el token no es parte de una entidad nombrada
206
+ if (token.i not in entity_tokens and # No es parte de una entidad
207
+ token.lemma_.lower() not in stopwords and # No es stopword
208
+ len(token.lemma_) >= min_length and # Longitud mínima
209
+ token.is_alpha and # Es alfabético
210
+ not token.is_punct and # No es puntuación
211
+ not token.like_num and # No es número
212
+ not token.is_space and # No es espacio
213
+ not token.is_stop and # No es stopword de spaCy
214
+ not token.pos_ == 'PROPN' and # No es nombre propio
215
+ not token.pos_ == 'SYM' and # No es símbolo
216
+ not token.pos_ == 'NUM' and # No es número
217
+ not token.pos_ == 'X'): # No es otro
218
 
219
+ # Convertir a minúsculas y añadir al contador
220
  word_freq[token.lemma_.lower()] += 1
221
 
222
+ # Filtrar conceptos por frecuencia mínima y ordenar por frecuencia
223
  concepts = [(word, freq) for word, freq in word_freq.items()
224
  if freq >= min_freq]
225
  concepts.sort(key=lambda x: x[1], reverse=True)
226
 
227
+ logger.info(f"Identified {len(concepts)} key concepts after excluding entities")
228
  return concepts[:10]
229
 
230
  except Exception as e:
 
232
  return []
233
 
234
  ########################################################################
235
+
236
  def create_concept_graph(doc, key_concepts):
237
  """
238
+ Crea un grafo de relaciones entre conceptos, ignorando entidades.
239
  Args:
240
  doc: Documento procesado por spaCy
241
  key_concepts: Lista de tuplas (concepto, frecuencia)
 
248
  # Crear un conjunto de conceptos clave para búsqueda rápida
249
  concept_words = {concept[0].lower() for concept in key_concepts}
250
 
251
+ # Crear conjunto de tokens que son parte de entidades
252
+ entity_tokens = set()
253
+ for ent in doc.ents:
254
+ entity_tokens.update(token.i for token in ent)
255
+
256
  # Añadir nodos al grafo
257
  for concept, freq in key_concepts:
258
  G.add_node(concept.lower(), weight=freq)
259
 
260
  # Analizar cada oración
261
  for sent in doc.sents:
262
+ # Obtener conceptos en la oración actual, excluyendo entidades
263
  current_concepts = []
264
  for token in sent:
265
+ if (token.i not in entity_tokens and
266
+ token.lemma_.lower() in concept_words):
267
  current_concepts.append(token.lemma_.lower())
268
 
269
  # Crear conexiones entre conceptos en la misma oración
270
  for i, concept1 in enumerate(current_concepts):
271
  for concept2 in current_concepts[i+1:]:
272
  if concept1 != concept2:
 
273
  if G.has_edge(concept1, concept2):
274
  G[concept1][concept2]['weight'] += 1
 
275
  else:
276
  G.add_edge(concept1, concept2, weight=1)
277
 
 
279
 
280
  except Exception as e:
281
  logger.error(f"Error en create_concept_graph: {str(e)}")
 
282
  return nx.Graph()
283
 
284
  ###############################################################################