2日前くらい前から行っているkaggleのチュートリアルの続きです。
Bag of Words Meets Bags of Popcorn | Kaggle
とりあえず提示されているコードを見ていきたいと思います。
列の名前を見る
DataFrameの列の名前を見れるですね。
train.columns.values
実行結果。
array(['id', 'sentiment', 'review'], dtype=object)
保存されている中身を見る
数値で指定してあげれば、保存されている中身を見ることができるんですね。
train['review'][0]
実行結果。
'"With all this stuff going down at the moment with MJ i\'ve started listening to his music, watching the odd documentary here and there, watched The Wiz and watched Moonwalker again. Maybe i just want to get a certain insight into this guy who bad m\'kay.<br /><br /> (以下、省略)
思ったよりも長いレビューが入っていました。
HTMLタグの消し方
レビュー中にbr /というHTMLタグがが入っていますが、Beautifull Soupで消すんですね。なるほど、スクレイピングだけでなくBeautifull Soupをこんな風に使えば良いんですね。
from bs4 import BeautifulSoup example1 = BeautifulSoup(train["review"][0]) print(train["review"][0]) print(example1.get_text())
実行結果。
'"With all this stuff going down at the moment with MJ i\'ve started listening to his music, watching the odd documentary here and there, watched The Wiz and watched Moonwalker again. Maybe i just want to get a certain insight into this guy who bad m\'kay.<br /><br /> (以下、省略)
ストップワード
分析する時に対象から外す単語をストップワードというらしいです。nltkというパッケージに入っているらしいです。 まずはnltkのインストールから。
import nltk
nltk.download()
こんな画面が出てきました。 よくわからないのでallをダウンロードします(おそらくallですと重い)
登録されているストップワードを見てみます。
from nltk.corpus import stopwords print(stopwords.words("english"))
実行結果。
['i', 'me', 'my', 'myself', 'we', 'our', 'ours', 'ourselves', 'you', "you're", "you've", "you'll", "you'd", 'your', 'yours', 'yourself', 'yourselves', 'he’,(以下、略)
これらの単語は除外されるみたいです。len関数で計ってみたら、179単語あるらしいです。
まさか日本語はないですよね。
print(stopwords.words("Japanese"))
['あそこ', 'あたり', 'あちら', 'あっち', 'あと', 'あな', 'あなた', 'あれ', 'いくつ', 'いつ', 'いま', 'いや', 'いろいろ', 'うち', 'おおまか', 'おまえ', 'おれ', 'がい', 'かく', 'かたち', 'かやの', 'から', 'がら', 'きた', 'くせ', 'ここ', 'こっち', 'こと', 'ごと', 'こちら', 'ごっちゃ', 'これ', 'これら', 'ごろ', 'さまざま', 'さらい', 'さん', 'しかた', 'しよう', 'すか', 'ずつ', 'すね', 'すべて', 'ぜんぶ', 'そう', 'そこ', 'そちら', 'そっち', 'そで', 'それ', 'それぞれ' (以下、省略)
なんと日本語もありました。 これを利用すればよかったんですね。今更感。
関数でまとめる
これらの処理は何度も使うので関数としてまとめるそうです。
import re def review_to_words( raw_review ): review_text = BeautifulSoup(raw_review).get_text() letters_only = re.sub("[^a-zA-Z]", " ", review_text) words = letters_only.lower().split() stops = set(stopwords.words("english")) meaningful_words = [w for w in words if not w in stops] return( " ".join( meaningful_words ))
実行結果はこんな感じ。
'stuff going moment mj started listening music watching odd documentary watched wiz watched moonwalker maybe want get certain insight guy thought really cool eighties maybe make mind whether guilty innocent moonwalker part biography part feature film remember going see cinema originally released subtle messages mj feeling towards press also obvious message drugs bad kay visually impressive course michael jackson unless remotely like mj anyway going hate find boring may call mj egotist consenting making movie mj (以下、省略)
それで、この関数をレビューの数だけfor文で回せば良いそうです。今まで、この手の処理をどう書けば良いのか悩んでいたのですが、関数を回せばよかったんですね。
clean_train_reviews = [] num_reviews = train["review"].size for i in train["review"](0, num_reviews): clean_train_reviews.append( review_to_words( train["review"][i] ) )
TypeError Traceback (most recent call last) TypeError: 'tuple' object is not callable
エラー。どうやら、Python3系ではfor文で使えたxrangeがなくなって、rangeに統合されたらしいです。ここを修正して再実行。
num_reviews = train["review"].size clean_train_reviews = [] for i in range(0, num_reviews): clean_train_reviews.append( review_to_words( train["review"][i] ) ) print(clean_train_reviews)
実行結果。
['stuff going moment mj started listening music watching odd documentary watched wiz watched moonwalker maybe want get certain insight guy thought really cool eighties maybe make mind whether guilty innocent moonwalker part biography part feature film remember going see cinema originally released subtle(以下、省略)
これでいろいろ分析できる形になったらしいです。正直、関数の大切さがわかっていなかったのですが、やっぱりチュートリアルをすると勉強になりますね。
今日の結果
今日のAKBメンバーによる呟きは56件でした。 今日から握手会が始まるそうですね。なかなかわかりやすい画像ができました。
'嬉しい': 9, '楽しい': 5, 'すごい': 3, '面白い': 2, 'よい': 2, '悪い': 2, '良い': 2, '新しい': 2, 'いい': 2, 'うれしい': 1, '怖い': 1, '可愛い': 1, '凄い': 1, 'かっこよい': 1, 'うまい': 1, 'やすい': 1, '多い': 1, '難しい': 1}) 'センチメンタルトレイン': 16, '方': 16, 'アクシュカイ': 14, '皆さん': 12, '今日': 11, '嬉しい': 9, '受付': 9, 'ちゃん': 9, '申し込み': 7, '日': 7, '公演': 7, 'シングル': 6, 'たくさん': 6, '人': 6, 'エーケービーフォーティーエイト': 6, '個別': 6, 'する': 36, 'くださる': 23, '来る': 17, 'センチメンタルトレイン': 16, '方': 16, 'アクシュカイ': 14, '始まる': 13, '皆さん': 12, '今日': 11, 'いる': 10, '嬉しい': 9, '受付': 9, 'ちゃん': 9, '会う': 9, 'なる': 8, '申し込み': 7, '日': 7, '公演': 7, 'みる': 7, 'くれる': 7,