毎日テキストマイニング

180日間、毎日テキストマイニングをするブログです

2018/8/9【47日目】関数の大切さが今さらわかった

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ですと重い) f:id:rimt:20180810141229p:plain

登録されているストップワードを見てみます。

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件でした。 今日から握手会が始まるそうですね。なかなかわかりやすい画像ができました。 f:id:rimt:20180810141605p:plain

'嬉しい': 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,