---
# System prepended metadata

title: 基於句法分析與主謂賓三元組的段落抽取規格書

---

# 基於句法分析與主謂賓三元組的段落抽取規格書

在此段落抽取模組中，我們使用了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**)，因此此段落為有效段落。