BERTでSemantic Role Labeling（意味役割付与）やってみた

## Semantic Role Labeling（意味役割付与）とは
文の述語と構造を抽出し、「誰が誰に何をしたか」、 「いつ」 、 「どこで」 などを意味役割（抽象度の高い表現）を特定するものです。
これをすることで、様々な自然言語処理のタスクで活用できる言われています。

例えば、次のような文章に以下のようにラベル付けします。

- 彼は赤い服を着ている
    - [動作主]彼は
    - [対象]赤い服を
    - [述語]着ている

## Semantic Role Labelingの歴史
Semantic Role Labelingの動向について説明します。

- 構文解析することで意味役割する手法（~2005）

- 明示的な構文情報を必要としないニューラルネットワークベースの手法（2015~2018）
[A Simple and Accurate Syntax-Agnostic Neural Model for Dependency-based Semantic Role Labeling](https://arxiv.org/pdf/1701.02593.pdf)など

- ニューラルネットワークモデルで、さらに構文情報を活用するモデル(2016~2018)
[Linguistically-Informed Self-Attention for Semantic Role Labeling](https://www.aclweb.org/anthology/D18-1548/)など

- BERTなどの言語モデルを用いて意味役割する手法(2019~)
[Simple BERT Models for Relation Extraction and Semantic Role Labeling ](https://arxiv.org/pdf/1904.05255.pdf)など

現在BERTなどの事前学習済みの言語モデルを用いて意味役割する手法はCoNLL-2005などでstate-of-the-artを達成しています。AllenNLPでも[実装](https://demo.allennlp.org/semantic-role-labeling)。

軽く調べただけなので、もっと良い手法があったら教えて下さい。

## BERTを使ったSemantic Role Labeling
Semantic Role Labelingは4つのサブタスクからなります。
* predicate detection: 述語検出
* predicate sense disambiguation: 述語意味曖昧性解消
* argument identification: 引数識別
* argument classification: 引数分類

ここで述語はデータセットに付与されているため、述語検出のタスクは考慮していません。

入力文の入力形式は以下のように行います。
`[[CLS] 文章 [SEP] 述部 [SEP]]`

また正解ラベルにはspan-basedを用いて、PropBank形式のラベルを用いています。

```
PropBankの基本的なラベル
ARG0：動作主
ARG1：対象
ARG2、ARG3、ARG4：起点、着眼、対象、など

詳細なラベル
ARGM-ADJ：形容詞（名詞を修飾する）
ARGM-ADV：副詞（動詞を修飾する）
ARGM-CAU：原因
ARGM-COM：共格
ARGM-DIR：方向
ARGM-EXT：程度
ARGM-LOC：相互（人）
ARGM-MNR：様態
ARGM-PRP：目的
ARGM-REC：相互
ARGM-TMP：時間
など
```

さらにBIO taggingでタグ付をします。
[NLPででてくる BIO Tag って何？ | CV・NLP TIPS](https://vasteelab.com/2018/04/09/2018-04-09-112444/)

> B: ‘beginning’ 固有表現の始点を意味する
> I:  ‘inside’ 固有表現の内部を意味する
> O: ‘outside’ 固有表現の外側を意味する

例としては以下のようなものです。

```
Barack Obama went to Paris
[ARG0] Barack Obama
[V] went
[ARG4] to Paris

入力文：[CLS] Barack Obama went to Paris [SEP] went [SEP]
ラベル：B-ARG0 I-ARG0 B-V B-ARG4 I-ARG4
```

最終的に隠れ層一層のMLPを通してラベルを学習します。

- ソースなどはこちらにあるようです。
https://github.com/h0m3brew/BabyBertSRL

- 論文はこちら
[Simple BERT Models for Relation Extraction and Semantic Role Labeling ](https://arxiv.org/pdf/1904.05255.pdf)

### 日本語での学習

#### 日本語データセット
BERTを使ったSemantic Role Labelingを日本語を用いて学習させたいと思います。
まず、データセットとして岡山大学竹内研様の述語項構造シソーラスというものが利用できそうだったので、使用させていただきました。この場を借りて感謝いたします。

[述語項構造シソーラス (岡山大学竹内研)](http://pth.cl.cs.okayama-u.ac.jp/download/)

述語の項構造データになっていて、PropBank形式の意味役割のラベルが付与されています。
例文が記載されており、それに対して構造データが付与されているため、例文を`JUMAN++`や`KNP`を使って形態素分析し構造データを紐付け、データセットを作成しました。

#### 学習済みモデル
そしてBERTの事前学習済みモデルにはは京都大学の黒橋・河原研究室様の公開されているモデルを使用させていただきました。
Tokenizerなども公開されているものを使用しています。

[BERT日本語Pretrainedモデル](http://nlp.ist.i.kyoto-u.ac.jp/?ku_bert_japanese)

#### 結果
23000件ほどで、9割を学習用に、残りを評価用に使用し、データが少ないため2Epochのみ学習しました。（数分で終わります）

|           |        |          | 
| --------- | ------ | -------- | 
| precision | recall | f1-score | 
| 92.6      | 93.3   | 92.7     | 

わずか2Epochでの学習で9割近いスコアになりました。試した感じは割とうまく行ってそうです。

```
彼女は料理が へたくそだ
['彼女', 'は', '料', '理', 'が', 'へ', 'たく', 'そ', 'だ']
B-Arg0 I-Arg0 B-Arg1 I-Arg1 I-Arg1 B-V I-V I-V I-V
```

### まとめ
Semantic Role Labelingについて調べたことをまとめました。

データセットを作成する際、述語の項構造データと例文の紐付けなど苦戦し、データセットの作り方など工夫する必要がありそうです。

参考になれば幸いです。