【まとめ】自然言語処理における単語分散表現（単語ベクトル）と文書分散表現（文書ベクトル）

自分のメモ代わりに作ったので間違いがあるかもしれません。また、説明が雑な部分もあります。
歴史が分かるように各手法が提案、公開された年も記載しています（※CNN、RNNは理論が発表された年にしています）。

# 単語分散表現（単語ベクトル）
2013年にGoogleのMikolovさん達がWord2Vecを提案して一躍有名に。

- 「王様」ー「男性」＋「女性」=「お姫様」

のように単語の足し算、引き算ができるという画期的な成果を残した。

最初（2013〜2017年頃）は文脈依存なしの分散表現しかなかった。
文脈依存なしの欠点（※後述）を克服するという観点で、2017年以降文脈依存ありの手法が提案され始めた。

## 文脈依存なし
- [Word2Vec](https://arxiv.org/abs/1301.3781)（2013年）
    - 一番有名。Googleの研究者たちが提案。
    - 日本語モデルは東北大学や企業が公開済み。
        - http://www.cl.ecei.tohoku.ac.jp/~m-suzuki/jawiki_vector/
        - https://aial.shiroyagi.co.jp/2017/02/japanese-word2vec-model-builder/
- [FastText](https://github.com/facebookresearch/fastText)（2016年）
    - Facebookが開発。Word2Vecと比較して、学習が速い。
    - 日本語モデルは公式サイトにバンドル済み。
        - https://fasttext.cc/docs/en/crawl-vectors.html#models
    - 未知語の場合でも、未知語の中に含まれるサブワードから分散表現を生成する
- [GloVe (Global Vectors)](https://nlp.stanford.edu/projects/glove/)（2014年）
    - Stanford大学が開発。Word2VecやFastTextと比較すると少しマイナーな印象（少なくとも日本では）。

## 文脈依存あり
Word2Vec、FastText、GloVeなどの文脈依存なしの手法では、多義語の場合に問題が生じる。具体的には、「ソフトバンク」はスポーツの「ソフトバンク」とIT企業の「ソフトバンク」、「香川」は地名の「香川」とサッカー選手の「香川」という複数の意味を持つが、単語分散表現としては同じになるという問題。
そこで、登場したのがELMoやBERTのように文脈を考慮した単語分散表現。前後の単語によって、同じ単語でも分散表現が変わる。但し、都度計算が必要になるため、文脈依存なしの手法と比較して計算時間が掛かるという欠点がある。

- [ELMo](https://allennlp.org/elmo)（2018年）
    - Allen AI[^1]とWashington大学が開発。
    - 日本語モデルは東北大学が公開済み。
        - https://github.com/cl-tohoku/elmo-japanese
    - アイデア自体は画期的だが、半年後にBERTが公開されたこともあり、そこまでは話題になっていない印象。
        - 英語と比較して日本語は多義語や語義の曖昧性が少ないというのも影響しているかも。
- [BERT](https://github.com/google-research/bert)（2018年）
    - Googleが提案＆開発。
    - 翻訳や分類問題を解くためのアルゴリズムという印象があるが、単語の分散表現としても利用可能。具体的には、BERTの中ではMasked Language Model (MLM)というMaskされた単語を推定するモデルがあり、その中で単語の分散表現が学習される。
    - ELMoは単語を推定する際に順方向と逆方向でそれぞれ独立に学習しているのに対し、BERTのMLMは順方向と逆方向を同時に学習している。これより、理論的にはELMoよりもBERTの分散表現の方が精度は高いはず。
    - 日本語モデル（事前学習済みモデル）は京都大学、東北大学、企業が公開済み。
        - http://nlp.ist.i.kyoto-u.ac.jp/index.php?BERT%E6%97%A5%E6%9C%AC%E8%AA%9EPretrained%E3%83%A2%E3%83%87%E3%83%AB
        - https://github.com/cl-tohoku/bert-japanese
        - https://www.hottolink.co.jp/blog/20190311_101674/

# 文書分散表現（文書ベクトル）
単語を分散表現で表すことができれば、次は文書を分散表現で表したくなる。ここで、文書というのは複数の単語からなるテキストと定義し、文節、文、文章のことを指す。
文書分散表現として、教師ありと教師なしの2つの手法に分けられる。教師ありの場合、文書毎に何かしらのラベルを付与する必要がある。一方、教師なしの場合、そのようなラベル付与は不要で、そのため教師ありと比較して文書分散表現作成の手間やコストが低い。

## 教師なし
- 単語分散表現の平均（2013年）
    - 一番シンプルな手法。文書を構成する単語の単語分散表現の平均を取るだけ。
        - 例えば、「カレーを食べる。」という文書をあった場合、「カレー」「を」「食べる」「。」の4つの単語の単語分散表現の平均を取る。
    - 単純に平均を取るだけでは全ての単語を同じ重みとして扱うが、単語毎に重みを付けた方が良い。前記の例では「を」「。」はなくても意味はほぼ通じるので、これらの単語の重みは小さくしたい。重み付けの方法は色々と提案されている。
        - tf-idf
        - [SIF (Smooth Inverse Frequency)](https://openreview.net/forum?id=SyK00v5xx)
    - 重み付け以外にも、[ALL-BUT-THE-TOP](https://arxiv.org/abs/1702.01417)のような前処理の方法が提案されている。
    - シンプルな手法にも関わらず、そこそこの精度が出る。特に、SIFは後述するSkip-Thought、RNNなどの手法よりも精度が高い[^2]。
    - 手法がシンプルで実装しやすくそこそこの精度が出るので、ビジネスでの応用事例も多い。
        - https://techlife.cookpad.com/entry/2019/02/20/120219
        - https://www.slideshare.net/TeruyukiSakaue/netadashi-meetup-7

- [Doc2Vec](https://arxiv.org/abs/1405.4053)（2014年）
    - Word2Vecとほぼ同じ時期に提案された手法だが、精度がいまいち。
        - エムスリーの人も精度に課題ありと[Meetup](https://logmi.jp/tech/articles/321131)で言及。

- [Skip-Thought](https://arxiv.org/abs/1506.06726)（2015年）
    - ブレインパッドの人が書いた[記事](https://blog.brainpad.co.jp/entry/2017/06/12/160000)があるが、それ以外ではSkip-Thoughtをほとんど聞いたことがない。
    - SIFの論文で比較対象になっているが、精度は高くない。むしろ、単語分散表現の平均の方が高い。

- CNN（1980年）
    - 画像の畳み込みを自然言語処理に応用。
    - 文書に含まれる単語の数が80個、単語分散表現の次元数が200の場合、80*200の行列に対して畳み込みを行うイメージ。

- [Universal Sentence Encoder](https://arxiv.org/abs/1803.11175)（2018年）
    - Googleが提案＆開発。
    - 異なる言語をまたいで同じベクトル空間モデルが共有される。例えば、日本語と英語の文書の類似度をダイレクトに計算できる。
    - Googleが開発したのでTensorFlow版しかない。PyTorch版はまだない。

- [WRD(Word Rotator's Distance)](https://arxiv.org/abs/2004.15003)（2020年）
    - 東北大学の乾研が提案した手法。
    - 文書分散表現を計算する手法ではないが、文書間の類似性を高い精度で計算することができる。単語分散表現の平均からコサイン類似度を計算する手法よりも高精度であることが示されている。
    - WRDの[解説記事](https://qiita.com/kenta1984/items/bad7e2f68331849d0053)と[実装](https://github.com/kenta1984/wrd)を公開しています。

# 教師あり
- [SentenceBERT](https://arxiv.org/abs/1908.10084)（2019）
    - 流行りのBERTを文書分散表現作成に適用したもの。
    - オージス総研の人が[日本語で実験した記事](https://www.ogis-ri.co.jp/otc/hiroba/technical/similar-document-search/part9.html)を公開している。

- [SCDV (Sparse Composite Document Vectors)](https://arxiv.org/abs/1612.06778)（2017年）
    - マイクロソフトとインド工科大学が提案。
    - 基本的には単語分散表現の平均と同じだが、単語分散表現を文書毎のラベル（トピック）に基づいて調整するのがポイント。

- RNN（1986年）
    - RNNで分類問題を解く。その上で、Encoderの隠れ層を文書分散表現とする。最後の単語の隠れ層だけを使っても良いし、それぞれの単語の隠れ層の平均を使っても良い。方法は幾つも考えられる。

# 参考文献
https://github.com/Separius/awesome-sentence-embedding

[^1]: Microsoftの共同創業者であるPaul Allenが立ち上げた研究機関
[^2]: SIFの論文では著者達はそう主張しているが、ドメインやデータが違うと結果は異なる可能性はある。