NLPはじめに前回の記事ではSparkをローカルで試せる環境を用意しました。今日も窓辺でプログラム今回は日本語のテキストファイルに含まれる単語数をカウントする処理をSpark上で行ってみたいと思います。SparkもScalaもGradleも初めてなので、もしかしたら怪しいことを言っている箇所もあるかもしれません。16.04で行っています。Datasetにテキストファイルを読み込む単語分割TFIDFの計算ソースコード事前準備ScalaとGradleのインストールSparkはPython等もサポートしていますが、Scalaで書かれているそうなのでScalaを使ってみようと思います。下記コマンドでScalaとGradleというビルドツールをインストールしました。gradleadd-apt-repositoryをしないと、古いバージョンのGradleしかインストールされないので注意が必要です。最新のgradleをインストールするGradleでビルド環境用意まずはGradleでビルドできる環境を用意してしまいます。initというコマンドを実行すると、自動でビルド定義やシェルスクリプトなどのファイルが生成されます。生成されたbuild.gradleを以下のように変更します。いうクラスがメインクラスあたりが主な設定内容です。単語数を数える対象となるテキストファイルをいくつか用意します。今回は勉強のためなのでデータは何でもよかったので、青空文庫のデータを使用することにしました。ファイルを解凍した直後はShift-JISでエンコードされていたので、UTF8への変換も行いました。GitHubでルビのないテキスト検索に使用したクエリはこちら↓https://github.com/aozorabunko/aozorabunko/search?q=filename%3A*.zip+-filename%3Aruby単語カウントとTFIDFの計算ではさっそくWordCountというクラスを実装してしまいます。Sparkの公式サイトにTFIDFを計算するためのサンプルが載っているので、これをもとに実装してみます。サンプルは英語なのでスペースで文字列を区切っていますが、日本語だとそうはいきません。Kuromojiを使って単語分割する関数を用意しておきます。引数には1つのドキュメントが文字列として入ってくる想定で、戻り値はList[String]としておきます。}Datasetにテキストファイルを読み込むSparkSessionのread.textFileを使ってディレクトリを指定すると、そのディレクトリにあるテキストファイルをすべて読み込んでくれます。デフォルトのオプションだとテキストファイルの1行がDatasetの1行に対応する形になるのですが、下記のようにwholetextオプションにtrueを指定するとテキストファイル1つがDatasetの1行に対応するので、TFIDFを計算する上では都合がいいように思います。idカラムはあると後々の処理に便利だったので一応つけておきました。monotonically_increasing_id).cacheこの時点で、textにはidとvalueという2つのカラムがあり、列の数はテキストファイルの個数分のDatasetが入っていることになります。事前に定義しておいたtokenize関数をDatasetの各行に適用していきます。単純にmapするだけです。spark.implicits._です。Datastoreに値を格納するには、型にあったエンコーダを定義しておく必要があるようで、プリミティブ型については上記importを書いておくと用意されているエンコーダが参照できるようになるみたいです。TFIDFの計算ここまでこればあとはサンプル通りにコードを書けばOKです。HashingTFとIDFというモジュールを使います。入っている状態になりました。試しに中を見てみると、このような形になっていました。(手元では2つのテキストファイルでテストしたので、行の数は2個になっています。0|(262144,[152,386,...||8589934592|(262144,[1,83,581...|+----------+--------------------+showだとSparseVectorが途切れていますが、中をちゃんと見るコードを書いてみるとしっかり値が入っていることも確認できます。文書間の類似度の計算等を行いたい場合は、このSparseVectorをもとに計算をすることになると思うのですが、TFIDF自体は計算できたので今回はいったんここで区切りたいと思います。ソースコード今回使用したソースコードはGitHubにあげてあります。https://github.com/kanoh-k/blog/tree/17c4a0f11b82e2f277b4a3e45d7d23107df2bc8bScalaのコードは↓https://github.com/kanoh-k/blog/blob/17c4a0f11b82e2f277b4a3e45d7d23107df2bc8b/spark/src/main/scala/WordCount.scalabuild.gradleは↓になります。アーカイブおすすめの本はてなブログをはじめよう!kanohkさんは、はてなブログを使っています。ブログを報告するスターをつけました引用をストックしましたストック一覧を見る閉じる引用するにはまずログインしてくださいログイン閉じる引用をストックできませんでした。再度お試しください閉じる限定公開記事のため引用できません。