機械学習をするためには、大量のデータが必要となります。
企業のデータ分析部門であれば、大量データの取得には困らないでしょう。
しかし、個人であればそうはいきません。
確かに、公開されている大量データも存在します。
ただ、大抵は外国産(英語)の場合が多いです。
そうであっても、数値データであればそれほど困ることはありません。
しかし、テキストデータを扱う場合には、外国産だと困ります。
日本人であるなら、やはり日本語で機械学習を行いたいからです。
では、どうするのか?
答えは一つだけです。
そう、スクレイピングです。
本記事の内容
- 日本語テキストの大量データを集める
- スクレイピングしたデータは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段階は終了ということになります。
できる限りで、データをキレイにしていきたいですね。