From ac681d32015e3ebbb07685a9a81740ff80811fc0 Mon Sep 17 00:00:00 2001 From: Your Name Date: Fri, 31 Mar 2023 21:46:47 +0800 Subject: [PATCH] =?UTF-8?q?=E7=A7=BB=E5=8A=A8=E5=87=BD=E6=95=B0=E5=88=B0?= =?UTF-8?q?=E8=B0=83=E7=94=A8=E6=A8=A1=E7=BB=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- crazy_functions/批量总结PDF文档.py | 56 +++++++++++++++++++++++++++++- toolbox.py | 56 ------------------------------ 2 files changed, 55 insertions(+), 57 deletions(-) diff --git a/crazy_functions/批量总结PDF文档.py b/crazy_functions/批量总结PDF文档.py index ab9ba83..7270263 100644 --- a/crazy_functions/批量总结PDF文档.py +++ b/crazy_functions/批量总结PDF文档.py @@ -1,7 +1,61 @@ from predict import predict_no_ui -from toolbox import CatchException, report_execption, write_results_to_file, predict_no_ui_but_counting_down, clean_text +from toolbox import CatchException, report_execption, write_results_to_file, predict_no_ui_but_counting_down +import re +import unicodedata fast_debug = False +def is_paragraph_break(match): + """ + 根据给定的匹配结果来判断换行符是否表示段落分隔。 + 如果换行符前为句子结束标志(句号,感叹号,问号),且下一个字符为大写字母,则换行符更有可能表示段落分隔。 + 也可以根据之前的内容长度来判断段落是否已经足够长。 + """ + prev_char, next_char = match.groups() + + # 句子结束标志 + sentence_endings = ".!?" + + # 设定一个最小段落长度阈值 + min_paragraph_length = 140 + + if prev_char in sentence_endings and next_char.isupper() and len(match.string[:match.start(1)]) > min_paragraph_length: + return "\n\n" + else: + return " " + +def normalize_text(text): + """ + 通过把连字(ligatures)等文本特殊符号转换为其基本形式来对文本进行归一化处理。 + 例如,将连字 "fi" 转换为 "f" 和 "i"。 + """ + # 对文本进行归一化处理,分解连字 + normalized_text = unicodedata.normalize("NFKD", text) + + # 替换其他特殊字符 + cleaned_text = re.sub(r'[^\x00-\x7F]+', '', normalized_text) + + return cleaned_text + +def clean_text(raw_text): + """ + 对从 PDF 提取出的原始文本进行清洗和格式化处理。 + 1. 对原始文本进行归一化处理。 + 2. 替换跨行的连词,例如 “Espe-\ncially” 转换为 “Especially”。 + 3. 根据 heuristic 规则判断换行符是否是段落分隔,并相应地进行替换。 + """ + # 对文本进行归一化处理 + normalized_text = normalize_text(raw_text) + + # 替换跨行的连词 + text = re.sub(r'(\w+-\n\w+)', lambda m: m.group(1).replace('-\n', ''), normalized_text) + + # 根据前后相邻字符的特点,找到原文本中的换行符 + newlines = re.compile(r'(\S)\n(\S)') + + # 根据 heuristic 规则,用空格或段落分隔符替换原换行符 + final_text = re.sub(newlines, lambda m: m.group(1) + is_paragraph_break(m) + m.group(2), text) + + return final_text.strip() def 解析PDF(file_manifest, project_folder, top_p, temperature, chatbot, history, systemPromptTxt): import time, glob, os, fitz diff --git a/toolbox.py b/toolbox.py index ef15803..7374002 100644 --- a/toolbox.py +++ b/toolbox.py @@ -280,59 +280,3 @@ def clear_line_break(txt): txt = txt.replace(' ', ' ') txt = txt.replace(' ', ' ') return txt - -import re -import unicodedata - -def is_paragraph_break(match): - """ - 根据给定的匹配结果来判断换行符是否表示段落分隔。 - 如果换行符前为句子结束标志(句号,感叹号,问号),且下一个字符为大写字母,则换行符更有可能表示段落分隔。 - 也可以根据之前的内容长度来判断段落是否已经足够长。 - """ - prev_char, next_char = match.groups() - - # 句子结束标志 - sentence_endings = ".!?" - - # 设定一个最小段落长度阈值 - min_paragraph_length = 140 - - if prev_char in sentence_endings and next_char.isupper() and len(match.string[:match.start(1)]) > min_paragraph_length: - return "\n\n" - else: - return " " - -def normalize_text(text): - """ - 通过把连字(ligatures)等文本特殊符号转换为其基本形式来对文本进行归一化处理。 - 例如,将连字 "fi" 转换为 "f" 和 "i"。 - """ - # 对文本进行归一化处理,分解连字 - normalized_text = unicodedata.normalize("NFKD", text) - - # 替换其他特殊字符 - cleaned_text = re.sub(r'[^\x00-\x7F]+', '', normalized_text) - - return cleaned_text - -def clean_text(raw_text): - """ - 对从 PDF 提取出的原始文本进行清洗和格式化处理。 - 1. 对原始文本进行归一化处理。 - 2. 替换跨行的连词,例如 “Espe-\ncially” 转换为 “Especially”。 - 3. 根据 heuristic 规则判断换行符是否是段落分隔,并相应地进行替换。 - """ - # 对文本进行归一化处理 - normalized_text = normalize_text(raw_text) - - # 替换跨行的连词 - text = re.sub(r'(\w+-\n\w+)', lambda m: m.group(1).replace('-\n', ''), normalized_text) - - # 根据前后相邻字符的特点,找到原文本中的换行符 - newlines = re.compile(r'(\S)\n(\S)') - - # 根据 heuristic 规则,用空格或段落分隔符替换原换行符 - final_text = re.sub(newlines, lambda m: m.group(1) + is_paragraph_break(m) + m.group(2), text) - - return final_text.strip() \ No newline at end of file