本发明涉及文本处理领域,尤其是一种基于文本行的文档分段方法及装置。
背景技术:
随着技术发展,有越来越多的文本处理依赖于机器自动实现,而现有的文档格式中,存在着pdf和类似pdf的html文档,这些文档中的文本按行构成,而不是直接合并为段落,只是通过视觉样式来保证人阅读时分段的效果。为了让计算机自动将这些文档中的文本行整合成为文本段落,便于后续以段落为单位对文本内容进行进一步处理,在这里提出一种可行的方案。
现有的pdf和html文本提取,很多是直接把取出的文本按行直接输出,没有分段;或者是根据发现额外的空行进行分段,但这种情况并不是非常普遍,而且对于文档中的表格输出很不友好。
技术实现要素:
本发明所要解决的技术问题是:针对现有技术存在的问题,提供一种基于文本行的文档分段方法及装置。通过对个文本行单元的合并分数判断是否合并为同一段,当文本行得分不满足合并时,结束当前段落合并,开始新的段落。该方法简单有效的解决现有技术存在的问题。
本发明采用的技术方案如下:
一种基于文本行的文档分段方法,其特征在于包括:
步骤1:对于由文本行构成的文档格式进行数据解析,提取出页面和文档数据结构,每一文本行对应的文档数据结构中提取该文本行信息;遍历全文的每个包含文本行的文档数据结构,根据这些文档数据结构的文本行信息构成的文本行信息列表,分别计算出全文上下文和页面上下文信息;
步骤2:依据每个页面中的n个文本行单元结构列表,结合全文上下文和页面上下文信息,对每个页面,按照分段算法将其中的文本行单元进行分段。
进一步的,所述步骤2具体包括:
步骤21:跳过无内容的文本行单元;
步骤22:为每个文本行单元设置一个初值为0的合并分数,流程结束时,若合并分数大于0,则应该将该文本行单元与其前一个文本行单元进行合并;
步骤23:设置一个段合并缓存merge_buffer,在确定整个段落合并结束之前,将已确定要合并的文本行单元暂存在这个缓存中,并且将文本行的字体格式存入集合中;
步骤24:检测到新的文本行的合并分数小于等于0时,结束当前段落合并,清除段合并缓存,开始新的段落分段。
进一步的,所述合并分数计算过程是:
步骤31:若当前行的字体格式存在于段合并缓存的字体格式集合之中,则段合并分数增加5;
步骤32:通过当前行距离页面顶端的距离curr_line.gap_top判断相邻两文本单元是否在同一行,若
-1≤curr_line.gap_top<min(gap_top_avg-gap_top_std,8)
则相邻两文本单元在同一行,curr_line.merge_score+=10,执行步骤32;否则,相邻两文本单元不在同一行,执行步骤33;
步骤33:检测文本间行距,若|curr_line.gap_top-prev_line.gap_top|>gap_top_std,则文本行单元行距过大,则说明两行很可能不属于同一段落,curr_line.merge_score-=10,执行步骤34以及步骤35;否则,curr_line.merge_score值不变;
步骤34:从merge_buffer中遍历上一行,找到最前端的文本行单元prev_line_start;判断两行的左缩进是否一致,若:
-5≤prev_line_start.gap_left-curr_line.gap_left<gap_left_avg-gap_left_std
则缩进一致,curr_line.merge_score+=1,否则curr_line.merge_score-=1;
步骤35:字数检查,依据是同一段落的文本中,下一行的字数不会明显多于前一行,即若curr_line.line_len-prev_line.line_len>2*len_std,则curr_line.merge_score-=5;否则curr_line.merge_score数值不变。
一种基于文本行的文档分段装置包括:
文本行信息获取模块:提取出页面和文档数据结构,从每一文本行对应的文档数据结构中提取该文本行信息;遍历全文的每个包含文本行的文档数据结构,根据这些文档数据结构的文本行信息构成的文本行信息列表,分别计算出全文上下文和页面上下文信息;
分段合并模块:依据文本行信息获取模块取得的每个页面中的n个文本行单元结构列表,结合上下文信息,对每个页面,按照分段算法将其中的文本行单元进行分段。
所述分段合并模块具体包括:
无内容单元处理模块:跳过无内容的文本行单元;
文本行单元合并模块:首先设置一个段合并缓存,在确定整个段落合并结束之前,将已确定要合并的文本行单元暂存在这个缓存中,并且将文本行的字体格式存入集合中。然后为每个文本行单元设置一个初值为0的段合并分数,流程结束时,若新文本行的合并分数大于0,则应该将该文本行单元与其前一个文本行单元进行合并,并将该文本行单元放入段合并缓存中;若检测到新的文本行的合并分数小于等于0时,结束当前段落合并,清除段合并缓存,开始新的段落分段。
进一步的,所述合并分数计算过程是:
字体格式判断模块:若curr_line.line_font存在于集合font_set之中,则curr_line.merge_score+=5;
同行文本行单元判断模块:通过curr_line.gap_top判断相邻两文本单元是否在同一行,若
-1≤curr_line.gap_top<min(gap_top_avg-gap_top_std,8),
则相邻两文本单元在同一行,curr_line.merge_score+=10,执行同行文本行单元合并模块;否则,相邻两文本单元不在同一行,执行同段落文本行单元判断模块;
同段落文本行单元判断模块:检测文本间行距,若|curr_line.gap_top-prev_line.gap_top|>gap_top_std,则文本行单元行距过大,则说明两行很可能不属于同一段落,curr_line.merge_score-=10,执行文本行单元缩进判断模块以及字体检查模块;否则,curr_line.merge_score值不变;
文本行单元缩进判断模块:从merge_buffer中遍历上一行,找到最前端的文本块prev_line_start;判断两文本单元的左缩进是否一致,若:
-5≤prev_line_start.gap_left-curr_line.gap_left<gap_left_avg-gap_left_std
则缩进一致,curr_line.merge_score+=1,否则curr_line.merge_score-=1;
字体检查模块:字数检查,依据是同一段落的文本中,下一行的字数不会明显多于前一行,即若curr_line.line_len-prev_line.line_len>2*len_std,则curr_line.merge_score-=5;否则curr_line.merge_score数值不变。
综上所述,由于采用了上述技术方案,本发明的有益效果是:
1.相比直接按照空行进行分段的方式,更加准确,适应性更好;
2.相比于手工分段的性能大大提高,而且正确性足够满足大部分实际需求。
3.除了一般的段落外,对列表、表格等文档结构也能较好支持。
4、本方案同时考虑了文本密度,外观样式,文本内容,以及上下文等信息,来对由文本行组成的文档进行分段处理,分段的正确性可达80%以上。
附图说明:
图1是本发明流程图。
具体实施方式
本说明书中公开的所有特征,或公开的所有方法或过程中的步骤,除了互相排斥的特征和/或步骤以外,均可以以任何方式组合。
本说明书中公开的任一特征,除非特别叙述,均可被其他等效或具有类似目的的替代特征加以替换。即,除非特别叙述,每个特征只是一系列等效或类似特征中的一个例子而已。
本发明相关解释:
1、无内容指的是空格、回车等无内容的文本行单元;
2、curr_line.gap_top指的是当前文本行单元与相邻文本行单元之间的行距;
3、prev_line.gap_top指的是前一文本行单元与相邻文本行单元之间的行距;
4、prev_line_start指的是最前端的文本行单元;
5、prev_line_start.gap_left指的是前一文本行单元与相邻文本行之间的缩进差;
6、curr_line.gap_left指的是当前文本行单元与相邻文本行之间的缩进差。
7、curr_line.line_len指的是当前文本行单元字数;
8、prev_line.line_len指的是前一文本行单元字数;
9、curr_line.line_font指的是当前文本行单元的字体格式;
10、curr_line.merge_score指的是当前文本行单元的合并分数。
本发明实现过程:
1.读取pdf文档,用pdf转html的工具进行处理;将html文档进行解析,提取出页面和文档数据结构,每一文本行对应的文档数据结构中提取该文本行信息;一般根据p或者span标签的属性值来获取,比如top对应line_off_top,left对应line_off_left,字体样式则使用该标签的class属性;每一文本行对应的文档数据结构中可以提取文本行信息,文本行信息包括:
a)字数line_len;
b)距离页面左侧的偏移值line_off_left;
c)距离页面上端的偏移值line_off_top;
d)与前一行上端的行距gap_top,即当前行与上一行的line_off_top相减;
e)与前一行左端的缩进距离gap_left,即当前行与上一行的line_off_left相减;
f)字体格式line_font;
2.遍历全文的每个包含文本行单元的文本行数据结构,根据文档数据结构的文本行信息构成的文本行单元结构列表,分别统计出全文、每个页面的上下文信息,包括:
a)全文上下文,遍历全文的文本行单元,显见可算出:
i.距离页面左侧的偏移值
a.平均值off_left_avg
b.标准差off_left_std
ii.距离页面上端的偏移值
a.平均值off_top_avg
b.标准差off_top_std
iii.文本行的字数
a.平均值len_avg
b.标准差len_std
iv.相邻两行间的字数差
a.平均值len_diff_avg
b.标准差len_diff_std
v.相邻文本行之间的行距,即gap_top的统计值
a.平均值gap_top_avg
b.标准差gap_top_std
vi.相邻文本行之间的缩进差,即gap_left的统计值
a.平均值gap_left_avg
b.标准差gap_left_std
b)页面上下文:
i.页面宽度page_width
ii.页面高度page_height
iii.页面中的文本行单元结构构成的列表page_line_list
3.对每个页面,依据页面中的文本行单元结构列表,和页面上下文信息,按如下算法执行分段:
a)跳过无内容的文本行单元,相当于直接让两个有内容的文本行之间的行距扩大,从而提高合并准确性;
b)为每个文本行单元设置一个初值为0的段合并分数merge_score,流程结束时,若merge_score大于0,则应该将该文本行单元与其前一个文本行进行合并;
c)设置一个段合并缓存merge_buffer,在确定整个段落合并结束之前,将已确定要合并的文本行单元暂存在这个缓存中,并且将文本行的字体格式存入集合font_set中;
d)检测到新的文本行merge_score小于等于0时,结束当前段落合并,清除段合并缓存,开始新的段落。
e)得分的具体算法结合上下文信息,和段合并缓存中的文本行单元信息来执行,设当前文本行单元为curr_line,前一文本行单元为prev_line,合并分数计算过程为:
步骤e1):通过curr_line.gap_top判断相邻两文本单元是否在同一行,若-1≤curr_line.gap_top<min(gap_top_avg-gap-top-std,8),则curr_line.merge_score+=10,加上这个判断是由于诸如表格之类的样式中,视觉上的同一行实际可能由多个短行的文本单元构成,执行步骤e2;否则,相邻两文本单元不在同一行,执行步骤e3;
步骤e2):若curr_line.line_font在font_set之中,curr_line.merge_score+=5,这项表明新行文本的格式与之前行一致,没有发生样式切换,显见有更大概率属于同格式文本;
步骤e3):若相邻文本单元不在同一行,检测文本间行距,若行距过大则说明两行很可能不属于同一段落,若
|curr_line.gap_top-prev_line.gap_top|>gap_top_std,则curr_line.merge_score-=10,执行步骤e4及步骤e5;
步骤e4):从merge_buffer中遍历上一行,找到最前端的文本块prev_line_start;判断两行的左缩进是否一致,若:
-5≤prev_line_start.gap_left-curr_line.gap_left<gap_left_avg-gap_left_std
则缩进一致,curr_line.merge_score+=1,否则curr_line.merge_score-=1;
步骤e5)字数检查,依据是同一段落的文本中,下一行的字数不会明显多于前一行,即若curr_line.line_len-prev_line.line_len>2*len_std,则curr_line.merge_score-=5;否则,curr_line.merge_score数值不变。
其中分段前,可以先清理掉一些与正文无关的内容,比如页眉页脚等;清理方法主要采用根据页眉页脚的内容出现在页面的最顶或最底端15%以内的空间,即检测page_height与line_top之间的比例,并且在不同页面中会重复出现,样式也与正文内容通常有明显区别。
本发明并不局限于前述的具体实施方式。本发明扩展到任何在本说明书中披露的新特征或任何新的组合,以及披露的任一新的方法或过程的步骤或任何新的组合。