はじめに
先日、文章間の類似度を測定したくなりました。サクッとできると思っていたのですが、なかなか思うような精度が出なくて苦労しました。
調査の過程で類似度を測定する方法は色々とあることを学んだのでまとめておきます。
精度に関しての言及は今回私が試した文章(=チャットのような短文)を対象としています。
文章間の類似度測定の流れ
文章間の類似度を測定するときはまず文章分散表現を取得します。文章分散表現を取得する方法は色々とあります。
その後、取得した分散表現同士を比較することで文章間の類似度を測定します。分散表現同士の比較方法はコサイン類似度を使うのが一般的です。
そのためこの記事では、色々な文章分散表現の取得方法を紹介します。
文章分散表現の取得方法
単語分散表現を基に文章分散表現を算出
単語分散表現を取得した後、取得した単語分散表現から文章分散表現を算出します。
それぞれについて色々なやり方があるので記載していきます。
単語分散表現の取得方法
- word2vec
-
BERT
- 2018年にGoogleが提案したものです。
- 前述したword2vwcの多義語問題を解決できる文脈を考慮した単語分散表現であり、文脈により同じ単語でも分散表現が変わります。
- ただし、fine-tuningを行わずに素のBERTからの出力で文章分散表現を算出しても精度がよくないことが知られています。後述するSentenceBERTなどを使います。
-
ELMo
- 2018年にストックマークが公開したものです。
- 複数の単語ベクトルを連結させて精度を向上させるというアイデアを紹介記事から学びました。
- 簡単には試せそうになかったので試していません。
- Electra
単語分散表現から文章分散表現を取得する方法
- まずは、単純に単語分散表現の平均を文章分散表現とする方法があります。
- 次に、TF-IDFで単語の重要度に応じた重みをつけた単語分散表現の平均を文章分散表現とする方法があります。
-
SCDV
- こちらの記事で採用されており精度は高そうでした。
- ただし、今回私が対象とする文章は短く、精度が出なそうに感じたので、あまり調べていません。
直接文章分散表現を算出する方法
単語分散表現は使わず、文章分散表現を算出します。
- doc2vec
-
SentenceBERT
- 文章の類似度を測るようなタスクを下流のタスクとしてBERTをfine-tuningしたものです。
- こちらの記事で日本語モデルが公開されています。
- 私が試した感じでは、時々光る答えをみせてくれましたが、間違いも多かった印象です。
-
Universal Sentence Encoder
- 2018年にGoogleが提案したものです。
- こちらの記事使い方が紹介されています。
- 少しだけ試していまいちな気がしたのですぐやめてしまいました。
-
BERTScore
- 自動生成した文章がどれだけ自然かのスコアを付ける方法です。
- 名前の通りBERTを使用しています。
- こちらの記事によると文章間の類似度測定にも使えるそうです。
- 少しだけ試していまいちな気がしたのですぐやめてしまいました。
以下は、どこに入れるか迷ったものです。単語分散表現から文章間の類似度を算出する方法です。
-
WMD(Word Mover's Distance)
- ある文章に含まれる単語群と別の文章に含まれる単語群の距離の長さによって類似度を測ります。
- gensimにWMDを計算する関数がある。
- 進化系のWRDがあることを知ったのであまり試していません。
-
WRD(Word Rotator's Distance)
- 2020年に東北大学の乾研が提案したWMDを改良した手法です。
- 単語ベクトルのノルムは単語の重要度を表し偏角は単語の意味を表すと考えている点が特徴です。
- 単語分散表現の平均からコサイン類似度を計算する手法よりも高精度であることが示されています。
- こちらの記事が参考になります。
- 私が試した感じでは、TF-IDF+単語分散表現の平均と同じくらいの精度で類似度を測定することができました。
その他参考にした文献
大変参考にさせて頂きました。ありがとうございました。