Dabococo commited on
Commit
57aa78b
·
verified ·
1 Parent(s): f9bb48d

Update app.py

Browse files
Files changed (1) hide show
  1. app.py +26 -21
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> en \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,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 = line.split('|')[1:-1]
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
- if 'Additional text:' in response and 'Table:' in response:
68
- parts = response.split('Table:', 1)
69
- additional_text = parts[0].replace('Additional text:', '').strip()
70
- table_text = parts[1].strip() if len(parts) > 1 else ''
71
- else:
72
- additional_text = ''
73
- table_text = response.strip()
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 tout le contenu. "
87
- "D'abord, extrait tout texte additionnel autour ou en dehors du tableau (titres, notes, pieds de page, etc.), en le recopiant mot pour mot. "
88
- "Ensuite, extrait le tableau en entier, en recopiant toutes les lignes et colonnes à l'identique, y compris les lignes vides ou partielles. "
 
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 au lieu de <br>. "
92
- "Remplis les cellules vides avec '' si nécessaire pour maintenir l'alignement. "
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, s'il y en a ; sinon, laisse vide]\n"
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
- additional_df = pd.DataFrame({"Texte Additionnel": additional_text.split('\n')})
 
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