@@ -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