#初めに
この記事は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)
#ストップワードの削除
##ストップワードとは
ざっくり言うと、あまりにも使われる単語のため、テキストデータを扱う時によく除去される言葉です。
「a」「the」「an」とかがイメージしやすいと思います。
このストップワードなどですが、自分で設定することもできますが、今回はパッケージを使います。
##パッケージのインストール
これで使えるようになります。
import nltk
nltk.download()
from nltk.corpus import stopwords
ファイルはダウンロードできたけどstopwordsのファイルがないと言われた人用
import nltk
nltk.download('stopwords')
試しにstopwordsを見てみましょう。
stopwords.words("english")
それでは、文章からストップワードを除去します。
words = [w for w in words if not w in stopwords.words("english")]
print (words)
これまでの作業を関数にします。
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)
次にレビューのデータ数を確認します。
ここで、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] ) )
次に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)
最後にcsvとして保存します。
df = pd.DataFrame(train_data_features)
df.columns = vocab
df.to_csv("train_bag_of_words.csv")