スクレイピングで大量に集めたAmazonレビューのクレンジング【Python】

スクレイピングで大量に集めたAmazonレビューのクレンジング【Python】 データ分析

機械学習をするためには、大量のデータが必要となります。
企業のデータ分析部門であれば、大量データの取得には困らないでしょう。

しかし、個人であればそうはいきません。
確かに、公開されている大量データも存在します。

ただ、大抵は外国産(英語)の場合が多いです。
そうであっても、数値データであればそれほど困ることはありません。

しかし、テキストデータを扱う場合には、外国産だと困ります。
日本人であるなら、やはり日本語で機械学習を行いたいからです。

では、どうするのか?
答えは一つだけです。
そう、スクレイピングです。

  • 日本語テキストの大量データを集める
  • スクレイピングしたデータはMongoDBに蓄積する
  • スクレイピングでは重複データがありえる
  • 【データクレンジング】重複データの確認
  • 【データクレンジング】重複データの削除

それでは、上記に沿って説明していきます。

日本語テキストの大量データを集める

単純に日本語テキストを集めるだけなら、それほど困りません。
それでも、スクレイピングのスキルは必要ですけどね。

個人的には、次の3つが機械学習で必要とするテキストの条件です。

  • 日本語
  • ラベリング済み
  • 大量(あればあるほど良い)

この「ラベリング済み」というのが、ポイントと言えるでしょう。
ラベリングは、評価付けと言えます。

上記条件に合致するのは、レビューになります。
実際、レビューのデータセットは需要がありますからね。

でも、日本語ではなかなかありません。
そこで、スクレイピングの登場です。

実際、過去にAmaznoのレビューをスクレイピングで取得しています。

そして、収集した日本語テキストをもとに感情分析を実施しています。

ただ、このときは約9,000件のレビューでした。
また、レビューのカテゴリー(対象商品)も偏っていました。

そこで、さらにデータを様々なカテゴリーから収集しようと考えました。
もちろん、データの数もです。

ということで、1週間以上かけてチマチマとデータを集めました。
なんと、その数は3,500,704件です。

これだけあれば、十分でしょう。
これをもとに学習させれば、質の高いモデルを構築できるはずです。

スクレイピングしたデータはMongoDBに蓄積する

結果的に350万件以上のデータとなりました。
もし、これをCSVにしていたらトラブルが生じていた可能性は高いです。

追記(1行毎)形式でなければ、ほぼ確実のメモリがあふれていたでしょう。
そうじゃなくても、350万行のCSVなんてヤバイです。
まず、エクセルでは開けないでしょう。

そのようなこともあり、私はスクレイピングしたデータはMongoDBに放り込んでいます。
json形式で気楽にガンガンと登録できます。

また、MongoDBはカラムに複合キーを張ることが可能です。
これにユニーク制約も付ければ、重複データを防ぐことも可能となります。
プログラムで防ぐよりも、データベースで防いだ方が確実です。

スクレイピングでは重複データがありえる

MongoDBに3,500,704件という大量のデータを登録できました。
しかし、これらをそのまま利用することはできません。

なぜなら、データが汚れている可能性があるからです。
そのため、データクレンジングというデータをキレイにする作業が必要となります。

データクレンジングとは、データベースなどに保存されているデータの中から、重複や誤記、表記の揺れなどを探し出し、削除や修正、正規化などを行ってデータの品質を高めること。

そして、今回は実際にデータが汚れてしまいました。
MongoDBにユニーク制約を付けたけど、その想定が甘かったのです。

スクレイピングでは、よくあることです。
想定外の形式でデータが入っている場合は、余裕であり得ます。

気づいたときは、すでに時遅しです。
バッチでスクレイピングのプログラムは走り出していますからね。

以下では、このような重複データの確認・削除方法について解説します。

【データクレンジング】重複データの確認

件数が少なければ、エクセルでというもありでしょう。
しかし、機械学習を行う場合にエクセルは現実的ではありません。

データベース上でクエリを発行するという手もあります。
今回は、MongoDBに登録していることもあるので。

ただ、私はデータベースでは確認作業を行いません。
理由は、クエリだと拡張性がありません。

その代わりに、Pythonのプログラム上で重複データの確認を行います。
プログラムでやった方が拡張性はあります。
それに、圧倒的にこちらの方が楽チンです。

重複データ確認用のコードは以下。

import pandas as pd
from pymongo import MongoClient

if __name__ == "__main__":
    # MogoDB
    client = MongoClient("localhost",27017)
    db = client.データベース名
    collection = db.コレクション名
    
    result = collection.find({})
    df = pd.DataFrame(result)
    
    # _idは除外
    df = df.drop(columns='_id')
    print(df.duplicated().value_counts())

このコードの結果は、以下。

False    3443081
True       57623
dtype: int64

簡単にコードの説明をしておきます。
MongoDBから取得した全レビューデータ(3,500,704件)をデータフレームに変換します。

そして、常に一意になる「_id」を除外。
あとは、おまじないのように覚えてください。

これだけで重複データの件数がわかるのです。
「True」である、57,623件が重複データということになります。

なお、「True」は重複した二つ目以降をカウントしています。
つまり、このTrueの分だけが無駄データと言えます。

【データクレンジング】重複データの削除

プログラムを見た方が、早いです。

import pandas as pd
from pymongo import MongoClient

if __name__ == "__main__":
    # MogoDB
    client = MongoClient("localhost",27017)
    db = client.データベース名
    collection = db.コレクション名
    
    result = collection.find({})
    df = pd.DataFrame(result)
    
    # _idは除外
    df = df.drop(columns='_id')
    
    df_clean = df.drop_duplicates()
    print(len(df_clean))

上記コードの実行結果は、以下。

3443081

df_cleanでは、57,623件が削除されていることを確認できます。
あとは、これをそのまま利用するもよし。
または、データベースにキレイにしたdf_cleanを登録するもよし。

以上、350万件を超える大量データから重複データの確認・削除を説明してきました。
とりあえずは、データクレンジングの第1段階は終了ということになります。

できる限りで、データをキレイにしていきたいですね。

タイトルとURLをコピーしました