王新新
摘? 要:實際應用中常有從非結構化文本中提取符合指定模式信息的需求。在分析了使用正則表達式處理這類問題的缺陷之后,提出了一種面向模式的文本數據描述模型,將模式分為終端模式、結構體模式、聯合體模式和數組模式,并詳細介紹了各模式在文本匹配以及數據映射中的作用,最后通過相應的示例演示了模型的結構性與便利性。
關鍵詞:面向模式;非結構化文本;模式識別;信息提取
中圖分類號:TP391.1 文獻標志碼:A? ? ? ? ?文章編號:2095-2945(2020)10-0028-03
Abstract: In practical applications, there is often a need to extract information from unstructured text that conforms to a specified pattern. After analyzing the defects of using regular expressions to deal with such problems, a pattern-oriented text data description model is proposed, which is divided into terminal patterns, structural patterns, union patterns and array patterns, and the role of each kind of pattern in text matching and data mapping is introduced in detail. Finally, the structure and convenience of the model are demonstrated by the corresponding examples.
Keywords: pattern-oriented; unstructured text; pattern recognition; information extraction
引言
文字是人類用于交流的重要工具,計算機的發展使得文字能以文本形式存放于各類存儲介質中。截止2014年8月,全世界已經有接近20億臺個人電腦,這些電腦中存儲著各式各樣的文本數據,對其中一些公開文本進行信息提取成為頗具價值的技術。文本按照結構化程度可分為結構化文本、半結構化文本和非結構化文本三類。結構化文本指邏輯上以表或者其他嚴格統一形式存儲的文本,如csv文件、dsv文件等,這類文本由于具有很強的格式性,其中的文本含義很容易通過事先的定義得出,例如csv中可以添加表頭來給每列數據設置列名,這類文本一般很容易處理;半結構化文本是結構與內容混合在一起的文本結構,兼具格式性和可擴展性[1],常見的半結構化文本有HTML文檔、JSON文檔等;非結構化文本是完全沒有結構或只含有語義結構的一類文本[2],這類文本擴展性很強,但難以通過統一的規則處理,因此常利用機器學習方法來提取文檔中的信息。對于海量非結構化文本數據,一般使用文本挖掘技術來提取其中的信息。文本挖掘技術最初被用于文本文檔的分類,但不久后它就發展為一種提取文本信息的技術。此后對文本信息提取的實際需求不斷驅使著文本挖掘的發展。人工智能則是文本信息提取的支撐,自然語言處理(NLP-Natural Language Processing)就是人工智能領域的一個研究人與計算機之間使用自然語言溝通的各種理論與方法的分支,一些文本挖掘技術所采用的基礎理論就來源于NLP領域。廣義的文本挖掘可定義為從文本中獲取有價值信息和知識的一種手段,除使用數據挖掘方法進行文本挖掘外,還可使用模式識別方法從文本中獲取符合一定模式的文本信息。雖然兩者的主要目的都是從文本中提取有用的信息,但是數據挖掘手段關注文本內容本身,例如提取文檔特征、抽取文檔關鍵字和文本語義理解;而文本模式識別則將模式作為關注點,即重點在需要的信息上。對文本進行模式識別信息提取的過程一般分為兩步:首先通過模式描述所需信息結構,然后從文本中提取符合模式的文本片段。正則搜索就是文本模式識別的一種成熟應用,用戶使用正則表達式(Regular Expression)定義需要的文本信息的模式,然后利用正則搜索引擎從待識別文本中搜索出若干滿足表達式模式的文本片段。部分情況下,用戶使用正則表達式搜索出的符合目標模式的文本不需要具有特定結構,即搜索結果僅表現為文本串;但是在某些需求下,搜索出的目標文本片段需要被切分成更小的文本片段,這些片段每部分都有特定的意義,這時便會用到正則表達式中捕獲組的概念。捕獲組是正則表達式中顯式標記的子表達式,分為普通捕獲組和命名捕獲組。普通捕獲組的匹配結果將按照捕獲組編號規則依次存儲在一個結果列表中,而命名捕獲組的匹配結果則存儲在一個組名稱到結果映射的字典中。
在實際應用中存在這樣一種需求,從指定非結構化文本中抽取需要的數據。這種非結構化文本中包含所需信息的文本片段具有某種句式結構,即模式。一種實現這種需求的簡單方法為正則搜索,模式可以通過正則表達式來表示,所需的子數據模式則可標記為捕獲組[3]。直接編寫正則表達式可以處理目標文本片段模式不復雜的情況,但如果目標文本片段的模式復雜,那么對應的正則表達式就會非常復雜,而且還需要標記各部分子數據的捕獲組,并在匹配完成后將各捕獲組的數據存放到內存中相應含義的變量上。概括來講,直接使用正則表達式來處理這類問題較復雜,并且用于匹配相應數據的正則表達式不易于維護。因此,本文提出了一種面向模式的文本描述模型,將模式抽象為終端模式、結構體模式、聯合體模式和數組模式四類,并將模式映射到程序語言中定義的數據類型,模式在匹配到文本片段后,可自動在內存中生成相應類型的數據。
1 模型定義
面向模式的文本數據描述模型包含四個關鍵的概念:終端模式、結構體模式、聯合體模式和數組模式(簡稱終端、結構體、聯合體和數組),這與各類面向過程以及面向對象的編程語言對數據的表示形式相似,其中終端類似于編程語言中的基礎數據類型,例如整數、浮點數和字符串等。各類模式之間可以進行“|”運算(即或運算),表示多個模式任選其一,或運算的結果為聯合體。
1.1 終端模式
在面向模式的文本數據描述模型中,終端(Terminal)被定義為表示最小數據單元的模式,最小數據單元包括數字字符串、日期字符串和關鍵詞等,具體的最小數據單元可按特定問題的需求進行擴充。對于一個日期型最小數據單元,它對應的終端可以為:一個1000到3000的整數(年)+連接號(-)+一個1到12的整數(月)+連接號(-)+一個1到31的整數(日)或(|)一個1到12的整數(月)+連接號(-)+一個1到31的整數(日)+連接號(-)+一個1000到3000的整數(年)或...。該終端可以匹配的日期格式有兩類:“年-月-日”(如2020-1-1),以及“月-日-年”(如01-01-2020)。與正則表達式不同的是,該模式不僅表達了文本的字符序列信息,還包含文本所表示的更高一級數據信息——整數。
1.2 結構體模式
結構體(Structure)是文本數據到內存數據的映射,映射定義過程在映射函數Construct中進行,映射函數以(終端,字段名)或(結構體,字段名)或(數組,字段名)元組集合作為輸入,將模式與程序中定義的數據結構對應的字段進行綁定,需要注意的是,一個結構體可以表示多種映射,即Construct函數可以被多次調用;而實際的數據映射過程則在構建函數Build里進行,對于某一個成功的匹配,Build函數會返回一個結構體綁定類型的實例。對于面向對象的程序設計語言來說,這種數據結構可以是類,字段則是類的字段。例如現有一個類Product,它包含整數型ID和日期型ProductionDate兩個字段,對應的結構體記為Structure
1.3 聯合體模式
聯合體(Union)用于表示可匹配多種模式中的任意一種,多種模式稱為聯合體的備選模式,備選模式可以是終端、結構體、聯合體和數組,備選模式進行“|”運算(即或運算符)得到聯合體。聯合體僅表示對多種模式的選擇,沒有具體的映射作用。
1.4 數組模式
在所需的目標數據的模式中,可能存在某個終端或某個結構體循環出現的情況。所以設計了數組(Array)這種模式用于描述此類循環結構,循環結構的基本單元稱為數組的元模式。許多程序設計語言中都有數組這個概念,數組即相同類型數據的序列,因此數組應有預定義的類型來限定其中數據的類型,本文所提出的數組模式也有相應的類型限定,可表示為Array。數組分為可空數組和不可空數組,可空數組如其名稱所示,其中的元素模式可以不匹配任何文本,類似于正則表達式中的“*”限定符;不可空數組則表示必須至少有一個元素模式匹配到文本,和正則表達式中的“+”類似。與上文所述的結構體相同,Array也有映射和構建兩個過程,其映射函數叫Item,以終端或結構體作為輸入參數,當多次調用Item函數進行映射時,表示數組的元模式可以是這些參數模式中的任意一種,即“或”的關系;Build函數在構建時首先會根據元模式匹配到的數據數量創建一個對應長度的數組,然后將這些數據按匹配順序賦值到相應索引的數組單元中。
2 模型應用示例
為了具體地闡述模型的使用方法,本節將通過數據提取示例來演示模型定義過程。假設有一段文本:“......。產品信息:A的價格為100元,于2020年1月1日出廠,銷往北京、上海和天津;B的價格是200元,出廠于2020年1月5日,銷往廣州、貴陽以及成都。...”,需要提取的信息以C#中的類表示如下:
class Product
{
public string name;? // 產品名
public double price;// 價格
public string[] salesArea;// 銷往地區
}
classProductCollection
{
public Product[] products;? // 存儲多個產品的
信息
}
接下來通過本文提出的模型來定義模式。
首先定義終端:posInt(正數),date(日期),location(地點關鍵詞)=北京|上海|天津|廣州|貴陽|成都,any(任意字符),然后定義數據映射,以下代碼所使用的語法都為C#語法:
var locations = new Array
locations.Item(location);? // 設置元模式
varproduct = new Struct
product.Construct((any, “name”), Keyword(“的價格”), Keyword(any), (posInt, “price”), Keyword(any), Keyword(“銷往”), (locations, “salesArea”));? // Keyword(string)是一個函數,將輸入的字符串打包成元組(關鍵詞終端[string],null)。用于表示模式需要匹配的關鍵詞,但因為其對應的字段名為null,該詞在Build時不會被記入相應的類實例中。Keyword(終端)是Keyword(string)的重載函數,它直接將輸入的終端打包成元組(終端,null)。
varproductArr = new Array
productArr.Item(product);? // 將元模式設置為product
varproducts = new Struct
products.Construct(Keyword(“產品信息:”, (productArr, “products”));
以上就是以產品集合類數據為目標數據定義的面向模式的文本數據描述模型,其中聯合體的關鍵字Union沒有顯式出現過,它通常僅作為“|”運算的返回值而不需要單獨存儲于變量中。
3 結束語
本文定義了面向模式的文本數據描述模型中四個關鍵的概念:終端、結構體、聯合體和數組,詳細描述了各類模式在匹配過程中的作用。終端為最基本的子模式,它在匹配過程中體現匹配實際內容的作用;結構體和循環體表示了兩種結構的模式,用于將模式與數據進行映射,并自動創建數據實例;聯合體在匹配過程中起到模式任選的作用。最后通過實例演示了該模型的使用方法,體現了模型的結構性與便利性。目前該模型僅有抽象的定義,用于模式匹配的引擎未在文中涉及,這是下一步需要完善的研究內容。
參考文獻:
[1]丁玉飛,王曰芬,劉衛江.面向半結構化文本的知識抽取研究[J].情報理論與實踐,2015,38(03):101-106.
[2]王云鵬.非結構化文檔數據抽取與分析系統的設計與實現[D].天津大學,2012.
[3]Zhe Fu, Li Jun. Spectral Clustering based regular expression grouping[A]//ANCS 2014-10th 2014 ACM/IEEE Symposium on Architectures for Networking and Communications Systems[C]. Marina del Rey, CA, United states: Association for Computing Machinery, Inc, 2014:243-244.