Graph Convolutionで自然言語処理を行う(テキスト分類編) Part3
Part3では、Graph Convolutionを利用したテキスト分類を実装します。本編では実装と単純な実行結果を確認し、次回で結果やモデルの動作について詳細な分析を行いたいと思います。
グラフの構築については、先行研究に基づき(詳細はこちら参照) 係り受け関係(dependency)と単語類似度(similarity)の2つで行います。3点目の隣接行列の推定については、隣接行列を推定する構造を別途作る必要があるため一旦置いておこうと思います。
実装を行い、特にチューニングなどをせず実行した結果は以下のようになりました。
現段階で、baselineを上回る効果はあまり見られません(baselineは、LSTMの結果になります)。ジャンルによっては、逆にF1スコアが落ちているものも見られます。この結果については、次回で詳細な分析を行っていこうと思います。
実験の実装は以下になります。
なお、前回よりbaselineのLSTMの精度が上がっています。これは学習済みの単語分散表現を使用するようにしたためです(GloVeを使用しています)。後述しますが、単語の類似度でグラフを作る際に単語分散表現を使用しています。つまり、単語分散表現とグラフ2つの情報がモデルに渡るということになります。そこで、グラフのみの効果を測定するためbaselineでも単語分散表現を使用するようにしました。
以下では、グラフの構築方法について解説を行っていきます。
グラフの構築方法: 依存関係からのグラフ構築
自然言語処理において、グラフを構築する際に最も用いられているのは係り受けの関係です。
係り受け関係があれば1、なければ0、という形で隣接行列を作成します。今回は、依存関係の解析(Dependency Parse)にspaCyを使用しました。spaCyでは、形態素解析されたTokenのheadを調べることで(token.head
)、係り受け元のTokenを知ることができます。
実装はこちらになります。
グラフの構築方法: 単語類似度からのグラフ構築
単語類似度からグラフを構築する手法は、 Structured Sequence Modeling with Graph Convolutional Recurrent Networksで用いられています。単語分散表現(GloVe)の近さに基づき、グラフの構築を行います。
「近さ」には様々な尺度がありますが、ここではCosine similarityを用います。距離といえば一般的にEuclideanですが、単語分散表現の類似度にはCosineの方がよく用いられます。これは、値の大きさ(ベクトルにおいてはMagnitude)にあまり意味がない場合に適しています。
自然言語においては、例えば「サッカー」という単語が多ければサッカーの記事の確率が高いように思えますが、単語の数が多いのは単純に文章が長いからかもしれません。つまり「量(=値の大きさ)」ではなく、「位置(=ベクトルにおいては向き)」で距離を比較する方が好ましいです。この違いについては、Euclidean vs. Cosine Distanceによくまとまっています。
実装は以下の通りです。類似度TopNの単語に対して1、それ以外に0を振っています。ただ、この実装だと実際意味的に近くなくても無理やりTopNでの接続を行うことになるので、ちょっと改善が必要かもしれません。
また、単語分散表現の値は頻度ではありません。Cosine Similarityにより値の大きさを無視することになりますが、値の大小には本当に意味がないのでしょうか?実は、Cosine SimilarityよりEuclidean Distanceの方がSemantic Similarityの判定において効果が高かったという研究があります(Learning Semantic Similarity for Very Short Texts)。この点についても、次回のモデルの検証で試していきたいと思います。
こうして構築したグラフを、Graph Convolution(Graph Attention Network)に対する入力としています。Graph Attention Networkを利用したテキスト分類機の実装はこちらになります。
本編では、実験を行うための実装を行っていきました。具体的には、グラフの構築、グラフを入力としたテキスト分類機の構築です。そして、それらを利用し実際にテキスト分類ができるところまでを確認しました。その結果の分析、またモデルの挙動の解析について次回行っていきたいと思います。