binary-husky commited on
Commit
94e75d2
2 Parent(s): da8cb77 6fc2423

Merge pull request #204 from Eralien/dev-clean_pdf

Browse files
crazy_functions/批量总结PDF文档.py CHANGED
@@ -1,5 +1,5 @@
1
  from predict import predict_no_ui
2
- from toolbox import CatchException, report_execption, write_results_to_file, predict_no_ui_but_counting_down
3
  fast_debug = False
4
 
5
 
@@ -11,6 +11,7 @@ def 解析PDF(file_manifest, project_folder, top_p, temperature, chatbot, histor
11
  file_content = ""
12
  for page in doc:
13
  file_content += page.get_text()
 
14
  print(file_content)
15
 
16
  prefix = "接下来请你逐文件分析下面的论文文件,概括其内容" if index==0 else ""
@@ -58,7 +59,7 @@ def 批量总结PDF文档(txt, top_p, temperature, chatbot, history, systemPromp
58
  # 基本信息:功能、贡献者
59
  chatbot.append([
60
  "函数插件功能?",
61
- "批量总结PDF文档。函数插件贡献者: ValeriaWong"])
62
  yield chatbot, history, '正常'
63
 
64
  # 尝试导入依赖,如果缺少依赖,则给出安装建议
 
1
  from predict import predict_no_ui
2
+ from toolbox import CatchException, report_execption, write_results_to_file, predict_no_ui_but_counting_down, clean_text
3
  fast_debug = False
4
 
5
 
 
11
  file_content = ""
12
  for page in doc:
13
  file_content += page.get_text()
14
+ file_content = clean_text(file_content)
15
  print(file_content)
16
 
17
  prefix = "接下来请你逐文件分析下面的论文文件,概括其内容" if index==0 else ""
 
59
  # 基本信息:功能、贡献者
60
  chatbot.append([
61
  "函数插件功能?",
62
+ "批量总结PDF文档。函数插件贡献者: ValeriaWong,Eralien"])
63
  yield chatbot, history, '正常'
64
 
65
  # 尝试导入依赖,如果缺少依赖,则给出安装建议
toolbox.py CHANGED
@@ -279,4 +279,60 @@ def clear_line_break(txt):
279
  txt = txt.replace('\n', ' ')
280
  txt = txt.replace(' ', ' ')
281
  txt = txt.replace(' ', ' ')
282
- return txt
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
279
  txt = txt.replace('\n', ' ')
280
  txt = txt.replace(' ', ' ')
281
  txt = txt.replace(' ', ' ')
282
+ return txt
283
+
284
+ import re
285
+ import unicodedata
286
+
287
+ def is_paragraph_break(match):
288
+ """
289
+ 根据给定的匹配结果来判断换行符是否表示段落分隔。
290
+ 如果换行符前为句子结束标志(句号,感叹号,问号),且下一个字符为大写字母,则换行符更有可能表示段落分隔。
291
+ 也可以根据之前的内容长度来判断段落是否已经足够长。
292
+ """
293
+ prev_char, next_char = match.groups()
294
+
295
+ # 句子结束标志
296
+ sentence_endings = ".!?"
297
+
298
+ # 设定一个最小段落长度阈值
299
+ min_paragraph_length = 140
300
+
301
+ if prev_char in sentence_endings and next_char.isupper() and len(match.string[:match.start(1)]) > min_paragraph_length:
302
+ return "\n\n"
303
+ else:
304
+ return " "
305
+
306
+ def normalize_text(text):
307
+ """
308
+ 通过把连字(ligatures)等文本特殊符号转换为其基本形式来对文本进行归一化处理。
309
+ 例如,将连字 "fi" 转换为 "f" 和 "i"。
310
+ """
311
+ # 对文本进行归一化处理,分解连字
312
+ normalized_text = unicodedata.normalize("NFKD", text)
313
+
314
+ # 替换其他特殊字符
315
+ cleaned_text = re.sub(r'[^\x00-\x7F]+', '', normalized_text)
316
+
317
+ return cleaned_text
318
+
319
+ def clean_text(raw_text):
320
+ """
321
+ 对从 PDF 提取出的原始文本进行清洗和格式化处理。
322
+ 1. 对原始文本进行归一化处理。
323
+ 2. 替换跨行的连词,例如 “Espe-\ncially” 转换为 “Especially”。
324
+ 3. 根据 heuristic 规则判断换行符是否是段落分隔,并相应地进行替换。
325
+ """
326
+ # 对文本进行归一化处理
327
+ normalized_text = normalize_text(raw_text)
328
+
329
+ # 替换跨行的连词
330
+ text = re.sub(r'(\w+-\n\w+)', lambda m: m.group(1).replace('-\n', ''), normalized_text)
331
+
332
+ # 根据前后相邻字符的特点,找到原文本中的换行符
333
+ newlines = re.compile(r'(\S)\n(\S)')
334
+
335
+ # 根据 heuristic 规则,用空格或段落分隔符替换原换行符
336
+ final_text = re.sub(newlines, lambda m: m.group(1) + is_paragraph_break(m) + m.group(2), text)
337
+
338
+ return final_text.strip()