データサイエンスチームのHan-Cheolです。2017の21日目の記事になります。はじめにPandasはPythonを利用したデータ分析で一番よく知られ、使われているツールです。生かしてデータの前処理に掛かる時間を大きく短縮させる方法を紹介します。(ここでは形容詞句)を抽出するデータマイニングタスクを想定します。このようなリソースは色んな場面で活用できます。同じジャンルのテキストを教師無し機械学習で分類する時に貴重な資源になります。いう前処理を行います。(ここではルールべス手法を利用)します。(例、高い・低い)に大きく影響を与えているのかを分析します。データ処理を高速化するには色んな手法がありますが、PySparkを使うと下記のようなメリットがあります。実験に使うデータセットをダウンロードします。(「口コミデータを活用したレコメンドシステムの可能性」)で使ったものと同じ、米アマゾンの商品口コミデータ(食品カテゴリー、約15万レビュー)です。ダウンロードしてない方は下記のようにwgetでダウンロードできます。notebookを利用します。下記のように必要なライブラリをインポートしましょう。インストールされてないライブラリがありましたらpipでインストールしてください。inline続けてデータを読み込みます。DataFrameのread_json()メソッドで簡単に読み込みできます。pd_raw[colname].astype(str)最終的に読み込まれたデータは下記のように9カラムで構成されたDataFrameになります。(基本バージョン)前処理では、データのreviewTextカラムに存在する口コミから形容詞句を抽出します。(実サービスでの利用を念頭において高性能ツールセットとして開発された自然言語処理ライブラリ)を使い、形容詞句の抽出のためには下記のAdjectivePhraseクラスを作りました。"""形容詞句抽出器を初期化。"""形容詞句の意味を反転するべきかを決定。形容詞句を構成する文字列を抽出する。"""tokenの文字列を正規化。"""形容詞句を抽出。phraseこのクラスを利用して口コミから形容詞句を抽出していきます。複数の自然言語処理タスクを含むこの前処理段階はとても重い作業であり、ご覧の通り実際の分析段階より多くの時間を費やしています。PySparkを利用した時と実行時間を比較するため処理時間を測定しましょう。先にspacyを実行するのに必要なモデルファイルをダウンロードします。英語の場合は下記の命令でダウンロードできます。そのほかの言語はhttps://spacy.io/usage/modelsを参照してください。en続けて前処理を行います。掛かった時間を測定する。seconds.約15万口コミを処理するのに70分ほどかかりました。CPUと24GBのメモリーを搭載しています。(PySparkバージョン)ここでは、前処理段階をPySparkを使って高速化してみたいと思います。下記のようにSparkSesssionを生成します。各パラメータ値は、お使いのHadoopクラスタの環境に合わせて調節してください。ここでは12個のexecutorプロセスを使います。(spark_udf_extract_adj_phrases)を定義します。このudfはPySparkで一般的に使われるmap()メソッドではなくmapPartitions()メソッド用になります。前者はデータ1個に対して関数を1回呼び出すためspacyのように初期化が重い処理をするには向いてないです。それにくらべ、パーティション単位で処理を行う後者はこのような問題を回避できます。partition単位で処理する。インストールする必要がある。DataFrameに戻します。evaluationを行うため、実際に処理が必要な段階(rdd_parsed.collect()部分)になってプロセスが動き始めます。seconds.データ変換に約1.6秒、そして形容詞句の抽出が約8分かかりました。処理時間が前回の4188秒と比べて、約80%短縮されたことが分かります。CPUを1個、16GBのメモリーを搭載しています。(adj_col)または2.2の結果(spark_adj_col)を元データと統合します。ここではspark_adj_colを使います。(overallが1または2の場合はlow、3または4の場合はhigh)カラムを持ちます。pd_review.set_index('index')最初に下記の関数を定義します。"""分析用データを作成。"""指定されたterm-scoreペアをdataframeで切り出す。'score'])続けて、各形容詞句がスコアが高い口コミまたは低い口コミからどれぐらい出現したのか、その比率はどれぐらいなのかを計算します。(高いスコアの口コミからよく出てくるほど高い)が高い形容詞句100個を見てみます。price”など、なかなか納得がいく表現が多く含まれていることがわかります。今回は、頻度の情報も含めて可視化してみたいと思います。頻度情報が分かれば高いスコアの口コミでもっと頻繁に出現する表現を探すことが可能です。そのため、先に下記の関数を定義します。plotでグラフを描く。c='black')ある形容詞句に対して高いスコアの口コミから出現した数をy軸に、低いスコアの口コミから出現した数をx軸にしてプロットしてみたものが下記のグラフです。100個だけを絞って見せてます。グラフ上で同じ場所に点が集まらないように位置情報には少しノイズを加えています。低スコアの口コミの出現比率が1.0であっても、出現頻度は結構違うことが分かります。delicious”よりは頻繁に出現することがわかります。一つの特徴としては、上位100の結果はそのすべてが割合1.0、つまりスコアが低い口コミからは1回も出てない表現でした。続けて、スコアが低い口コミにも同じ分析を行って見ます。tasteless”など、スコアが低い口コミによく出現する表現もよく納得がいくものです。下は頻度情報も含めて可視化してみた結果です。info)多くの表現が0.0~0.2ぐらいの比率を持っていて、x軸の近くによっていることが分かります。disgusting”などの表現が含まれていました。まとめ今回の記事では、PySparkを利用して処理時間が多く掛かるデータ分析の前処理を高速化する方法を調べてみました。他の手法と比べて、並列・分散処理をシームレスに連動させることが可能なのはスケーラビリティの面ではとても強い長所だと思います。(または悪い時)によく使われる表現を抽出する方法を見てみました。教師なし評判分析のための辞書構築に活用できるのではないかと思います。