Skip to content

Commit ad1b897

Browse files
committed
fix: corrige extração de complementos de relação
1 parent 56c0978 commit ad1b897

File tree

1 file changed

+27
-20
lines changed

1 file changed

+27
-20
lines changed

src/extraction.py

Lines changed: 27 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -187,7 +187,7 @@ class Extractor:
187187
_RELATION_ADVERBS = {"não", "ja", "ainda", "também", "nunca"}
188188

189189
# Dependências que tipicamente iniciam um complemento
190-
_COMPLEMENT_HEAD_DEPS = {"obj", "iobj", "xcomp", "obl", "advmod"}
190+
_COMPLEMENT_HEAD_DEPS = {"obj", "iobj", "xcomp", "obl", "advmod", "nmod"}
191191

192192
# Dependências que iniciam orações subordinadas
193193
_SUBORDINATE_CLAUSE_DEPS = {"advcl", "ccomp"}
@@ -309,35 +309,42 @@ def __process_conjunction(self, start_node: Token) -> List[Extraction]:
309309
return []
310310
subject_element = TripleElement()
311311

312-
# Passo 1: Obter todas as relações coordenadas (ex: [compro, empresto, vendo])
313312
sr_pairs = self.__extract_relation_and_conjunctions(subject_element, start_node)
314313

315-
# Passo 2: Para cada relação, encontrar seus complementos de forma independente
316-
completed_extractions = []
314+
# precisamos manter o verbo raiz de cada extração.
315+
completed_sr_pairs = []
317316
for rel_extr, effective_verb in sr_pairs:
318317
processed_list = self.__extract_complements(rel_extr, effective_verb)
319-
# Se __extract_complements não encontrar nada, usa a extração original (S-R)
320318
if not processed_list:
321-
completed_extractions.append(rel_extr)
319+
completed_sr_pairs.append((rel_extr, effective_verb))
322320
else:
323-
# Adiciona todas as extrações encontradas (geralmente uma, mas pode haver mais)
324-
completed_extractions.extend(processed_list)
321+
for ex in processed_list:
322+
completed_sr_pairs.append((ex, effective_verb))
325323

326-
# Passo 3: Lógica de distribuição do complemento
327-
# Se houver mais de uma extração (implica conjunção de verbos) e a configuração permitir
328-
if len(completed_extractions) > 1 and self.config.coordinating_conjunctions:
329-
# Pega o complemento da ÚLTIMA extração da cadeia
330-
last_complement = completed_extractions[-1].complement
324+
# Lógica de distribuição de complementos
325+
if len(completed_sr_pairs) > 1 and self.config.coordinating_conjunctions:
326+
# Pega a última extração e seu verbo raiz
327+
last_extraction, last_verb = completed_sr_pairs[-1]
328+
last_complement = last_extraction.complement
331329

332-
# Se o último complemento for válido
330+
# Verifica se o último complemento é válido para propagação
333331
if last_complement and not last_complement.is_empty():
334-
# Itera sobre as extrações ANTERIORES
335-
for i in range(len(completed_extractions) - 1):
336-
# Se uma extração anterior não tiver complemento, ela herda o último
337-
if not completed_extractions[i].complement or completed_extractions[i].complement.is_empty():
338-
completed_extractions[i].complement = last_complement
339332

340-
return completed_extractions
333+
# Só propague complementos de um verbo de ação (VERB).
334+
if last_verb.pos_ == 'VERB':
335+
# Itera sobre as extrações/verbos anteriores
336+
for i in range(len(completed_sr_pairs) - 1):
337+
current_extraction, current_verb = completed_sr_pairs[i]
338+
339+
# Se a extração atual não tiver complemento E seu verbo raiz também for VERB
340+
if (
341+
not current_extraction.complement or current_extraction.complement.is_empty()) and current_verb.pos_ == 'VERB':
342+
# Propaga o complemento
343+
current_extraction.complement = last_complement
344+
345+
# Extrai apenas os objetos de extração para retornar
346+
final_extractions = [ex for ex, _ in completed_sr_pairs]
347+
return final_extractions
341348

342349
def __find_subject(self, verb_token: Token) -> Optional[TripleElement]:
343350
"""Encontra o sujeito de um determinado verbo, lidando com voz passiva, orações relativas e verbos existenciais."""

0 commit comments

Comments
 (0)