概要
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))
ソースコード
資料
どこでもKotlinで発表した際の資料