一种基于文本行的文档分段方法及装置与流程

文档序号:13004585阅读:226来源:国知局

本发明涉及文本处理领域,尤其是一种基于文本行的文档分段方法及装置。



背景技术:

随着技术发展,有越来越多的文本处理依赖于机器自动实现,而现有的文档格式中,存在着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之间的比例,并且在不同页面中会重复出现,样式也与正文内容通常有明显区别。

本发明并不局限于前述的具体实施方式。本发明扩展到任何在本说明书中披露的新特征或任何新的组合,以及披露的任一新的方法或过程的步骤或任何新的组合。

当前第1页1 2 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1