Word2Vec、FastTextの比較（演算編）

## はじめに
前回の記事、[Word2Vec、FastTextの比較（類義語編）](https://qiita.com/wrbs/items/ebb6981d5e6c5e2fe595)に続き、今度は演算での比較を行いました。

## 単語同士の演算機能について
Word2Vec、FastTextは単語同士で演算ができます。
有名な例として `王` － `男` ＋ `女` ＝ `女王` があります。
![w2v_003.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2415251/db23dce6-510f-9ee3-b6ad-71519b14eeaf.png)
`王` － `男` ＋ `女` のベクトル演算をすると、 `[0.4, 0.2]` － `[0.1, 0.2]` ＋ `[0.2, 0.5]` ＝ `[0.5, 0.5]` になります。これは `女王: [0.5, 0.5]` に一致します。
図1のように単語間の“王族”という概念差と“女性”という概念差がWikipediaの学習により獲得できているため、演算が可能となります。
単語ベクトルの加減算は、gensimライブラリーのmost_similar関数で行うことができます。
`王` － `男` ＋ `女`の演算結果を得るには `most_similar(positive=["王", "女"], negative=["男"])` のように使います。

## 演算 `王` － `男` ＋ `女` 結果の考察

<table>
<tr>
  <th colspan=2>Word2Vec</th>
  <th colspan=2>FastText</th>
</tr>
  <th>単語</th>
  <th>類似度</th>
  <th>単語</th>
  <th>類似度</th>
</tr>
<tr>
  <td>皇帝</td>
  <td>0.70</td>
  <td>太子</td>
  <td>0.74</td>
</tr>
<tr>
  <td>聖王</td>
  <td>0.70</td>
  <td>公</td>
  <td>0.69</td>
</tr>
<tr>
  <td>太子</td>
  <td>0.70</td>
  <td>聖王</td>
  <td>0.68</td>
</tr>
<tr>
  <td><font color="Red">女王</font></td>
  <td><font color="Red">0.64</font></td>
  <td><font color="Red">女王</font></td>
  <td><font color="Red">0.65</font></td>
</tr>
</table>

`王` － `男` ＋ `女` の演算をWord2Vec、FastTextのそれぞれのモデルで試してみました。
演算結果のベクトルに近い単語を、類似度の高い順に並べています。

前述したように期待する結果は `女王` です。Word2Vec、FastTextとも `女王` は1位にはなりませんでしたが、登録語約24万語のうち、4番目に出現していますので、ほぼ期待どおりと考えます。また、上位4個のうち3個が同じ単語であり、類似度もほぼ同じ値になっているので、Word2VecとFastTextに大きな差異はないと考えます。

## 演算 `パリ` － `フランス` ＋ `日本` 結果の考察

<table>
<tr>
  <th colspan=2>Word2Vec</th>
  <th colspan=2>FastText</th>
</tr>
  <th>単語</th>
  <th>類似度</th>
  <th>単語</th>
  <th>類似度</th>
</tr>
<tr>
  <td><font color="Red">東京</font></td>
  <td><font color="Red">0.73</font></td>
  <td><font color="Red">日本</font>橋女学館</td>
  <td>0.72</td>
</tr>
<tr>
  <td>横浜</td>
  <td>0.59</td>
  <td><font color="Red">東京</font></td>
  <td><font color="Red">0.71</font></td>
</tr>
<tr>
  <td>大阪</td>
  <td>0.58</td>
  <td><font color="Red">日本</font>食</td>
  <td>0.67</td>
</tr>
</table>

`パリ` － `フランス` ＋ `日本` の演算をWord2Vec、FastTextのそれぞれのモデルで試してみました。
演算結果のベクトルに近い単語を、類似度の高い順に並べています。
期待する結果は `東京` です。`東京`は、Word2Vecは1番目、FastTextは2番目に出現していますので、ほぼ期待どおりと考えます。類似度もほぼ同じ値になっているので、Word2VecとFastTextに大きな差異はないと考えます。
FastTextは、positiveに指定した `日本` を部分単語に含む `日本橋女学館` `日本食` といった単語が類似度の上位に入りました。これは[類義語編](https://qiita.com/wrbs/items/ebb6981d5e6c5e2fe595)でも見られた傾向です。

## Word2Vec：登録単語と演算の比較 `東京大学`と `東京` ＋ `大学`

`東京大学`の類義語と、演算 `東京` ＋ `大学` の類義語の違いを確認しました。
この章はWord2VecとFastTextの比較ではなく、Word2Vec単独での確認内容です。
gensimライブラリーで結果を得るには、以下のようにmost_similar関数に入力します。
- `東京大学` は `most_similar(positive=["東京大学"])`
- `東京` ＋ `大学` は `most_similar(positive=["東京", "大学"])`

<table>
<tr>
  <th colspan=2>「東京大学」</th>
  <th colspan=2>「東京」＋「大学」</th>
</tr>
  <th>単語</th>
  <th>類似度</th>
  <th>単語</th>
  <th>類似度</th>
</tr>
<tr>
  <td>名古屋大学</td>
  <td>0.91</td>
  <td>明治大学</td>
  <td>0.73</td>
</tr>
<tr>
  <td>東北大学</td>
  <td>0.91</td>
  <td>中央大学</td>
  <td>0.73</td>
</tr>
<tr>
  <td>九州大学</td>
  <td>0.90</td>
  <td>早稲田大学</td>
  <td>0.73</td>
</tr>
<tr>
  <td>大阪大学</td>
  <td>0.89</td>
  <td>法政大学</td>
  <td>0.72</td>
</tr>
<tr>
  <td>北海道大学</td>
  <td>0.88</td>
  <td>東京電機大学</td>
  <td>0.70</td>
</tr>
</table>

結果の単語を類似度の高い順に並べています。 `東京大学` の結果は、大学名（旧帝大）の単語が出ています。
`東京` ＋ `大学` の結果も大学名の単語が出ていますが、上位5件に現れる単語と類似度は、 `東京大学` とは大きく異なりました。
また、`東京大学` の類似度上位に現れた大学（ `名古屋大学` 、 `東北大学` など）の本部所在地は全国各地に散らばっていますが、`東京` ＋ `大学` の演算結果の類似度上位に現れた大学（ `明治大学` 、 `早稲田大学` など）は、いずれも本部が東京都内にあります。

`東京大学` と `東京` ＋ `大学` の結果が異なる理由を考察します。
![w2v_004.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2415251/7520c3bf-7b6a-ac28-696a-141ac488719b.png)
図2のように `東京大学` の類義語は“大学名”という概念の単語が出ていると考えられるのに対し、 `東京` ＋ `大学` の類義語は“地名”という概念の単語と“組織”という概念の単語を足し合わせた結果の類義語が出ているということだと思います。

## おわりに

ここまでお読みいただきありがとうございました。
演算で得られる結果は、Word2VecとFastTextに大きな差異はないことが確認できました。
また、Word2Vec、FastTextの演算は、単語の概念同士の演算であることを確認しました。