Apitore blog

Apitoreを運営していた元起業家のブログ

deeplearning4jのdoc2vecにwikipediaのword2vecモデルを注入する

はじめに

前回に引き続き、deeplearning4jのdoc2vecをいじってみます。今回は日本語wikipediaで作ったword2vecモデルをdoc2vecの事前情報として使います。 amarec (20161015-214845)

関連情報

実装

プログラムは以下です。

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%を超えていて欲しいです。もう少し改善してみます。