機械学習
NLP
python3
Kaggle

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)
Kaggleのデータからbag of wordsを作ってみた(3/3)

環境

  • Python 3.6.0 :: Anaconda custom (x86_64)

- Mac OS X 10.12.5

この章で行うこと

bag of wordsの作成

前回クリーニングしたテキストデータを単語単位にします。

words = lower_case.split()               
print(words)

こんな感じです。
スクリーンショット 2017-07-12 10.23.45.png

ストップワードの削除

ストップワードとは

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

パッケージのインストール

これで使えるようになります。

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

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

import nltk
nltk.download('stopwords')

試しにstopwordsを見てみましょう。

stopwords.words("english")

スクリーンショット 2017-07-12 10.38.37.png

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

words = [w for w in words if not w in stopwords.words("english")]
print (words)

スクリーンショット 2017-07-12 10.40.43.png

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

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 ))   

これで確認します。

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

スクリーンショット 2017-07-17 18.31.08.png

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

num_reviews = train["review"].size
num_reviews

これで全てのレビューをクリーニングします。

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

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

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は上で処理をしたレビューデータ)

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

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

vocab = vectorizer.get_feature_names()
print (vocab)

スクリーンショット 2017-07-29 19.04.44.png

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

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

参考文献

Part 1: For Beginners - Bag of Words