这正是我在当前公司工作的场景。我们需要提取标题下的文本。我个人使用基于规则的系统,即使用正则表达式在逐行阅读整个文档后识别所有编号的标题。一旦我有了标题,我就输入要查找相应段落的标题名称。此输入与预先存在的标题列表匹配,并使用通用句子编码器找到最接近的匹配项。之后,我仅显示从该标题到紧接着的下一个标题之间存在的所有内容。
regex = r"^\d+(?:\.\d+)* .*(?:\r?\n(?!\d+(?:\.\d+)* ).*)*"
print(re.findall(regex,samplestring, re.M))
PDF是非结构化文本,因此没有标签可以直接提取数据。所以我们使用正则表达式从文本语料库中找到所需信息。
使用以下代码提取原始页面文本。
import fitz
page = pdf_file.loadPage(0) # 0 represents the page number... upto n-1 pages...
dl = page.getDisplayList()
tp = dl.getTextPage()
tp_text=tp.extractText()
re.split('\n\d+.+[ \t][a-zA-Z].+\n',tp_text)
然后根据您的需要应用正则表达式...(这个正则表达式适合我,但您可能需要更改)
我将提供一个详细的示例来说明如何使用它:
re.findall('\n\d+.+[ \t][a-zA-Z].+\n',"some text\n1. heading 1\nparagraph 1\n1.2.3 Heading 2\nparapgraph 2")
输出: ['\n1. heading 1\n', '\n1.2.3 Heading 2\n']
您可以使用 re.split
按标题拆分文本并检索所需的标题文本。
re.split('\n\d+.+[ \t][a-zA-Z].+\n',"some text\n1. heading 1\nparagraph 1\n1.2.3 Heading 2\nparapgraph 2")
输出: ['some text', 'paragraph 1', 'parapgraph 2']
简单地说,第i个标题将有(i+1)个标题文本。