Spaces:
Running
Running
Merge pull request #204 from Eralien/dev-clean_pdf
Browse files- crazy_functions/批量总结PDF文档.py +3 -2
- toolbox.py +57 -1
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()
|