# 基於句法分析與主謂賓三元組的段落抽取規格書 在此段落抽取模組中,我們使用了LTP自然語言解析套件進行開發,說明文件可參閱LTP,主要使用了LTP套件中的詞性標註(pos),依存句法分析(dep),語義角色標註(srl),以下說明此模組的模組流程與元件細節。 ## 模組說明 先前經由tesseract與pdfminer從pdf與其他文件抽取出來的文本會有如表格,標頭,標題,頁首,頁尾,圖片說明…等,使用者不會想看到的東西,這些文本的共同特徵是幾乎都是沒有句子基本結構的短句/詞,因此我們設計此模組,經由套件的輔助抽取出句子的句型結構,並判斷是否有「主語,謂語,賓語」這三個元素存在句子結構中,假如有此句型結構,此段落即為有效段落,否則此段落將被過濾掉,以此達到過濾上述不想要文本的效果。 ## 段落抽取流程 ![](https://i.imgur.com/iZnKtzN.png) 如上圖所示,原始段落會先進入語義角色標註模組進行分析,如取出主謂賓的結構,即為有效段落,否則會進入依存句法分析模組進行解析,如取出主謂賓的結構,即為有效段落,否則此段落便為無效段落,接下來將詳細介紹各模組的主謂賓結構如何判斷。 ### 語義角色標註 - 主謂賓判斷 模組輸入定義如下 | 欄位 | 資料型態 | 說明 | | ---------- | -------- | ------------ | | inputs | String[] | 段落文字 | 範例輸入: `["他叫汤姆去拿外衣。"]` `["他叫汤姆去拿外衣。", "湯姆抓到了貓"]` 模組輸出定義如下 | 欄位 | 資料型態 | 說明 | | ---------- | -------- |:------------------------------ | | node | Tuple[] | 段落中分詞位置的主謂賓剖析結果 | | node[0] | Int | 此節點的段落分詞位置 | | node[1] | Tuple[] | 節點的主謂賓剖析結果 | | node[1][0] | String | 節點的句法關係 | | node[1][1] | Int | 分詞起始位置 | | node[1][2] | Int | 分詞結束位置 | 範例輸出: ``` [ [ (1, [('A0', 0, 0), ('A1', 2, 2), ('A2', 3, 5)]), # 叫 -> [A0: 他, A1: 汤姆, A2: 去拿外衣] (4, [('A0', 2, 2), ('A1', 5, 5)]) # 拿 -> [A0: 汤姆, A1: 外衣] ] ] ``` 主謂賓判斷規則: 1. 假設當前段落節點為node(x),node(x)[1]內的元素同時包含"A0", "A1",此段落即為有效段落 範例程式碼: ``` result = [] srl = ltp.srl([paragraph_1, paragraph_2, ...]) for pagraph in srl: is_valid = False for node in paragraph: relations = [] for relation in node[1]: if relation[0] in ['A0', 'A1']: relations.append(relation[0]) result.append(is_valid) ``` 說明: 段落LTP套件的語義角色標註(srl)後,會產出上述結構,A0代表此詞組為主語,A1代表此分詞為受詞,A2為間接受詞,**在此階段只要段落剖析結果出現A0與A1,即視為擁有主謂賓三元組。** ### 依存句法分析 - 主謂賓判斷 | 关系类型 | Tag | Description | Example | | ----- | --- | --------------------- | ---------------- | | 主谓关系 | SBV | subject-verb | 我送她一束花 (我 <– 送) | | 动宾关系 | VOB | 直接宾语,verb-object | 我送她一束花 (送 –> 花) | | 间宾关系 | IOB | 间接宾语,indirect-object | 我送她一束花 (送 –> 她) | | 前置宾语 | FOB | 前置宾语,fronting-object | 他什么书都读 (书 <– 读) | | 兼语 | DBL | double | 他请我吃饭 (请 –> 我) | | 定中关系 | ATT | attribute | 红苹果 (红 <– 苹果) | | 状中结构 | ADV | adverbial | 非常美丽 (非常 <– 美丽) | | 动补结构 | CMP | complement | 做完了作业 (做 –> 完) | | 并列关系 | COO | coordinate | 大山和大海 (大山 –> 大海) | | 介宾关系 | POB | preposition-object | 在贸易区内 (在 –> 内) | | 左附加关系 | LAD | left adjunct | 大山和大海 (和 <– 大海) | | 右附加关系 | RAD | right adjunct | 孩子们 (孩子 –> 们) | | 独立结构 | IS | independent structure | 两个单句在结构上彼此独立 | | 核心关系 | HED | head | 指整个句子的核心 | 以上為依存句法分析的標籤與對應關係 ```python seg, hidden = ltp.seg(["他叫汤姆去拿外衣。"]) dep = ltp.dep(hidden) # [['他', '叫', '汤姆', '去', '拿', '外衣', '。']] # [ # [ # (1, 2, 'SBV'), # (2, 0, 'HED'), # 叫 --|HED|--> ROOT # (3, 2, 'DBL'), # (4, 2, 'VOB'), # (5, 4, 'COO'), # (6, 5, 'VOB'), # (7, 2, 'WP') # ] # ] # # 他 (1, 2, 'SBV'), # 叫 (2, 0, 'HED'), # 湯姆 (3, 2, 'DBL'), # 去 (4, 2, 'VOB'), # 拿 (5, 4, 'COO'), # 外衣 (6, 5, 'VOB'), # 。 (7, 2, 'WP') ``` 段落經過LTP套件的依存句法分析(dep)後,會產出上述結構(單字位址, 根節點位置, 依存關係),我們以node(x)代表上述資訊,在此主要利用句法分析的標籤位置制定規則進行過濾,以下列出模組內使用到的規則: 1. 主動賓關係 ``` 湯姆 (1, 2, 'SBV') 抓到 (2, 0, 'HED') 了 (3, 2, 'RAD') 貓 (4, 2, 'VOB') ``` 以上例句中 node(抓到),同時是node(湯姆)與node(貓)的根節點,且node(湯姆)與node(抓到)為主謂關係(**SBV**),node(貓)與node(抓到)為動賓關係(**VOB**),因此此段落為有效段落。 2. 含有介賓關係的主謂動補關係 ``` 湯姆 (1, 2, 'SBV') 活躍 (2, 0, 'HED') 在 (3, 2, 'CMP') 米老鼠家 (4, 3, 'POB') ``` 以上例句中 node(活躍)同時是node(湯姆)與node(在)的根節點,且node(湯姆)與node(活躍)為主謂關係(**SBV**),node(在)與node(湯姆)為動補結構(**CMP**),同時node(在)與node(米老鼠家)為介賓關係(**POB**),因此此段落為有效段落。