はじめに
日本語WikipediaのWord2VecをWebAPIで公開するためにアレコレ準備してます。今回は公開までに至ったトラブルとその解決策をご紹介します。
関連記事
上記の記事に従えば、最短で8~10時間くらいで私の作ったWord2Vecと同じものを用意できると思います。Web APIという形ではなくシステムに組み込みたい人は参考にしてください。
UnsatisfiedLinkError: no nd4j in java.library.path
私は普段Windows10で開発をしていますが、公開するサーバーはGoogle Cloud PlatformでUbuntuを使っています。Windows10でコンパイルしたjarファイルがLinux上では以下のエラーが出て動きませんでした。
UnsatisfiedLinkError: no nd4j in java.library.path
よくよくエラーログを見てみると、どうやらライブラリが足りないようです。Mavenで実装しているのでおかしいなと思っていたら、どうやらnd4jのライブラリはWindowsとLinuxとで違うみたいです。pomファイルを以下のように変更したら動くようになりました。
<dependency>
<groupId>org.nd4j</groupId>
<artifactId>nd4j-native</artifactId>
<version>0.5.0</version>
</dependency>
<dependency>
<groupId>org.nd4j</groupId>
<artifactId>nd4j-native</artifactId>
<version>0.5.0</version>
<classifier>linux-x86_64</classifier>
</dependency>
文字化け
Linux上で実行しているAPIの動作確認をしたところ、Windows環境と結果が異なりました。というか文字化けしていました。これはモデルの読み込みが失敗していることが原因でした。プログラム上、モデルはInputStreamで読み込んでいるのですが、読み込みの文字コードはOSのロケールを使います。GCPのUbuntuのデフォルトはen.UTF8だったので、ロケールをja_JP.UTF8に変更しました。変更後にプログラムを再起動したところ、ちゃんと文字化けが解決してWindows環境と結果が同じになりました。Ubuntuの場合だと、以下のコマンドを実行すればロケールを変更できます。
$ sudo apt-get install language-pack-ja
$ sudo update-locale LANG=ja_JP.UTF-8
おわりに
解決してみるとなんてことはないのですが、意外とハマりました。特にdeeplearning4jを使ったという記事がまだ日英ともに少ないので、情報検索も四苦八苦しました。参考になれば。