Fixing detección palabras simultaneas
Browse files- .gitignore +2 -1
- campos/ine_actual.py +3 -2
- herramientas.py +28 -26
- identificador.py +12 -3
- tools/__pycache__/ine_actual.cpython-311.pyc +0 -0
- tools/__pycache__/ine_antes.cpython-311.pyc +0 -0
- tools/ine_actual.py +4 -0
.gitignore
CHANGED
@@ -1,3 +1,4 @@
|
|
1 |
/venv/
|
2 |
/__pycache__/
|
3 |
-
campos/__pycache__/
|
|
|
|
1 |
/venv/
|
2 |
/__pycache__/
|
3 |
+
campos/__pycache__/
|
4 |
+
tools/__pycache__/
|
campos/ine_actual.py
CHANGED
@@ -1,5 +1,6 @@
|
|
1 |
import herramientas
|
2 |
import tools.ine_actual as ine_actual_tools
|
|
|
3 |
|
4 |
def vigencia(textos_extraidos, textos_extraidos_limpios):
|
5 |
|
@@ -10,8 +11,8 @@ def vigencia(textos_extraidos, textos_extraidos_limpios):
|
|
10 |
indice, textos_extraidos_corregidos = herramientas.buscaIndexMultiplesPalabras(textos_extraidos_limpios, conceptos_busqueda)
|
11 |
|
12 |
textos_extraidos_limpios = textos_extraidos_corregidos
|
13 |
-
print("El índice de
|
14 |
-
|
15 |
texto_genero = textos_extraidos_limpios[indice]
|
16 |
print("Y su correspondiente texto es: " , texto_genero)
|
17 |
|
|
|
1 |
import herramientas
|
2 |
import tools.ine_actual as ine_actual_tools
|
3 |
+
import time
|
4 |
|
5 |
def vigencia(textos_extraidos, textos_extraidos_limpios):
|
6 |
|
|
|
11 |
indice, textos_extraidos_corregidos = herramientas.buscaIndexMultiplesPalabras(textos_extraidos_limpios, conceptos_busqueda)
|
12 |
|
13 |
textos_extraidos_limpios = textos_extraidos_corregidos
|
14 |
+
print("El índice de vigencia es: ", indice)
|
15 |
+
|
16 |
texto_genero = textos_extraidos_limpios[indice]
|
17 |
print("Y su correspondiente texto es: " , texto_genero)
|
18 |
|
herramientas.py
CHANGED
@@ -72,38 +72,44 @@ def buscaIndexMultiplesPalabras(arreglo_textos, conceptos_requeridos):
|
|
72 |
Args:
|
73 |
arreglo (list): Lista de strings de texto extraído (limpios).
|
74 |
conceptos_requeridos (list): Lista de diccionarios, donde cada diccionario define un concepto:
|
75 |
-
|
76 |
|
77 |
Returns:
|
78 |
-
tuple: (índice,
|
79 |
"""
|
80 |
-
print(f"\n---
|
81 |
-
|
82 |
# Paso 1: Normalizar los conceptos y prepararlos para la búsqueda y corrección
|
83 |
conceptos_preparados = []
|
84 |
for concepto in conceptos_requeridos:
|
|
|
85 |
preferida = concepto['preferida'].lower().replace(" ", "")
|
86 |
alternativas = [alt.lower().replace(" ", "") for alt in concepto.get('alternativas', [])]
|
87 |
|
88 |
# Combinamos la preferida con las alternativas para la búsqueda
|
89 |
todas_las_formas = [preferida] + alternativas
|
|
|
90 |
|
91 |
conceptos_preparados.append({
|
92 |
'preferida': preferida,
|
93 |
'todas_las_formas': todas_las_formas,
|
94 |
-
'alternativas': alternativas # Solo las alternativas para saber cuáles corregir
|
95 |
})
|
96 |
|
|
|
|
|
97 |
for i, texto_linea in enumerate(arreglo_textos):
|
98 |
texto_linea_lower = texto_linea.lower()
|
|
|
99 |
|
100 |
# Variables para seguir el rastro de la línea actual
|
101 |
-
es_coincidencia_completa =
|
|
|
102 |
palabras_encontradas_en_linea = {} # Almacena {forma_encontrada: forma_preferida}
|
103 |
|
104 |
# Paso 2: Verificar si TODAS las condiciones se cumplen en esta línea
|
105 |
for concepto in conceptos_preparados:
|
106 |
encontrado_en_esta_linea = False
|
|
|
107 |
|
108 |
# Buscamos si alguna forma (preferida o alternativa) está en la línea
|
109 |
for forma in concepto['todas_las_formas']:
|
@@ -113,40 +119,36 @@ def buscaIndexMultiplesPalabras(arreglo_textos, conceptos_requeridos):
|
|
113 |
# Guardamos qué forma se encontró y cuál es la preferida
|
114 |
palabras_encontradas_en_linea[forma] = concepto['preferida']
|
115 |
|
116 |
-
#
|
117 |
-
|
118 |
-
|
119 |
-
if
|
120 |
-
|
121 |
-
|
|
|
|
|
122 |
break # Si falta un concepto, pasamos a la siguiente línea del arreglo
|
123 |
-
|
|
|
|
|
124 |
# Paso 3: Si se encontró una coincidencia completa, corregimos la línea y la retornamos
|
125 |
if es_coincidencia_completa:
|
|
|
126 |
print(f"ÉXITO: Coincidencia completa en el índice {i}.")
|
127 |
print(f"Texto linea es: {texto_linea}")
|
128 |
|
129 |
linea_corregida = texto_linea
|
130 |
|
131 |
for forma_encontrada, forma_preferida in palabras_encontradas_en_linea.items():
|
132 |
-
# Nota: Esta corrección simple asume que la palabra encontrada está exactamente igual que en la lista de alternativas (minusculas y sin espacios)
|
133 |
-
# Para un OCR más variable, necesitarías una lógica de reemplazo más avanzada (ej. re.sub),
|
134 |
-
# pero para tu caso de "nacimento" a "nacimiento" esto funciona si la palabra se encuentra exactamente.
|
135 |
-
|
136 |
-
# Usamos re.sub para reemplazar la palabra encontrada con la preferida, insensible a mayúsculas/minúsculas
|
137 |
-
# (re.escape para manejar caracteres especiales si los hubiera)
|
138 |
patron_reemplazo = re.compile(re.escape(forma_encontrada), re.IGNORECASE)
|
139 |
-
|
140 |
-
# Reemplazamos la palabra encontrada en la línea original con la forma preferida
|
141 |
linea_corregida = patron_reemplazo.sub(forma_preferida, linea_corregida, count=1)
|
142 |
-
|
143 |
print(f"Línea corregida: '{linea_corregida}'")
|
144 |
-
|
145 |
|
146 |
-
arreglo_textos[i] = linea_corregida
|
147 |
return i, arreglo_textos
|
148 |
|
|
|
149 |
print(f"\n--- Búsqueda finalizada ---")
|
150 |
print("Ninguna línea contiene todas las palabras requeridas.")
|
151 |
-
return None, None
|
152 |
-
|
|
|
72 |
Args:
|
73 |
arreglo (list): Lista de strings de texto extraído (limpios).
|
74 |
conceptos_requeridos (list): Lista de diccionarios, donde cada diccionario define un concepto:
|
75 |
+
Ej: {'preferida': 'nacimiento', 'alternativas': ['nacimento', 'nacimuento']}
|
76 |
|
77 |
Returns:
|
78 |
+
tuple: (índice, arreglo_corregido) si se encuentra, o (None, None) si no se encuentra.
|
79 |
"""
|
80 |
+
print(f"\n--- Entre a busqueda palabras index ---")
|
81 |
+
|
82 |
# Paso 1: Normalizar los conceptos y prepararlos para la búsqueda y corrección
|
83 |
conceptos_preparados = []
|
84 |
for concepto in conceptos_requeridos:
|
85 |
+
print("Preparación de conceptos, estoy en el concepto: ", concepto)
|
86 |
preferida = concepto['preferida'].lower().replace(" ", "")
|
87 |
alternativas = [alt.lower().replace(" ", "") for alt in concepto.get('alternativas', [])]
|
88 |
|
89 |
# Combinamos la preferida con las alternativas para la búsqueda
|
90 |
todas_las_formas = [preferida] + alternativas
|
91 |
+
print("Todas las formas quedó como: ", todas_las_formas)
|
92 |
|
93 |
conceptos_preparados.append({
|
94 |
'preferida': preferida,
|
95 |
'todas_las_formas': todas_las_formas,
|
|
|
96 |
})
|
97 |
|
98 |
+
print("Conceptos preparados quedó como: ", conceptos_preparados)
|
99 |
+
|
100 |
for i, texto_linea in enumerate(arreglo_textos):
|
101 |
texto_linea_lower = texto_linea.lower()
|
102 |
+
print("Trabajando la línea: ", texto_linea_lower)
|
103 |
|
104 |
# Variables para seguir el rastro de la línea actual
|
105 |
+
es_coincidencia_completa = False
|
106 |
+
print("La var es_coincidencia_completa empieza como false...")
|
107 |
palabras_encontradas_en_linea = {} # Almacena {forma_encontrada: forma_preferida}
|
108 |
|
109 |
# Paso 2: Verificar si TODAS las condiciones se cumplen en esta línea
|
110 |
for concepto in conceptos_preparados:
|
111 |
encontrado_en_esta_linea = False
|
112 |
+
print("Revisando CONCEPTO: ", concepto)
|
113 |
|
114 |
# Buscamos si alguna forma (preferida o alternativa) está en la línea
|
115 |
for forma in concepto['todas_las_formas']:
|
|
|
119 |
# Guardamos qué forma se encontró y cuál es la preferida
|
120 |
palabras_encontradas_en_linea[forma] = concepto['preferida']
|
121 |
|
122 |
+
# print("Estoy por hacer break porque encontré la línea...")
|
123 |
+
# # Hemos encontrado una forma para este concepto, pasamos al siguiente concepto
|
124 |
+
# break
|
125 |
+
print("Paso if encontrado_en_esta_linea es True...")
|
126 |
+
if encontrado_en_esta_linea:
|
127 |
+
es_coincidencia_completa = True
|
128 |
+
print(f"Línea {i}: Concepto '{concepto['preferida']}' : Encontrado.")
|
129 |
+
print("Estoy por hacer break por que es_coincidencia_completa es True...")
|
130 |
break # Si falta un concepto, pasamos a la siguiente línea del arreglo
|
131 |
+
|
132 |
+
|
133 |
+
print("Paso: if es_coincidencia_completa:")
|
134 |
# Paso 3: Si se encontró una coincidencia completa, corregimos la línea y la retornamos
|
135 |
if es_coincidencia_completa:
|
136 |
+
print("Aquí llega cuando encuentra algo, en su línea respectiva, pero cuando no encuentra nada, se queda en cero.")
|
137 |
print(f"ÉXITO: Coincidencia completa en el índice {i}.")
|
138 |
print(f"Texto linea es: {texto_linea}")
|
139 |
|
140 |
linea_corregida = texto_linea
|
141 |
|
142 |
for forma_encontrada, forma_preferida in palabras_encontradas_en_linea.items():
|
|
|
|
|
|
|
|
|
|
|
|
|
143 |
patron_reemplazo = re.compile(re.escape(forma_encontrada), re.IGNORECASE)
|
|
|
|
|
144 |
linea_corregida = patron_reemplazo.sub(forma_preferida, linea_corregida, count=1)
|
145 |
+
|
146 |
print(f"Línea corregida: '{linea_corregida}'")
|
147 |
+
arreglo_textos[i] = linea_corregida
|
148 |
|
|
|
149 |
return i, arreglo_textos
|
150 |
|
151 |
+
print("Paso: Búsqueda finalizada.:")
|
152 |
print(f"\n--- Búsqueda finalizada ---")
|
153 |
print("Ninguna línea contiene todas las palabras requeridas.")
|
154 |
+
return None, None
|
|
identificador.py
CHANGED
@@ -1,5 +1,6 @@
|
|
1 |
import herramientas
|
2 |
import conceptos_busqueda
|
|
|
3 |
|
4 |
def identifica_documento(textos_extraidos_simplificados):
|
5 |
"""
|
@@ -21,8 +22,7 @@ def identifica_documento(textos_extraidos_simplificados):
|
|
21 |
# Usamos 'getattr' para acceder dinámicamente al atributo correcto
|
22 |
# del objeto 'conceptos_busqueda', como 'conceptos_busqueda.dni'.
|
23 |
conceptos_actuales = getattr(conceptos_busqueda, tipo_documento)
|
24 |
-
|
25 |
-
|
26 |
# Llama a la función de búsqueda para el tipo de documento actual
|
27 |
indice, textos_corregidos = herramientas.buscaIndexMultiplesPalabras(
|
28 |
textos_extraidos_simplificados,
|
@@ -46,17 +46,26 @@ def identifica_ine(textos_extraidos_simplificados):
|
|
46 |
#Buscaré los dos campos que tienen SOLO las INE antigüas: localidad y municipio.
|
47 |
#Municipio
|
48 |
conceptos_busqueda = [{'preferida': 'municipio', 'alternativas': ['']}]
|
|
|
49 |
indice, textos_extraidos_corregidos = herramientas.buscaIndexMultiplesPalabras(textos_extraidos_simplificados, conceptos_busqueda)
|
|
|
|
|
50 |
municipio_existe = True if indice is not None else False
|
51 |
|
|
|
|
|
52 |
#Localidad
|
53 |
conceptos_busqueda = [{'preferida': 'localidad', 'alternativas': ['']}]
|
54 |
indice, textos_extraidos_corregidos = herramientas.buscaIndexMultiplesPalabras(textos_extraidos_simplificados, conceptos_busqueda)
|
55 |
localidad_existe = True if indice is not None else False
|
56 |
|
|
|
|
|
57 |
if municipio_existe and localidad_existe:
|
58 |
tipo_ine = 'ine_antes'
|
59 |
else:
|
60 |
tipo_ine = 'ine_actual'
|
61 |
-
|
|
|
|
|
62 |
return tipo_ine
|
|
|
1 |
import herramientas
|
2 |
import conceptos_busqueda
|
3 |
+
import time
|
4 |
|
5 |
def identifica_documento(textos_extraidos_simplificados):
|
6 |
"""
|
|
|
22 |
# Usamos 'getattr' para acceder dinámicamente al atributo correcto
|
23 |
# del objeto 'conceptos_busqueda', como 'conceptos_busqueda.dni'.
|
24 |
conceptos_actuales = getattr(conceptos_busqueda, tipo_documento)
|
25 |
+
|
|
|
26 |
# Llama a la función de búsqueda para el tipo de documento actual
|
27 |
indice, textos_corregidos = herramientas.buscaIndexMultiplesPalabras(
|
28 |
textos_extraidos_simplificados,
|
|
|
46 |
#Buscaré los dos campos que tienen SOLO las INE antigüas: localidad y municipio.
|
47 |
#Municipio
|
48 |
conceptos_busqueda = [{'preferida': 'municipio', 'alternativas': ['']}]
|
49 |
+
print("Entrando a busqueda de municipio en buscar multiples palabras: ")
|
50 |
indice, textos_extraidos_corregidos = herramientas.buscaIndexMultiplesPalabras(textos_extraidos_simplificados, conceptos_busqueda)
|
51 |
+
print("Salí de la búsqueda...")
|
52 |
+
|
53 |
municipio_existe = True if indice is not None else False
|
54 |
|
55 |
+
print("Municipio existe: ", municipio_existe)
|
56 |
+
|
57 |
#Localidad
|
58 |
conceptos_busqueda = [{'preferida': 'localidad', 'alternativas': ['']}]
|
59 |
indice, textos_extraidos_corregidos = herramientas.buscaIndexMultiplesPalabras(textos_extraidos_simplificados, conceptos_busqueda)
|
60 |
localidad_existe = True if indice is not None else False
|
61 |
|
62 |
+
print("Localidad existe: ", localidad_existe)
|
63 |
+
|
64 |
if municipio_existe and localidad_existe:
|
65 |
tipo_ine = 'ine_antes'
|
66 |
else:
|
67 |
tipo_ine = 'ine_actual'
|
68 |
+
|
69 |
+
print("INE detectada es: ", tipo_ine)
|
70 |
+
|
71 |
return tipo_ine
|
tools/__pycache__/ine_actual.cpython-311.pyc
DELETED
Binary file (544 Bytes)
|
|
tools/__pycache__/ine_antes.cpython-311.pyc
DELETED
Binary file (694 Bytes)
|
|
tools/ine_actual.py
CHANGED
@@ -1,5 +1,9 @@
|
|
|
|
|
|
1 |
def obtener_vigencia(indice, textos_extraidos_libres):
|
2 |
|
|
|
|
|
3 |
#Aquí recibo el índice porque lo que quiero es la posición no el texto.
|
4 |
|
5 |
print("El índice es:", indice)
|
|
|
1 |
+
import time
|
2 |
+
|
3 |
def obtener_vigencia(indice, textos_extraidos_libres):
|
4 |
|
5 |
+
print("Estoy en obtener vigencia ine actual.")
|
6 |
+
|
7 |
#Aquí recibo el índice porque lo que quiero es la posición no el texto.
|
8 |
|
9 |
print("El índice es:", indice)
|