Kaggleのデータからbag of wordsを作ってみた(2/3)

#初めに
この記事はKaggleのデータ「Bag of Words Meets Bags of Popcorn」のデータでbag of wordsを作り、Random Forestで予測するまでを説明する初心者向けの記事です。
英語記事でいいものを見つけたので、英語が苦手な方向けに和訳+初心者向けに補足したものになっております。
また、投稿自体が初めてのなのでアドバイスをいただければ幸いです。
[Kaggleのデータからbag of wordsを作ってみた(1/3)](http://qiita.com/nanay/items/7421bb0f4414fdee5e8c)
[Kaggleのデータからbag of wordsを作ってみた(3/3)](http://qiita.com/nanay/items/752896e47f0817adbaa3)
#環境
- Python 3.6.0 :: Anaconda custom (x86_64)
- Mac OS X 10.12.5
- 

#この章で行うこと



#bag of wordsの作成
前回クリーニングしたテキストデータを単語単位にします。

```Python
words = lower_case.split()               
print(words)
```
こんな感じです。
![スクリーンショット 2017-07-12 10.23.45.png](https://qiita-image-store.s3.amazonaws.com/0/187028/bf98238e-e555-0920-de8a-0f21a64adae4.png)

#ストップワードの削除
##ストップワードとは
ざっくり言うと、あまりにも使われる単語のため、テキストデータを扱う時によく除去される言葉です。
「a」「the」「an」とかがイメージしやすいと思います。
このストップワードなどですが、自分で設定することもできますが、今回はパッケージを使います。
##パッケージのインストール
これで使えるようになります。

```Python
import nltk
nltk.download()  
from nltk.corpus import stopwords
```

ファイルはダウンロードできたけどstopwordsのファイルがないと言われた人用

```Python
import nltk
nltk.download('stopwords')
```
試しにstopwordsを見てみましょう。

```Python
stopwords.words("english")
```

![スクリーンショット 2017-07-12 10.38.37.png](https://qiita-image-store.s3.amazonaws.com/0/187028/f312c8a9-d357-1343-1c2a-ca0bb04d1030.png)

それでは、文章からストップワードを除去します。

```Python
words = [w for w in words if not w in stopwords.words("english")]
print (words)
```
![スクリーンショット 2017-07-12 10.40.43.png](https://qiita-image-store.s3.amazonaws.com/0/187028/69ccf2c5-a19d-05bd-c021-4bfe67c068a0.png)

これまでの作業を関数にします。

```Python
def review_to_words( raw_review ):
    # 1. HTMLのタグ消し
    review_text = BeautifulSoup(raw_review).get_text() 
    #
    # 2. 文字以外(?,!等)の除去       
    letters_only = re.sub("[^a-zA-Z]", " ", review_text) 
    #
    # 3. 全ての文字を小文字に変更
    words = letters_only.lower().split()                             
    #
    # 4. ストップワードのリスト作成
    stops = set(stopwords.words("english"))                  
    # 
    # 5. ストップワードの除去
    meaningful_words = [w for w in words if not w in stops]   
    #
    # 6.　文にして結果を返す
    return( " ".join( meaningful_words ))   
```
これで確認します。

```Python
clean_review = review_to_words( train["review"][0] )
print(clean_review)  
```

![スクリーンショット 2017-07-17 18.31.08.png](https://qiita-image-store.s3.amazonaws.com/0/187028/57ac0397-110e-1cc7-d6b6-b651050a98cd.png)

次にレビューのデータ数を確認します。
ここで、25000個のレビューがあることが確認できます。

```Python
num_reviews = train["review"].size
num_reviews
```
これで全てのレビューをクリーニングします。

```Python
clean_train_reviews = []　#初期化
for i in range( 0, num_reviews ):
    clean_train_reviews.append( review_to_words( train["review"][i] ) )
```

こんな感じになっています。
![スクリーンショット 2017-07-17 18.36.34.png](https://qiita-image-store.s3.amazonaws.com/0/187028/69392b6b-844f-6acb-c381-273d1931b6e2.png)


次にscikit-learnを使って、bag of wordsを作ります。

```Python
print ("Creating the bag of words...\n")
from sklearn.feature_extraction.text import CountVectorizer
# 初期化
vectorizer = CountVectorizer(analyzer = "word",   \
                             tokenizer = None,    \
                             preprocessor = None, \
                             stop_words = None,   \
                             max_features = 5000)  #ここで特徴量の数を5000に設定
```

次に特徴量ベクトルを作成します。(clean_train_reviewsは上で処理をしたレビューデータ)

```Python
train_data_features = vectorizer.fit_transform(clean_train_reviews)
#ここで、250000X5000のデータセットが準備できたことが確認できます。
print (train_data_features.shape)
```

これでどの単語が特徴量として選ばれたのか確認することができます。

```Python
vocab = vectorizer.get_feature_names()
print (vocab)
```
![スクリーンショット 2017-07-29 19.04.44.png](https://qiita-image-store.s3.amazonaws.com/0/187028/96d6851c-2b09-76d7-5db1-331d3a2a5335.png)

最後にcsvとして保存します。

```Python
df = pd.DataFrame(train_data_features) 
df.columns = vocab
df.to_csv("train_bag_of_words.csv")
```

#参考文献
[Part 1: For Beginners - Bag of Words](https://www.kaggle.com/c/word2vec-nlp-tutorial/details/part-1-for-beginners-bag-of-words)