今日も窓辺でプログラム

外資系企業勤めのエンジニアが勉強した内容をまとめておくブログ

Scala + SparkでDatasetを使ってTFIDFを計算する

はじめに

前回の記事ではSparkをローカルで試せる環境を用意しました。

Windows Subsystem for Linux(WSL)でSpark環境を構築してみる - 今日も窓辺でプログラム

今回は日本語のテキストファイルに含まれる単語数をカウントする処理をSpark上で行ってみたいと思います。 SparkもScalaもGradleも初めてなので、もしかしたら怪しいことを言っている箇所もあるかもしれません。。

環境は前回に引き続き、Windows Subsystem for Linux上のUbuntu 16.04で行っています。

続きを読む

Windows Subsystem for Linux(WSL)でSpark環境を構築してみる

Sparkで走らせるプログラムの開発のため、WindowsのローカルでSparkを走る環境を用意したかったので作業内容をメモしておきます。

環境

  • Windows 10 Version 1803
  • WSLでUbuntu 16.04をインストール

以下手順に出てくるコマンドはWSLで走らせたbashに入力したものとなります。

インストール

まずはJavaをインストールします。

sudo apt-get install openjdk-8-jre

Apache Sparkの公式サイトからビルド済みのSparkをダウンロードしてきて解凍 し、適当な場所に置きます。

wget http://ftp.meisei-u.ac.jp/mirror/apache/dist/spark/spark-2.3.1/spark-2.3.1-bin-hadoop2.7.tgz
tar xvf spark-2.3.1-bin-hadoop2.7.tgz
mkdir /etc/spark
mv spark-2.3.1-bin-hadoop2.7/ /etc/spark

.bashrcに下記を追加して完了です。

# Spark
export SPARK_HOME=/etc/spark/spark-2.3.1-bin-hadoop2.7
export PATH=$PATH:$SPARK_HOME/bin

spark-shellやspark-submitが正しく使えることが確認できました。

関連記事

用意した環境でTFIDFの計算をしてみました
Scala + SparkでDatasetを使ってTFIDFを計算する - 今日も窓辺でプログラム

Tensor2Tensorを使って独自データでseq2seqしてみる

はじめに

Tensor2Tensorという、広く使われているモデルやデータセットが実装されているディープラーニングのライブラリがあります。
GitHubのREADMEによると、Tensor2TensorはGoogle Brainチームなどによって開発されているようで、中身はTensorFlowで実装されています。

用意されているモデルとデータセットを使うだけなら、コーディングなしでディープラーニングを試すことができます。
モデルやデータセットの追加も容易に行えるようになっていて感動したのですが日本語の記事はあまり見当たらなかったので、せっかくなので今回試した「自分で用意したデータでseq2seqを学習させる」ための使い方を紹介しようと思います。

環境はUbuntu 16.04のでGPUを使用した学習を行いました。

続きを読む

SentencePieceを使用してRNN言語モデルを学習させてみる

はじめに

前回の記事ではpytorchのサンプルコードを参考にし、Wikipediaの記事の一部に対してRNN言語モデルを学習させてみました。
RNN言語モデルのpytorch実装をWikipediaの記事で学習させてみる - 今日も窓辺でプログラム

その際にWikipediaの記事を単語に分割するための技術として、MeCab + neologd辞書を使用していました。
Wikipediaの日本語記事を全行を、分かち書きしてforループで回す - 今日も窓辺でプログラム

最近出てきた文章を単語分割する手法に、wordpiecesと呼ばれている技術があります。その実装であるSentencePieceがGoogleから公開されています。
技術的な解説などは、SentencePieceの開発者の方(MeCabの開発者でもあります)が公開しているQiitaの記事で詳しく説明されているので、ぜひ読んでみてください。
Sentencepiece : ニューラル言語処理向けトークナイザ - Qiita

SentencePieceを使用すると、少し長い文字列でも出現頻度が高ければ1つの単語IDが割り当てられるようです。逆に、人間から見ると一つの単語でも、その単語の出現頻度が低い場合は単語をさらに分割した小さい単位に対して単語IDを割り当てていきます。

この記事では、前回学習したRNN言語モデルの単語分割部分をMeCabからSentencePieceに置き換えるとどのような結果になるか試してみたいと思います。

続きを読む