KotolinとDeeplearning4jで日本語解析入門

概要

KotolinとDeeplearning4jで日本語を解析し、カテゴライズ化する。

やりたいこと

文章で書かれたデータはそのままでは分析に利用しづらい。
その為、文章から様々な属性を抽出してカテゴライズする。

処理結果

データ総数: 5,506件
トレーニング:80%
テスト:20%

20未満、20代、30代、40代、50代、60以上で分類

精度31%

プログラム

形態素解析

構文解析にkuromojiを利用する。

    val tokenizer = Tokenizer()
    val wordSequenceMap = hashMapOf<String, Int>()
    var sequence = 0
    val wordX = csvX.map { x ->
        tokenizer.tokenize(x).map { info ->
            val word = info.getSurface()
            if (!wordSequenceMap.contains(word))
                wordSequenceMap.put(word, sequence++)
            word
        }
    }
    val sequencesX = wordX.map { x -> x.map { word -> wordSequenceMap.getOrDefault(word, 0).toFloat() } }
    val fillZeroX = sequencesX.map { x -> x + Collections.nCopies(maxWordNum - x.size, 0.0f) }

LSTM

簡略化のため、LSTM一層で構成されたモデルを作成

    val conf = NeuralNetConfiguration.Builder()
            .seed(seed)
            .iterations(iterations)
            .optimizationAlgo(OptimizationAlgorithm.STOCHASTIC_GRADIENT_DESCENT)
            .list()
            .layer(0, GravesLSTM.Builder()
                    .nIn(maxWordNum)
                    .nOut(lstmLayerSize)
                    .activation(Activation.TANH)
                    .build())
            .layer(1, RnnOutputLayer.Builder(LossFunctions.LossFunction.MCXENT)
                    .nIn(lstmLayerSize)
                    .nOut(outputNum)
                    .weightInit(WeightInit.XAVIER)
                    .activation(Activation.SOFTMAX)
                    .updater(Updater.RMSPROP)
                    .build())
            .backprop(true).pretrain(false).build()

    val model: MultiLayerNetwork = MultiLayerNetwork(conf)
    model.init()
    model.setListeners(Arrays.asList(ScoreIterationListener(listenerFreq) as IterationListener))

ソースコード

github.com

資料

どこでもKotlinで発表した際の資料

speakerdeck.com