はじめに
前回に引き続き、deeplearning4jのdoc2vecをいじってみます。今回は日本語wikipediaで作ったword2vecモデルをdoc2vecの事前情報として使います。
関連情報
- deeplearning4jで日本語WikipediaのWord2Vecを作る
- deeplearning4jのword2vecの限界とその上手な使い方
- deeplearning4jのdoc2vecで極性判定してみた
実装
プログラムは以下です。
WordVectors wvec = WordVectorSerializer.loadTxtVectors(new File("word2vec.model"));
ClassPathResource resource = new ClassPathResource("paravec/train");
LabelAwareIterator iter = new FileLabelAwareIterator.Builder()
.addSourceFolder(resource.getFile())
.build();
TokenizerFactory t = new DefaultTokenizerFactory();
t.setTokenPreProcessor(new CommonPreprocessor());
System.out.println( "Build model..." );
int batchSize = 1000;
int layerSize = 200;
ParagraphVectors vec = new ParagraphVectors.Builder()
.useExistingWordVectors(wvec)
//.resetModel(false)
.batchSize(batchSize)
.epochs(20)
.trainWordVectors(true)
.minWordFrequency(1)
//.useAdaGrad(false)
.layerSize(layerSize)
//.iterations(iterations)
.seed(7485)
//.windowSize(5)
.learningRate(0.025)
.minLearningRate(1e-3)
//.sampling(1e-3)
//.negativeSample(5)
.iterate(iter)
.tokenizerFactory(t)
.workers(6)
//.labelsSource(new LabelsSource(Arrays.asList("negative", "neutral","positive")))
//.stopWords(new ArrayList<String>())
.build();
vec.fit();
WordVectorSerializer.writeParagraphVectors(vec, "doc2vec.w2v.model");
以前作ったword2vecのモデルを使います。そのときはlayerSizeを200に指定したので、ここでも間違いなく指定します。指定しないとエラーになります。その他のパラメータは好きなようにしてください。 さて、肝心の精度ですが・・・62%!まだ低い!!! Wikipediaで作ったWord2Vecモデルを使っているので、OOVはほぼなくなりました。ただ、全体的にスコアの絶対値が小さくなってしまいました。word2vecモデルはgoogle謹製のプログラムで作成しているのですが、ベクトルの正規化が入っているのかも?このあたりは確認しないといけないですね。
おわりに
外部で作ったword2vecモデルをdoc2vec学習時に注入してみました。OOVは減りましたが、精度はまだまだ低いです。二値の極性判定であれば精度は90%を超えていて欲しいです。もう少し改善してみます。