ナード戦隊データマン

データサイエンスを用いて悪と戦うぞ

studio-ousiaによるEntity Linkingの特徴量設計を再現する (概要)

Entity Linkingとは、テキスト内のエンティティを知識ベース等を用いて一意に識別するタスクです。例えば、"パイソン"という表現がテキストに現れたとき、プログラミング言語Pythonのことなのか、モンティパイソンのことなのかを特定します。ここでは、studio-ousiaの論文とコードを基に、特徴量設計の概要を見ていきます。

entity-vector

github.com

上記リンクは、entity-vectorのコードです。entity-vectorは、語とエンティティの両方のEmbeddingを作成する方法です。enwikiのdumpファイルからEmbeddingを作成しますが、作成には数日かかります。

作成されたEmbeddingを用いると、語またはエンティティを指定して、それを表現するベクトルが取得できます。

>>> from entity_vector import EntityVector
>>> entvec = EntityVector.load('enwiki_entity_vector_500_20151026.pickle')
>>> word = entvec.get_word(u'c-3po')
>>> entvec[word]
memmap([ 0.05961042,  0.24534572,  0.42090839, -0.01455959,  0.11772038,
        0.55437287, -0.62508648, -0.24478671,  0.07838536,  0.27331885,
        0.35184374,  0.34113087,  0.11718472, -0.14086614, -0.00730115,
...
>>> entity = entvec.get_entity(u'C-3PO')
>>> entvec[entity]
memmap([ -3.51071961e-03,   4.82281654e-01,   6.72443198e-01,
         2.41103170e-01,   1.43198542e-01,   6.44051048e-01,
        -5.48925964e-01,  -4.64934616e-01,  -2.48444133e-01,
...

特徴量の概要

それでは、特徴量設計の概要を見てみましょう。特徴量には、以下があります。(ただし、カッコ内はカラム名)

  • entity prior (entity, pe)
  • prior probability (mention, entity, pem)
  • ドキュメント内の各メンションの候補エンティティの最大prior probability (doc_id, mention, mpp)
  • ドキュメント内のあるメンションの候補エンティティの数 (doc_id, mention, ecount)

これらは基本特徴量とされます。さらに、以下の特徴量を加えます。

  • mentionとentityのedit distance (mention, entity, edit_distance)
  • mentionとentityの表現が同一かどうか (mention, entity, string_equal)
  • mentionはentityの表現の始まりか終わりに含まれるか (mention, entity, startends_with)

これらの特徴量はstring similarityと呼びます。そして、文脈を利用するために、以下の特徴量を加えます。

  • textual contextと候補エンティティの間のコサイン類似度 (doc_id, entity, vcw)
  • context entityと候補エンティティの間のコサイン類似度 (doc_id, entity, vce)
  • rank by above similarities (doc_id, mention, entity, rank)

また、正解ラベル(doc_id, mention, entity, label)は、mentionを表すentityが正解ならばTrue,そうでなければFalseを定義します。この定義は、PPRforNEDまたは、YAGOデータセットから行われます。

カラム名上記で表されましたが、最終的には、上記カラム名からなるテーブルを、同一カラム名をキーとしてmergeして使います。

entity prior

entity priorとは、enwiki上のすべてのアンカーから、各々のエンティティが含まれる率です。

prior probability

prior probabilityとは、あるメンション(エンティティを表すテキスト表現)を選んだとき、各々の候補エンティティが出現する率です。

textual context

textual contextは、あるドキュメント内に含まれる名詞をOpenNLPで取得し、それらのentity-vectorでのベクトル表現の平均を求めたものです。この平均ベクトルとドキュメント内の各々の候補エンティティのベクトル表現とのコサイン類似度を特徴量とします。

coherence

coherenceは、最初のステップではprior probabilityが0.95以上のエンティティを選び、これらの平均ベクトルと候補エンティティとのコサイン類似度をとります。

二回目のステップでは、最初のステップで学習されたモデルを用いて予測をした結果としてTrueになったエンティティを選び、同様にこれらの平均ベクトルと候補エンティティとのコサイン類似度をとります。

rank

さらに、ここまでの特徴量全てが求まったら、ドキュメントとメンションでグルーピングした上で、上記2種類の類似度に基づいてエンティティのrankを求め、それを特徴量とします。

学習 GBRT

学習では、scikit learnのGBRTを用います。メインとなるハイパーパラメータは以下です。

私はParameterGridを用いて、conllのtestaのスコアが最大となるパラメータをサーチするようコーディングしましたが、testaを用いずに、GridSearchCVの交差検証を使う方法もあります。サーチするパラメータの設定は以下です。

η = 10, 000

β = {0.01, 0.02, 0.03, 0.05}

ξ = {3, 4, 5}

それぞれ、イテレーション数、学習係数、ツリーの深さとなります。

学習に用いるデータ

CoNLL

  1. PPRforNED
  2. YAGO

学習の手順

  1. 基本特徴量のみで実行
  2. 基本特徴量 + string similarityで実行
  3. 基本特徴量 + string similarity + textual contextで実行
  4. 基本特徴量 + string similarity + textual context + coherenceで実行
  5. 基本特徴量 + string similarity + textual context + coherence (2 step) で実行

論文中のスコア

Screenshot from 2017-12-16 09-38-17.png

参考

[1] https://arxiv.org/abs/1601.01343

[2] https://github.com/studio-ousia/entity-vector