エンティティリンキングによる単語への概念付与

# はじめに

BERTのようなディープラーニングを用いたモデルの登場により、自然言語処理の様々なタスク（機械翻訳、情報検索など）での性能が大きく向上した。

しかし、機械読解の性能が向上した今でも機械は、単語の前後関係や統計情報などから尤もらしい単語列を出力しており、単語の背景情報を含む意味を理解しているわけではない。具体例で示すと、「犬」という単語は「ペットショップ」や「売られている」という単語とよく一緒に出現するという統計情報からN次元のベクトル情報（分散表現）として学習される。

```shell
ペットショップでは犬が売られている。
```

分散表現と単語の意味の関係はこのようになっている。

**ベクトル情報が近い＝同じような文脈で使われる＝意味が近い**

「意味が近い単語は似たような文脈で使われることが多い」という考えのもと、単語の分散表現が単語の意味を推測する手がかりとなっている。

ただし分散表現には、「暑い」と「寒い」のような対義語関係にあるものも同じ文章で使われるので、同義語と対義語の区別が難しいという問題もある。人間はさらに「暑い」の語源やイメージなどの文章以外の情報から「暑い」と「寒い」が区別できるが、機械読解においては文章以上の情報が与えられることは少ない。

そこで本記事では文章中の単語に概念（意味）を付与する方法として、エンティティリンキングについて説明する。

# エンティティリンキング

エンティティリンキングは固有表現認識（NER）と曖昧性解消の2つのフェーズに分けることが出来る（pipeline型）。他にもこの２つのフェーズを一度に学習するEnd-to-End型があるが、改良の容易さから、本記事ではpipeline型を採用している。エンティティリンキングのイメージ図と流れを以下に示す。

<div align="center">
<img width="500" alt="image.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/531981/ecc4fce9-1931-3b1c-22c5-8f60ce408678.png">

<img width="500" alt="ELfolw2.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/531981/d8bd6324-75e3-f78a-2663-d55b4a75cbdf.png">
</div>
# 固有表現認識

固有表現認識とは文章中に含まれる固有表現を抽出し、それを人名や組織名などを表す固有名詞や、日付・時間表現、数量などのあらかじめ定義された分類と対応付けることを指す。

例として以下の文に対してNERを行った場合、人名を指す「カルロス・ゴーン」と地名を指す「レバノン」が抽出される。

```shell
before: カルロス・ゴーンはレバノンに行った。

after: カルロス・ゴーン<PERSON>はレバノン<Location>に行った。
```

