fccoelho commited on
Commit
eef235b
·
1 Parent(s): 56333b8

refactor: ajustar regex e lógica de extração de referências bibliográficas

Browse files
Files changed (1) hide show
  1. app.py +68 -78
app.py CHANGED
@@ -124,7 +124,7 @@ def extract_references_with_regex(text):
124
  # Padrões melhorados para extrair referências individuais
125
  patterns = [
126
  # Padrão 0: Referências numeradas com ponto (ex: 46. Autor et al. Título. Journal vol, pages (ano).)
127
- r'^\d+\.\s*([A-Z][A-Za-z\s,&.-]*?et\s+al\.?|[A-Z][A-Za-z\s,&.-]+?)\.\s*([^.]+?)\.\s*([^.]+?)\s+(\d+),?\s*[\d–-]+\s*\((\d{4})\)\.',
128
 
129
  # Padrão 1: Autor(es). (Ano). Título. Journal/Editora.
130
  r'^([A-Z][A-Za-z\s,&.-]+?)\.\s*\((\d{4}[a-z]?)\)\.\s*([^.]+?)\.\s*([^.]+?)\.?\s*$',
@@ -149,85 +149,75 @@ def extract_references_with_regex(text):
149
  lines = text.split('\n')
150
 
151
  # Processar cada linha
152
- for line_num, line in enumerate(lines):
153
- line = line.strip()
154
-
155
- # Pular linhas muito curtas ou que não começam com letra maiúscula
156
- if len(line) < 20 or not line[0].isupper():
157
- continue
158
 
159
- # Pular linhas que são claramente títulos de seção
160
- if re.match(r'^(abstract|introduction|methods?|results?|discussion|conclusion|references?|bibliography|acknowledgments?)\.?\s*$', line, re.IGNORECASE):
161
- continue
162
-
163
- # Tentar cada padrão
164
- for pattern in patterns:
165
- match = re.match(pattern, line, re.MULTILINE | re.IGNORECASE)
166
-
167
- if match:
168
- groups = match.groups()
169
- if len(groups) >= 4:
170
- authors = groups[0].strip()
171
-
172
- # Para o padrão numerado especial (5 grupos)
173
- if len(groups) == 5:
174
- title = groups[1].strip()
175
- journal = groups[2].strip()
176
- volume = groups[3].strip()
177
- year = groups[4].strip()
178
- pages = "" # Será extraído depois do journal
179
- else:
180
- # Para outros padrões (4 grupos)
181
- year = groups[1].strip()
182
- title = groups[2].strip()
183
- journal = groups[3].strip()
184
- volume = ""
185
-
186
- # Validações adicionais
187
- # Verificar se tem pelo menos um autor válido
188
- if not re.search(r'[A-Z][a-z]+', authors):
189
- continue
190
-
191
- # Verificar se o título não é muito curto
192
- if len(title) < 10:
193
- continue
194
-
195
- # Verificar se não é uma linha de cabeçalho ou rodapé
196
- if re.search(r'(page|vol|volume|number|issue)\s*\d+', line, re.IGNORECASE):
197
- continue
198
-
199
- # Extrair DOI se presente
200
- doi_match = re.search(r'doi[:\s]*([^\s,]+)', journal, re.IGNORECASE)
201
- doi = doi_match.group(1) if doi_match else ""
202
-
203
- # Extrair volume e páginas (se não foram extraídos pelo padrão especial)
204
- if len(groups) != 5:
205
- vol_pages_match = re.search(r'(\d+)\s*\(?\d*\)?\s*[,:]\s*(\d+[-–]\d+)', journal)
206
- volume = vol_pages_match.group(1) if vol_pages_match else ""
207
- pages = vol_pages_match.group(2) if vol_pages_match else ""
208
  else:
209
- # Para o padrão numerado, extrair páginas do journal
210
- pages_match = re.search(r'(\d+[-–]\d+)', journal)
211
- pages = pages_match.group(1) if pages_match else ""
212
-
213
- # Limpar campos
214
- authors = re.sub(r'\s+', ' ', authors)
215
- title = re.sub(r'\s+', ' ', title)
216
- journal = re.sub(r'\s+', ' ', journal)
217
-
218
- reference = {
219
- "authors": authors,
220
- "title": title,
221
- "journal": journal,
222
- "year": year,
223
- "volume": volume,
224
- "pages": pages,
225
- "doi": doi,
226
- "line_number": line_num + 1 # Para debug
227
- }
228
-
229
- references.append(reference)
230
- break # Parar na primeira correspondência para esta linha
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
231
 
232
  # Remover duplicatas baseadas no título e ano
233
  seen_refs = set()
 
124
  # Padrões melhorados para extrair referências individuais
125
  patterns = [
126
  # Padrão 0: Referências numeradas com ponto (ex: 46. Autor et al. Título. Journal vol, pages (ano).)
127
+ r'^\d+\.\s*([A-Z][A-Za-z\s,&.-]*?(et\s+al\.)*?|[A-Z][A-Za-z\s,&.-:\d\?]+?\(\);)\.\s*([^.]+?)\.\s*([^.]+?)\s+(\d+),?\s*[\d–-]+\s*\((\d{4})\)\.\s*$',
128
 
129
  # Padrão 1: Autor(es). (Ano). Título. Journal/Editora.
130
  r'^([A-Z][A-Za-z\s,&.-]+?)\.\s*\((\d{4}[a-z]?)\)\.\s*([^.]+?)\.\s*([^.]+?)\.?\s*$',
 
149
  lines = text.split('\n')
150
 
151
  # Processar cada linha
 
 
 
 
 
 
152
 
153
+ # Tentar cada padrão
154
+ for pattern in patterns:
155
+ reflist = re.findall(pattern, text, re.MULTILINE | re.UNICODE|re.DOTALL)
156
+
157
+ if reflist:
158
+ # change the code below to process the list of references in reflist AI!
159
+ if len(groups) >= 4:
160
+ authors = groups[0].strip()
161
+
162
+ # Para o padrão numerado especial (5 grupos)
163
+ if len(groups) == 5:
164
+ title = groups[1].strip()
165
+ journal = groups[2].strip()
166
+ volume = groups[3].strip()
167
+ year = groups[4].strip()
168
+ pages = "" # Será extraído depois do journal
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
169
  else:
170
+ # Para outros padrões (4 grupos)
171
+ year = groups[1].strip()
172
+ title = groups[2].strip()
173
+ journal = groups[3].strip()
174
+ volume = ""
175
+
176
+ # Validações adicionais
177
+ # Verificar se tem pelo menos um autor válido
178
+ if not re.search(r'[A-Z][a-z]+', authors):
179
+ continue
180
+
181
+ # Verificar se o título não é muito curto
182
+ if len(title) < 10:
183
+ continue
184
+
185
+ # Verificar se não é uma linha de cabeçalho ou rodapé
186
+ if re.search(r'(page|vol|volume|number|issue)\s*\d+', line, re.IGNORECASE):
187
+ continue
188
+
189
+ # Extrair DOI se presente
190
+ doi_match = re.search(r'doi[:\s]*([^\s,]+)', journal, re.IGNORECASE)
191
+ doi = doi_match.group(1) if doi_match else ""
192
+
193
+ # Extrair volume e páginas (se não foram extraídos pelo padrão especial)
194
+ if len(groups) != 5:
195
+ vol_pages_match = re.search(r'(\d+)\s*\(?\d*\)?\s*[,:]\s*(\d+[-–]\d+)', journal)
196
+ volume = vol_pages_match.group(1) if vol_pages_match else ""
197
+ pages = vol_pages_match.group(2) if vol_pages_match else ""
198
+ else:
199
+ # Para o padrão numerado, extrair páginas do journal
200
+ pages_match = re.search(r'(\d+[-–]\d+)', journal)
201
+ pages = pages_match.group(1) if pages_match else ""
202
+
203
+ # Limpar campos
204
+ authors = re.sub(r'\s+', ' ', authors)
205
+ title = re.sub(r'\s+', ' ', title)
206
+ journal = re.sub(r'\s+', ' ', journal)
207
+
208
+ reference = {
209
+ "authors": authors,
210
+ "title": title,
211
+ "journal": journal,
212
+ "year": year,
213
+ "volume": volume,
214
+ "pages": pages,
215
+ "doi": doi,
216
+ "line_number": line_num + 1 # Para debug
217
+ }
218
+
219
+ references.append(reference)
220
+ break # Parar na primeira correspondência para esta linha
221
 
222
  # Remover duplicatas baseadas no título e ano
223
  seen_refs = set()