文章を比較できる!Word Mover's Distanceとは?

みなさんこんにちは!
イザナギです!
さて、今回はWMD(Word Mover's Distance)について調べる機会があったので、まとめてみたいと思います!

WMD(Word Mover's Distance)とは?

「Word Mover's Distance」をDeepL翻訳(Google翻訳でうまくいかなかったのでwww)で翻訳してみると以下通りになります。
「単語の移動距離」
直訳しても少し分かりに聞いですねwww
要するに、単語(文章)の距離(非類似度)を計算してくれるわけです!
例えば以下の例文で実験してみましょう!

  1. 私は犬が好きです
  2. 私は犬が好きです 

  1. 私は犬が好きです
  2. 私は猫が好きです


プログラムの処理上テキストは分かち書きしています。
画像内の一番下が「Word Mover's Distance」の結果です。
同じ文章だと数値は「0」になります。
つまり、0に近ければ類似度が高いということになります。
犬を猫に変えただけでは、それほど値は変わりませんね。
これは「Word Mover's Distance」特性によるものらしいです。
詳しく知りたい方はこちらのサイトを参考にしてみてください。
「英語が難しいよ!」って方はこちら
日本語のサイトの方にこんな文章を見つけました。

WMDではこの性質を利用して文書間の距離を求めます。 その考え方は大雑把に言えば、文書Aの語を類似する(=分散表現間の距離が小さい)語で置き換えて文書Bに変換できるならば、文書A, Bの類似度は大きい(=距離が小さい)というようなものです。https://yubessy.hatenablog.com/entry/2017/01/10/122737

人間の目から見て似ている単語(今回の場合は「犬」と「猫」)をword2vecを用いて探しているようですね。
Word2Vecについては前回も記事にしてみましたので、ご参考までに載せておきます!
新たな単語表現の仕方!「Word2Vec」とは?
確かに人の目から見ると「犬」と「猫」は別の生き物だけど、文章的に置き換えやすいですよね。

Word Mover's Distanceを実際に使ってみよう!

では実際に実装してみたいと思います!
今回は「Python3」「pip3」を用いて実装していきます。
ツールは以下の通りです。

  1. gemsim
  2. pyemd
  3. Word2vecのモデル

今回モデルは無料配布されているものを使用してみたいと思います。
word2vecの学習済み日本語モデルを公開します

Pythonライブラリをインストール

ではまず、必要なPythonライブラリをインストールしましょう!


pip3 install gensim
pip3 install pyemd

コード

実装コードはこんな感じです。


from gensim.models.word2vec import Word2vec

def main():
    model = Word2vec.load("word2vecのモデル格納場所のパスを記入")

    # 比較するテキストを分かち書き
    text_list1 = ["私","は","犬","が","好き","です"]
    text_list2 = ["私","は","猫","が","好き","です"]

    # word mover's distanceを実行
    sim_value = model.wv.wmdistance(text_list1, text_list2)

    print(text_list1)
    print(text_list2)
    print(sim_value)

main()

そして、実行すると以下のような結果が出てくると思います。
 

まとめ

今回は「Word Mover's Distance」を試してみました。
この技術はTwitterなどのショートテキストを比較する際にいい結果が得られるそうです。
しかし、問題点として「word mover's distance」と同じく文章を比較する技術である「Doc2Vec」に比べると処理時間が長くなってしまいます。
どちらを使うべきかは、実現したいことに合わせて決める方がいいのかもしれませんね。
それでは今回はここで筆を置かせていただきます。
最後まで記事をご覧いただきありがとうございました!

2024 - Izanagi's Site