本發(fā)明屬于版式識別技術(shù)領(lǐng)域,具體地說,本發(fā)明涉及一種將版式文檔轉(zhuǎn)化為流式文檔的技術(shù)。
背景技術(shù):
傳統(tǒng)的出版書籍、各種報刊、雜志等閱讀媒介都主要由版式文檔組成。版式文檔的特點是版面固定、不跑版,即所見即所得。在使用過程中,版式文檔呈現(xiàn)效果不因軟硬件環(huán)境、操作者的變化而變化,在版式、版面、字體、字號等方面與紙質(zhì)文檔保持完全一致。
另一方面,當前移動互聯(lián)網(wǎng)處于高速發(fā)展時期,手機已經(jīng)極大的普及了。人們正越來越多的從紙質(zhì)閱讀轉(zhuǎn)移到手機電子閱讀。而傳統(tǒng)的閱讀媒介都主要由版式文檔組成,已經(jīng)不能滿足不同尺寸的移動設(shè)備對流式閱讀體驗的需求。所以版式文檔轉(zhuǎn)化為流式文檔,能夠?qū)鹘y(tǒng)的版式閱讀體驗轉(zhuǎn)移到最新的移動閱讀體驗上來。
要將版式文檔轉(zhuǎn)化為流式文檔,首先需要將版式文檔的段落識別出來,即識別出那些字句構(gòu)成自然段、自然段之間如何排序等。然而,版式文檔的版面設(shè)計各不相同,這給計算機的自動識別造成了諸多困難。例如:版式文檔的版面中時常插入大小不一的圖片,這對文字的連貫性會造成干擾,且版面中的文字有時橫排有時豎排,并且,由于版面設(shè)計的原因,有的上、下文之間時常跳過一大塊區(qū)域。上述這些版式文檔的特性都給計算機自動識別版面中的段落造成了困難。
因此,當前迫切需求一種識別版式文檔段落的解決方案。
技術(shù)實現(xiàn)要素:
本發(fā)明的目的是提供一種識別版式文檔段落的解決方案。
本發(fā)明提供了一種版式文檔段落識別方法,包括下列步驟:
1)對版式文檔的頁面進行文字行識別;
2)用掃描線掃描所述頁面,根據(jù)掃描線是否與文字行相交識別出頁面中的各個空白分隔區(qū),并用所述空白分隔區(qū)將所述頁面切割成多個文字塊;
3)分別將各個文字塊切分成段。
其中,所述步驟2)中,所述用掃描線掃描所述頁面包括用豎直掃描線橫向掃描所述頁面以及用水平掃描線縱向掃描所述頁面,所述空白分隔區(qū)包括豎直空白分隔區(qū)和水平空白分隔區(qū)。
其中,所述步驟2)中,用所述空白分隔區(qū)將所述頁面切割成多個文字塊的方法如下:利用各個所述空白分隔區(qū)多次切割所述頁面,其中優(yōu)先使用分隔距離寬的所述空白分隔區(qū)進行切割。
其中,所述步驟2)包括下列子步驟:
21)用豎直掃描線對當前頁面進行橫向掃描,獲得橫向掃描過程中連續(xù)出現(xiàn)有效掃描線的區(qū)域,并將這些區(qū)域認定為豎直空白分隔區(qū),所述有效掃描線是與任何文字行都不相交的掃描線;找出具有最大橫向長度MaxHLine的最大豎直空白分隔區(qū);
22)用水平掃描線對所述當前頁面進行縱向掃描,獲得縱向掃描過程中連續(xù)出現(xiàn)有效掃描線的區(qū)域,并將這些區(qū)域認定為水平空白分隔區(qū);找出具有最大縱向長度MaxVLine的最大豎直空白分隔區(qū);
23)比較豎直空白分隔區(qū)的最大橫向長度MaxHLine和水平空白分隔區(qū)的最大縱向長度MaxVLine的大?。?/p>
如果MaxHLine>MaxVLine且MaxHLine>0,則用對應(yīng)于最大橫向長度MaxHLine的豎直空白分隔區(qū)對當前頁面做縱向切割,得到兩個子頁面;
如果MaxHLine<MaxVLine且MaxVLine>0,則用對應(yīng)于最大縱向長度MaxVLine的水平空白分隔區(qū)對當前頁面做橫向切割,得到兩個子頁面;
如果MaxHLine=0且MaxVLine=0,則表明當前頁面不能再做切割,此時對當前頁面的處理結(jié)束;
步驟24)對步驟23)切割得到的子頁面進行排序,然后依次將各子頁面作為新的當前頁面,返回步驟21)進行處理;這樣不斷重復(fù)遞歸,直到所有的子頁面都不能再切割為止,此時就直接得到了排序后的文字塊。
其中,所述步驟24)中,在每次切割時,根據(jù)切割得到的兩個子頁面的左右位置或上下位置對這兩個子頁面進行排序。
其中,所述步驟24)中,根據(jù)每次切割時得到的兩個子頁面的排序,得到整個所述頁面的所有文字塊的排序。
其中,所述步驟1)包括:提取版式文檔頁面中的所有文字及該文字的位置信息,根據(jù)各個文字的位置信息,基于行識別算法將各個文字合并,得到相應(yīng)的文字行。
其中,所述步驟1)中,行識別算法包括下列子步驟:
步驟11)對于當前待識別頁面的對象集合,根據(jù)其中各個文字的位置,計算文字之間的距離,找出距離最接近的兩個文字;其中,對象集合中的對象包括文字和文字行;
步驟12)將所找出的兩個文字合并成為文字行LA,將已合并的文字從當前待識別頁面的對象集合中刪去,并在該對象集合中加入文字行LA,然后根據(jù)兩個文字的位置關(guān)系,得到該文字行LA的方向信息,并進一步生成該文字行LA的基礎(chǔ)對象數(shù)據(jù),所述基礎(chǔ)對象數(shù)據(jù)包括文字行的字號和輪廓;
步驟13)在當前待識別頁面的對象集合中遍歷所有文字,找到與文字行LA位置最接近的一個文字WB;
步驟14)根據(jù)字號、文字方向和輪廓,判別文字行LA與文字WB合并是否合理,如果不合理,返回步驟11);否則,將文字行LA與文字WB合并成新行LC,然后繼續(xù)執(zhí)行步驟15);
步驟15)用新行LC作為新的當前文字行LA,返回步驟13)開始下一輪的處理;
上述步驟11)~15)不斷循環(huán),直至待識別頁面的對象集合中的所有文字均合并成文字行。
其中,所述步驟14)包括下列子步驟:
步驟141)比較文字行LA中的文字和查找到的文字WB的字號,如果字號差別超過預(yù)設(shè)的閾值,返回步驟11);否則,繼續(xù)執(zhí)行步驟142);
步驟142)將文字行LA和查找到的文字WB合并成為新行LC,比較新行LC和原文字行LA是否具有相同的方向,如果新行LC中具有方向不同的文字,或者新行LC的方向和原文字行LA的方向不相同,釋放新行LC,同時返回步驟11);否則,繼續(xù)執(zhí)行步驟143);
步驟143)基于輪廓判斷新行LC是否和別的對象發(fā)生交疊,如果發(fā)生交疊,則新行LC的合并無效,釋放新行LC,同時返回步驟11);如果不發(fā)生交疊,則進入步驟15)。
其中,所述步驟3)包括:對于每個文字塊,根據(jù)行間距、行的起始或結(jié)束處是否存在文字縮進來識別各個段落;將各個有序文字塊內(nèi)部的段落按照順序合并在一起,生成一個有序的段落序列;將每組相鄰的有序文字塊之間的相鄰的兩個段落進行檢測,在這兩個段落具有相同的字體且這兩個段落均不是完整的段落時,將這兩個相鄰的段落合并。
與現(xiàn)有技術(shù)相比,本發(fā)明具有下列技術(shù)效果:
1、本發(fā)明能夠準確地識別出版式文檔中的自然段。
2、本發(fā)明能夠給出自然段之間的排序。
附圖說明
圖1示出了本發(fā)明一個實施例的段落識別方法的總體流程;
圖2示出了本發(fā)明一個實施例中識別文本行的流程;
圖3示出了本發(fā)明一個實施例中一頁pdf文檔示例的文本行識別結(jié)果示意圖;
圖4示出了本發(fā)明一個實施例的塊識別過程中豎直掃描線橫向掃描的示意圖;
圖5示出了本發(fā)明一個實施例的塊識別過程中水平掃描線縱向掃描的示意圖;
圖6示出了本發(fā)明一個實施例中塊識別結(jié)果的示意圖;
圖7示出了本發(fā)明一個實施例中基于所識別的塊的段識別流程圖。
具體實施方式
根據(jù)本發(fā)明的一個實施例,提供了一種用于將版式文檔轉(zhuǎn)化為流式排版的段落識別方法,圖1示出了該段落識別方法的總體流程,參考圖1,該段落識別方法包括下列步驟:
步驟1:讀取文檔元數(shù)據(jù),進行行識別。文檔元數(shù)據(jù)包括組成版式文檔的文字和圖片等基本元素。版式文檔處理的基礎(chǔ)就是對基礎(chǔ)的元數(shù)據(jù)的處理,從版式文檔識別出單個文字和單個圖片的方法是已有技術(shù),此處不再贅述。
版式文檔和流式文檔一個主要的區(qū)別是沒有所謂的順序信息,也就是所有的文字信息只包括純粹的位置信息(這個位置信息可以是文字所對應(yīng)的坐標位置),文字在版式文檔中的順序只能作為參考,而不能作為嚴密的順序信息使用。所以,現(xiàn)有的版式文檔識別方案通常只能獲取無順序的零散文字,要進行段落識別,首選需要將文檔元數(shù)據(jù)(尤其是文字)進行排序。本實施例中,基于根據(jù)每個文字的位置,通過行識別的方式將零散的文字組織起來并在行范圍內(nèi)實現(xiàn)了文字的排序。
圖2示出了本發(fā)明一個實施例中的行識別流程,包括下列步驟:
步驟11:對于當前待識別頁面的對象集合,根據(jù)其中各個文字的位置,計算文字之間的距離,找出距離最接近的兩個文字。本文中,對象包括文字和文字行。
步驟12:將所找出的兩個文字合并成為文字行LA,然后根據(jù)兩個文字的位置關(guān)系,得到該文字行LA的方向信息,例如是橫向文字行還是縱向文字行。同時還可以進一步生成該文字行LA的字號(表示文字大小)、輪廓等基礎(chǔ)對象數(shù)據(jù)。本實施例中,文字行的輪廓是涵蓋該文字行所有文字的最小矩形框。
本步驟中,還將已合并的文字從當前待識別頁面的對象集合中刪去,并在該對象集合中加入文字行LA。在一個實施例中,當前待識別頁面的對象集合可以用對象間距離矩陣的方式存儲和表征,其中,對象間距離矩陣的每一行分別代表一個對象,每一列也分別代表一個對象,對象間距離矩陣的元素為對象與對象之間的距離,即該元素為相應(yīng)行所代表對象與相應(yīng)列所代表對象之間的距離。
步驟13:在當前待識別頁面的對象集合中遍歷所有文字,找到與文字行LA最接近的一個文字WB,將該文字WB作為后續(xù)處理的輸入對象。
步驟14:比較文字行LA中的文字與和查找到的文字WB的字號,如果字號差別超過預(yù)設(shè)的閾值(例如25%),則返回步驟11;否則繼續(xù)執(zhí)行步驟15。
本步驟中,如果字號差別超過預(yù)設(shè)的閾值,則說明文字WB不適合并入文字行LA中,返回步驟11,以便在當前的待識別頁面的對象集合中,重新尋找最接近的兩個文字合并成新的文字行。需注意,此時的待識別頁面的對象集合中已刪去了已經(jīng)被合并的文字,新的文字行將由剩余的文字合并而成。
步驟15:將文字行LA和查找到的文字WB合并成為新行LC,比較新行LC和原文字行LA是否具有相同的方向,如果新行LC中具有方向不同的文字,或者新行LC的方向和原文字行LA的方向不相同,釋放新行LC,同時返回步驟11;否則,繼續(xù)執(zhí)行步驟16。本步驟中,如果新行LC中具有方向不同的文字,或者新行LC的方向和原文字行LA的方向不相同,則說明新行LC和原文字行LA具有不同的屬性,所以新行LC的合并是無效的,因此釋放新行LC,同時返回步驟11,以便在當前的待識別頁面的對象集合中,重新尋找最接近的兩個文字合并成新的文字行;
步驟16:判斷新行LC是否和別的對象發(fā)生交疊(交疊也可以稱為相交,它是指新行LC的輪廓與其他對象的輪廓存在部分面積或全部面積的重疊),如果發(fā)生交疊,則認為新行LC不是完全獨立的,新行LC的合并無效,釋放新行LC,同時返回步驟11,以便在當前的待識別頁面的對象集合中,重新尋找最接近的兩個文字合并成新的文字行;如果不發(fā)生交疊,則認為新行LC獨立,進入步驟17。
步驟17:新行LC此時已通過各種檢驗,可認定新行LC的合并是合理的合并,令LA=LC(即將新行LC作為新的當前文字行LA),返回步驟13,開始下一輪的處理。本步驟中,當前待識別頁面的對象集合中的文字行LA也一并被新行LC的內(nèi)容替換。但需注意的是,在其他實施例中,也可以不在本步驟中對待識別頁面的對象集合中的LA進行更新,而是等到當前文字行完全識別完畢,即在步驟14、15或16的判別后需要返回步驟11的情形下,用新行LC的內(nèi)容替換待識別頁面的對象集合中的文字行LA的原內(nèi)容。
可以看出,每一輪處理時,如果返回11,就可以完成一個完整行的生成,當整個集合中所有的文字都合并成文字行以后,循環(huán)結(jié)束,得到的結(jié)果就是行識別的最后結(jié)果。當完成行識別以后,效果如圖3所示,頁面會變成由行和圖片組成。
需說明的是,上述行識別的方式并不是唯一的,在其他實施例中,也可以使用其他的行識別算法,只要能夠?qū)陌媸轿臋n頁面中提取的零散文字及其位置信息識別成文字行即可。
步驟2:對當前頁面進行塊識別。當完成行識別以后,進一步將頁面的結(jié)構(gòu)劃分為多個文字塊,并識別頁面中各個文字塊的順序。
在完成行識別后,對當前頁面進行塊識別的方法具體包括下列子步驟:
步驟21:用豎直掃描線對頁面進行橫向掃描,在掃描過程中,如果豎直掃描線不與頁面中的任何文字行相交,則判定此時豎直掃描線所處的行是豎直有效行。圖4示出了豎直掃描線橫向掃描的示意圖,其中箭頭表示掃描方向,虛線表示豎直掃描線。
步驟22:獲得橫向掃描過程中連續(xù)出現(xiàn)豎直有效行的區(qū)域,這些區(qū)域是豎直空白區(qū),在頁面中這種豎直空白區(qū)通常會被作為文字塊之間的分隔區(qū),所以也可稱為豎直空白分隔區(qū)。在圖4中,區(qū)域a示出了一個豎直空白分隔區(qū)。本步驟中,統(tǒng)計本次掃描過程中每個豎直分隔區(qū)的橫向長度,求出其中最大橫向長度MaxHLine,它表示的是左右相鄰的塊與塊之間的分隔距離。
步驟23:用水平掃描線對頁面進行縱向掃描,在掃描過程中,如果水平掃描線不與頁面中的任何文字行相交,則判定此時水平掃描線所處的行是水平有效行。圖5示出了水平掃描線縱向掃描的示意圖,其中箭頭表示掃描方向,虛線表示水平掃描線。
步驟24:獲得各個縱向掃描過程中連續(xù)出現(xiàn)水平有效行的區(qū)域,這些區(qū)域是水平空白區(qū),在頁面中這種水平空白區(qū)通常會被作為文字塊之間的分隔區(qū),所以也可稱為水平空白分隔區(qū)。在圖5中,區(qū)域b示出了一個水平空白分隔區(qū)。本步驟中,統(tǒng)計本次掃描過程中每個水平分隔區(qū)的縱向長度,求出其中最大縱向長度MaxVLine,它表示的是上下相鄰的塊與塊之間的分隔距離。
在本實施例中,掃描線是長度能夠貫穿整個頁面的線條。掃描過程中,掃描線可以逐個像素地移動。但這個移動方式不是唯一的,例如,在其他實施例中,也可以設(shè)定其它的移動步長,該移動步長使得不同空白分隔區(qū)的不同分隔距離能夠被區(qū)分出來。
步驟25:比較豎直空白區(qū)的最大橫向長度MaxHLine和水平空白區(qū)的最大縱向長度MaxVLine的大?。?/p>
如果MaxHLine>MaxVLine且MaxHLine>0,則用對應(yīng)于最大橫向長度MaxHLine的豎直有效行(或者豎直空白區(qū))對當前頁面做縱向切割,得到兩個子頁面;
如果MaxHLine<MaxVLine且MaxVLine>0,則用對應(yīng)于最大縱向長度MaxVLine的水平有效行(或者水平空白區(qū))對當前頁面做橫向切割,得到兩個子頁面;
如果MaxHLine=0且MaxVLine=0,則表明當前頁面不能再做切割,此時對當前頁面的處理結(jié)束。
步驟26:對步驟25切割得到的子頁面進行排序,然后依次將各子頁面作為新的當前頁面,返回步驟21進行處理。這樣不斷重復(fù)遞歸,直到所有的子頁面都不能再切割為止。此時,整個頁面的文字塊識別完畢,圖6示出了本發(fā)明一個實施例中塊識別結(jié)果的示意圖。
另外,本步驟中,各個子頁面的排序規(guī)則為上面的子頁面的排序優(yōu)先于下面的子頁面,左面的子頁面的排序優(yōu)先于右面的子頁面。
執(zhí)行上述步驟26后,最后所得的每個子頁面代表一個文字塊或者圖片等其它基本元素。根據(jù)基本元素信息,可以很方便地提取出其中的文字塊。并且,由于各個子頁面已經(jīng)排序,因此可直接得到排序后的文字塊。
步驟3:基于步驟2所得到的排序文字塊進行段識別。段主要是將文字塊識別成一個又一個的段落,如圖6所示。每一個文字塊都是段識別的輸入項,輸出項則為塊內(nèi)切割出的一個又一個段落。
圖7示出了一個實施例中的段識別的方法的流程,包括下列子步驟:
步驟31:首先新建一個段落PB,段落PB是行的容器,即段落PB由行組成,初始時,段落PB為空。
步驟32:從當前文字塊中取出一個行LA。
步驟33:判斷PB是否為空,如果是,執(zhí)行步驟34,如果否,執(zhí)行步驟35。
步驟34:直接將LA加入到PB,然后跳轉(zhuǎn)到步驟37。
步驟35:根據(jù)LA距離PB的最短距離是否大于PB中的行間距,確定是否將行LA加入段落PB。PB中的行之間會有一個間距,即行間距,如果LA距離PB的最短距離大于PB的行間距,說明LA不適合加入PB,此時認為當前段落PB的識別已結(jié)束,返回步驟31,以便識別下一個段落;否則,繼續(xù)執(zhí)行步驟36。
步驟36:段落PB中所有的行所組成的段落會有一個位置關(guān)系,如果新加入的行的左側(cè)(或者上側(cè))相對于段落最后一行的左側(cè)(或者上側(cè))縮進至少2em(1em=一個文字寬度),則說明LA相對PB是新段落的開始,LA不加入PB,且認為當前段落PB的識別已結(jié)束,返回轉(zhuǎn)步驟31,以便識別下一個段落;否則,繼續(xù)執(zhí)行步驟37。
步驟37:將LA加入PB,返回步驟32,以便重新取一行進行處理。
當所有的行都處理完畢以后,生成的段落就是最后所需要的段落,這些段落的順序就是它們在文字塊中的順序。
步驟4:連續(xù)段落處理,通過步驟2以后,可以識別并生成一個有序的文字塊序列,通過步驟3,可以將每一個文字塊拆分成段落,并且段落之間也是有序的,所以連續(xù)段落處理就是處理塊與塊之間的段落關(guān)系,其過程如下:
步驟41:首先將有序塊內(nèi)部的段落按照順序合并在一起,生成一個有序的段落序列,這樣整個頁面的段落都是有序的了。
步驟42:在有序的段落序列中,將相鄰的有序文字塊之間的相鄰有序段落拿出來進行檢測,如果兩個段落可以合并,則進行合并。判斷合并的條件為:當兩個段落具有相同的字體,且兩個段落均不是完整的段落時,將這兩個相鄰段落合并。將相鄰有序文字塊對應(yīng)的連續(xù)段落合并以后,整個有序段落序列就是最后的結(jié)果。
在一個優(yōu)選實施例中,步驟42包括下列子步驟:
步驟421:對于相鄰的文字塊,取前一文字塊的最后一個段落A和后一文字塊的第一個段落B。
步驟422:比較段落A和段落B的字體,判斷兩個段落字體是否相同,如果否,則段落A和段落B肯定不是連續(xù)段落,段落A和段落B不做合并處理,如果是,則繼續(xù)執(zhí)行步驟423。
步驟423:判斷段落A是否為head段落,head段落的定義是當前段落是一個完整段落的上部分,但不是一個完整的段落。如果段落A不是head段落,則不對段落A和段落B進行合并,如果段落A是head段落,則繼續(xù)執(zhí)行步驟424。在具體實現(xiàn)上,可以判斷段落A的最后一行的右側(cè)相對于該段落其他行的右側(cè)是否存在文字縮進,如果存在,則認為段落A不是head段落,如果不存在,則認為段落A是head段落。
步驟424:判斷段落B是否為tail段落,tail段落的定義為當前段落是一個完整段落的下半部分,但不是一個完整的段落。如果段落B不是tail段落,則不對段落A和段落B進行合并,如果段落B是tail段落,則繼續(xù)執(zhí)行步驟425。在具體實現(xiàn)上,可以判斷段落B的第一行的左側(cè)相對于該段落其他行的左側(cè)是否存在文字縮進,如果存在,則認為段落B不是tail段落,如果不存在,則認為段落B是tail段落。
步驟425:將段落A和段落B標記為連續(xù)的段落,使得在將有序文本單元導(dǎo)成流式文件的時候,段落A和段落B自動合并成為一個段落。
最后應(yīng)說明的是,以上實施例僅用以描述本發(fā)明的技術(shù)方案而不是對本技術(shù)方法進行限制,本發(fā)明在應(yīng)用上可以延伸為其它的修改、變化、應(yīng)用和實施例,并且因此認為所有這樣的修改、變化、應(yīng)用、實施例都在本發(fā)明的精神和教導(dǎo)范圍內(nèi)。