今回は、ニューラルネットワークを用いた固有表現認識モデルとしてBiLSTM-before: カルロス・ゴーンはレバノンに行った。をベースにした[Alanら](https://www.aclweb.org/anthology/C18-1139/)の手法を用いた。

## BiLSTM-CRF

BiLSTM-CRFは[Lampleら](https://arxiv.org/abs/1603.01360)が提案したモデルである。文字ベース層、単語（形態素）ベース層、およびCRF層の3層から構築されている。以下にモデルのイメージ図を示す。

<img width="426" alt="lample.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/531981/d0c80cc1-450d-b1f4-01db-933f8a7e4e05.png">

[A Bidirectional LSTM and Conditional Random Fields Approach to Medical Named Entity Recognition](https://www.researchgate.net/figure/The-overall-architecture-of-the-Bi-LSTM-CRF-Model-for-medical-NER-tasks_fig1_319404236)より

文字ベース層と単語ベース層にはBiLSTMが使用されており、文字ベース層では文字の前後関係を学習する。続いて単語ベース層では、単語の前後関係を学習します。最後のCRF層では、ラベルの依存関係（人名の後には人称代名詞が来やすいなど）を学習している。

単語の分散表現を用いることで単語の前後関係から単語の意味を推測することが出来るようになったので、統計的情報を用いていたときよりも性能が向上したのが特徴である。

[Alanら](https://www.aclweb.org/anthology/C18-1139/)の手法は、文字ベース層に手を加えており、文字ベースの言語モデルを使用することでBERTよりも少し良い性能を出している。

<img width="585" alt="alan.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/531981/a4e374a2-5928-365d-de2d-11a8bac68a9e.png">

[Contextual String Embeddings for Sequence Labeling](https://www.aclweb.org/anthology/C18-1139/)より

性能については、関根の拡張固有表現タグ付きコーパス170記事をテストデータとして用いた場合、Lampleらの手法に比べ10％近く向上した。

# 曖昧性解消

抽出された固有表現に対してのリンク候補記事が複数ある場合に、リンク候補を一つに決める必要がある。

rankSVMを用いて固有表現に付与するリンク候補にスコアを付与し、最もスコアが高い記事と固有表現に対してリンク付けを行った。

rankSVMは自分で素性を設計できるので、以下の素性を用いた。

- 事前確率

- tf-idfCos類似度

- レーベンシュタイン距離

東北大が開発した[jawikify](https://www.anlp.jp/proceedings/annual_meeting/2017/pdf_dir/A2-3.pdf)の曖昧性解消の部分をそのまま用いている。

Rubyで書かれており、Pythonに書き直そうと考えたが、そのまま使う方が時間の節約になるのでのまま使用している。

# 実験手順

実験の流れは以下の通りである。

1. 文章に対して固有表現認識を行い、固有表現を抽出

2. 抽出された固有表現に対してwikipedia記事のリンクを付与

3. 出力結果をHTML形式で表示

２については、リンク候補が複数ある場合には曖昧性解消を行い候補を一つに絞る。また、スコア関数によりリンク確率が付与されているが、閾値以下の場合にはリンクを付与していない。

# 学習に用いたデータセット

~~固有表現認識の学習には[関根の拡張固有表現タグ付きコーパス](https://www.gsk.or.jp/catalog/gsk2014-a/)を使用した。新聞やマイクロブログなどを集めた2000記事で構成されており、関根の拡張表現と呼ばれる200種類の固有表現ラベルが付与されているのが特徴である。~~

学習済みモデルをアップロードしてテストのみの実行にしようと考えていたが、ファイルサイズが大きいので断念。その代わり[Hironsanのコーパス](https://github.com/Hironsan/iob2corpus)を用いてトレーニングを実行できるようにした。

曖昧性解消モデルの学習には[日本語wikificationコーパス](http://www.cl.ecei.tohoku.ac.jp/jawikify/)を使用した。こちらは先ほどのコーパスに含まれている新聞記事340記事に対してwikipediaリンクを付与している。

# 実験

gitからダウンロード

```shell
$ git clone https://github.com/NaotakaKawata/wikija
```

READMEに従って環境構築を行い、モデルの学習、テストを行う。
環境構築にはそれなりに時間がかかり、実行環境のスペックによっては、モデルの学習に時間がかかる、もしくはメモリが足りないというエラーが出るかもしれません。

実行した結果がこちら。

![3aq8s-w8z3v.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/531981/8c18121b-9643-a501-6186-a261568ba43b.gif)

# おわりに

今回は固有表現認識でBiLSTM-CRF、曖昧性解消でrankSVMを使っている。より性能が良い固有表現認識、曖昧性解消ツールが出た場合、今回のpipeline型ではその部分を取り換えて実験を行うことが可能なので、修正が容易である。例えばBiLSTM-CRFの部分をBERTや既存のAPIに取り換えることもできる。

研究に使えそうな無料の日本語wikificationツールが[jawikify](https://www.anlp.jp/proceedings/annual_meeting/2017/pdf_dir/A2-3.pdf)以外なかったので、研究に利用するため作成しました。直すべき点はありますが、将来の筆者に改良は任せることにする。

# 参考文献

- [Neural Architectures for Named Entity Recognition](https://arxiv.org/abs/1603.01360)

- [日本語wikificationツールキット：jawikify](https://www.anlp.jp/proceedings/annual_meeting/2017/pdf_dir/A2-3.pdf)

- [anaGo](https://github.com/Hironsan/anago)

- [Contextual String Embeddings for Sequence Labeling](https://www.aclweb.org/anthology/C18-1139/)