Spaces:
Runtime error
Runtime error
Update app.py
Browse files
app.py
CHANGED
|
@@ -18,7 +18,7 @@ def image_to_base64(image):
|
|
| 18 |
|
| 19 |
def parse_markdown_table_to_df(table_text):
|
| 20 |
"""Parse un tableau Markdown en Pandas DataFrame de manière robuste."""
|
| 21 |
-
# Nettoyer les <br>
|
| 22 |
table_text = re.sub(r'<br>', '\n', table_text)
|
| 23 |
|
| 24 |
lines = table_text.split('\n')
|
|
@@ -49,8 +49,11 @@ def parse_markdown_table_to_df(table_text):
|
|
| 49 |
# Extraire les lignes de données (lignes suivantes)
|
| 50 |
rows = []
|
| 51 |
for line in data_lines[1:]:
|
| 52 |
-
cells =
|
| 53 |
-
cleaned_cells = [cell.strip() for cell in cells]
|
|
|
|
|
|
|
|
|
|
| 54 |
# Gérer le mismatch de colonnes
|
| 55 |
if len(cleaned_cells) < num_columns:
|
| 56 |
cleaned_cells.extend([''] * (num_columns - len(cleaned_cells)))
|
|
@@ -63,14 +66,14 @@ def parse_markdown_table_to_df(table_text):
|
|
| 63 |
return df if not df.empty else pd.DataFrame({"Erreur": ["Aucune donnée valide extraite"]})
|
| 64 |
|
| 65 |
def extract_additional_text_and_table(response):
|
| 66 |
-
"""Extraire le texte additionnel et le tableau Markdown de la réponse structurée."""
|
| 67 |
-
|
| 68 |
-
|
| 69 |
-
|
| 70 |
-
|
| 71 |
-
else
|
| 72 |
-
|
| 73 |
-
|
| 74 |
return additional_text, table_text
|
| 75 |
|
| 76 |
def process_image_and_get_response(image):
|
|
@@ -83,18 +86,19 @@ def process_image_and_get_response(image):
|
|
| 83 |
|
| 84 |
# Prompt optimisé pour structure, précision et inclusion des infos supplémentaires
|
| 85 |
prompt = (
|
| 86 |
-
"Analyse l'image et extrait
|
| 87 |
-
"D'abord, extrait
|
| 88 |
-
"
|
|
|
|
| 89 |
"Utilise un format Markdown pour le tableau avec des | pour les colonnes et une ligne |---|---| pour les séparateurs. "
|
| 90 |
"Assure-toi que CHAQUE ligne (en-têtes, séparateurs, données) a EXACTEMENT le même nombre de colonnes (compte les | : il doit y en avoir 10 pour 9 colonnes, incluant les | de début et fin). "
|
| 91 |
-
"Pour les sauts de ligne dans une cellule, utilise \n
|
| 92 |
-
"
|
| 93 |
"N'ajoute aucun texte explicatif dans le tableau. "
|
| 94 |
"Structure ta réponse exactement comme suit :\n"
|
| 95 |
-
"Additional text: [tout le texte additionnel,
|
| 96 |
"Table:\n"
|
| 97 |
-
"[le tableau Markdown ici]"
|
| 98 |
)
|
| 99 |
|
| 100 |
try:
|
|
@@ -136,9 +140,10 @@ def process_image_and_get_response(image):
|
|
| 136 |
else:
|
| 137 |
pd.DataFrame({"Message": ["Erreur lors du parsing du tableau"]}).to_excel(writer, sheet_name='Tableau_Extrait', index=False)
|
| 138 |
|
| 139 |
-
# Feuille pour le texte additionnel, si présent
|
| 140 |
-
if additional_text:
|
| 141 |
-
|
|
|
|
| 142 |
additional_df.to_excel(writer, sheet_name='Infos_Supplementaires', index=False)
|
| 143 |
|
| 144 |
excel_file = tmp.name
|
|
|
|
| 18 |
|
| 19 |
def parse_markdown_table_to_df(table_text):
|
| 20 |
"""Parse un tableau Markdown en Pandas DataFrame de manière robuste."""
|
| 21 |
+
# Nettoyer les <br> ou \n pour les sauts de ligne dans les cellules
|
| 22 |
table_text = re.sub(r'<br>', '\n', table_text)
|
| 23 |
|
| 24 |
lines = table_text.split('\n')
|
|
|
|
| 49 |
# Extraire les lignes de données (lignes suivantes)
|
| 50 |
rows = []
|
| 51 |
for line in data_lines[1:]:
|
| 52 |
+
cells = re.split(r'(?<!\\)\|', line)[1:-1] # Split sur | non échappé
|
| 53 |
+
cleaned_cells = [cell.strip().replace("''", "").replace("'''", "").strip() for cell in cells] # Nettoyer '' et '''
|
| 54 |
+
# Vérifier si la ligne est entièrement vide
|
| 55 |
+
if all(cell == '' for cell in cleaned_cells):
|
| 56 |
+
continue # Ignorer les lignes entièrement vides
|
| 57 |
# Gérer le mismatch de colonnes
|
| 58 |
if len(cleaned_cells) < num_columns:
|
| 59 |
cleaned_cells.extend([''] * (num_columns - len(cleaned_cells)))
|
|
|
|
| 66 |
return df if not df.empty else pd.DataFrame({"Erreur": ["Aucune donnée valide extraite"]})
|
| 67 |
|
| 68 |
def extract_additional_text_and_table(response):
|
| 69 |
+
"""Extraire le texte additionnel et le tableau Markdown de la réponse structurée, de manière robuste."""
|
| 70 |
+
# Chercher 'Additional text:' et 'Table:'
|
| 71 |
+
additional_match = re.search(r'Additional text:(.*?)Table:', response, re.DOTALL | re.IGNORECASE)
|
| 72 |
+
table_match = re.search(r'Table:(.*)', response, re.DOTALL | re.IGNORECASE)
|
| 73 |
+
|
| 74 |
+
additional_text = additional_match.group(1).strip() if additional_match else ''
|
| 75 |
+
table_text = table_match.group(1).strip() if table_match else response.strip()
|
| 76 |
+
|
| 77 |
return additional_text, table_text
|
| 78 |
|
| 79 |
def process_image_and_get_response(image):
|
|
|
|
| 86 |
|
| 87 |
# Prompt optimisé pour structure, précision et inclusion des infos supplémentaires
|
| 88 |
prompt = (
|
| 89 |
+
"Analyse l'image attentivement et extrait TOUT le contenu visible. "
|
| 90 |
+
"D'abord, extrait TOUT texte additionnel autour, au-dessus, en-dessous ou à côté du tableau (titres, en-têtes de page, notes, pieds de page, logos, dates, signatures, etc.), en le recopiant mot pour mot, même si cela semble non structuré. Inclu tout ce qui n'est pas dans le tableau lui-même. "
|
| 91 |
+
"Si il n'y a pas de texte additionnel, laisse 'Additional text:' vide. "
|
| 92 |
+
"Ensuite, extrait le tableau en entier, en recopiant TOUTES les lignes et colonnes à l'identique, y compris les lignes vides ou partielles (mais marque les cellules vides avec ''). "
|
| 93 |
"Utilise un format Markdown pour le tableau avec des | pour les colonnes et une ligne |---|---| pour les séparateurs. "
|
| 94 |
"Assure-toi que CHAQUE ligne (en-têtes, séparateurs, données) a EXACTEMENT le même nombre de colonnes (compte les | : il doit y en avoir 10 pour 9 colonnes, incluant les | de début et fin). "
|
| 95 |
+
"Pour les sauts de ligne dans une cellule, utilise \n. "
|
| 96 |
+
"Ne remplace pas les cellules vides par quoi que ce soit d'autre que ''. "
|
| 97 |
"N'ajoute aucun texte explicatif dans le tableau. "
|
| 98 |
"Structure ta réponse exactement comme suit :\n"
|
| 99 |
+
"Additional text: [tout le texte additionnel ici, séparé par \n si plusieurs lignes ; vide si rien]\n"
|
| 100 |
"Table:\n"
|
| 101 |
+
"[le tableau Markdown ici, sans lignes vides inutiles]"
|
| 102 |
)
|
| 103 |
|
| 104 |
try:
|
|
|
|
| 140 |
else:
|
| 141 |
pd.DataFrame({"Message": ["Erreur lors du parsing du tableau"]}).to_excel(writer, sheet_name='Tableau_Extrait', index=False)
|
| 142 |
|
| 143 |
+
# Feuille pour le texte additionnel, si présent et non vide
|
| 144 |
+
if additional_text.strip():
|
| 145 |
+
additional_lines = additional_text.split('\n')
|
| 146 |
+
additional_df = pd.DataFrame({"Texte Additionnel": additional_lines})
|
| 147 |
additional_df.to_excel(writer, sheet_name='Infos_Supplementaires', index=False)
|
| 148 |
|
| 149 |
excel_file = tmp.name
|