GloVeから分散表現を検索して記事分類


①事前学習済みのモデル<b>GloVe</b>から単語分散表現を検索
②入力データを分散表現に変換
③モデルの学習
事前学習済みモデルとタスクとして使うデータの類似性がある、ドメインが同じであれば効果あり

#タスクと関連記事
New York Times紙の記事分類
GloVeを使わずに分類した結果は過去記事に掲載
https://qiita.com/Phoeboooo/items/dbc8bb5308c9ec5af6a0
GloVeをファインチューニングして記事分類をしてみた結果
https://qiita.com/Phoeboooo/items/bcbf51acd946d32416b6




#GloVeから単語の分散表現を検索
defaultdictを使うと"UNK"や"PAD"などGloVeに含まれていない単語もベクトル0として対応できる

```python
import collections
embeddings_index = collections.defaultdict(int)
GLOVE_DIR = os.path.join('Downloads', 'glove.6B')
f = open(os.path.join(GLOVE_DIR, 'glove.6B.300d.txt'), "r", encoding="utf-8" )
for line in f:
    values = line.split()
    word = values[0]
    coefs = np.asarray(values[1:], dtype='float32')
    embeddings_index[word] = coefs
f.close()

print('Found %s word vectors.' % len(embeddings_index))
```
>Found 400000 word vectors.

#入力データを分散表現に変換
```python
EMBEDDING_DIM = 300
X = np.zeros((data_X.shape[0], EMBEDDING_DIM))
for i in range(data_X.shape[0]):
    E = np.zeros((EMBEDDING_DIM, MAXLEN))
    words = [index_to_word[wid] for wid in data_X[i].tolist()]
    for j in range(MAXLEN):
        E[:, j] = embeddings_index[words[j]]
    X[i, :] = np.sum(E, axis=1)
```
data_xはインデックス化しておいた文章
→[   0,    0,    0,    0,    0,    0,    0,    0,    0,    0, 0, 0,  607,  965, 1295,  966, 1835,  608,  276, 1296]みたいなもの


![image.png](https://qiita-image-store.s3.amazonaws.com/0/315063/fd3d9184-fd9f-f8dc-b01c-08ce13cba5d0.png)




#訓練データ、テストデータ
```python
X_train, X_test, y_train, y_test = train_test_split(X, data_y, test_size=0.2, random_state=0)
```
```python
print('X_train : ', X_train.shape)
print('X_test : ', X_test.shape)
print('y_train : ', y_train.shape)
print('y_test : ', y_test.shape)
```
>X_train :  (2400, 300)
X_test :  (600, 300)
y_train :  (2400, 3)
y_test :  (600, 3)

#モデル

既にデータをベクトル化しているのでembedding層などは使わない

```python
model = Sequential()
model.add(Dense(32, input_dim=EMBEDDING_DIM, activation="relu"))
model.add(Dropout(0.3))
model.add(Dense(3, activation="softmax"))

model.compile(optimizer="adam", loss="categorical_crossentropy",
              metrics=["accuracy"])

model.summary()
```
>Total params: 9,731
Trainable params: 9,731
Non-trainable params: 0

#学習
```python
history = model.fit(X_train, y_train, batch_size=20,
                    epochs=5,
                    validation_data=(X_test, y_test))
```
```python

Train on 2400 samples, validate on 600 samples
Epoch 1/5
2400/2400 [==============================] - 1s 298us/step - loss: 0.7688 - acc: 0.6912 - val_loss: 0.4164 - val_acc: 0.8550
Epoch 2/5
2400/2400 [==============================] - 0s 112us/step - loss: 0.4470 - acc: 0.8371 - val_loss: 0.3727 - val_acc: 0.8750
Epoch 3/5
2400/2400 [==============================] - 0s 111us/step - loss: 0.3728 - acc: 0.8608 - val_loss: 0.3607 - val_acc: 0.8800
Epoch 4/5
2400/2400 [==============================] - 0s 122us/step - loss: 0.3187 - acc: 0.8812 - val_loss: 0.3511 - val_acc: 0.8900
Epoch 5/5
2400/2400 [==============================] - 0s 109us/step - loss: 0.2900 - acc: 0.8925 - val_loss: 0.3435 - val_acc: 0.8850
```


<b>val_loss: 0.3435 - val_acc: 0.8850</b>

（参考）
ランダム値で初期化　　－－－　　val_loss: 0.3778 - val_acc: 0.8733
GloVeをファインチューニング　　－－－　　val_loss: 0.2497 - val_acc: 0.9217