FledglingRobin’s diary

Github: https://github.com/FledglingRobin

kuromoji.jsで形態素解析をする

slack botをもう少し賢くしたい。といかけに含まれる名詞に反応できるようにしたい。そこで、kuromoji.jsによる形態素解析をためしてみる。 github.com

$ node kuromoji_test.js 
文をどうぞ 明日は関ヶ原で憎きあの男を倒すの
[ '明日', '関ヶ原', '男' ]
[ '倒す' ]
[ '憎い' ]

さっそく使ってみた

var readline = require('readline');
var kuromoji = require("kuromoji");

kuromoji.builder({
    dicPath: "node_modules/kuromoji/dict"
}).build(function(err, tokenizer) {
    if (err) {
        throw err;
    }

    // 標準入力をうけつけるインターフェース
    var rl = readline.createInterface({
        input: process.stdin,
        output: process.stdout
    });

    // 入力をうけつけて解析する
    rl.question("文をどうぞ ", function(answer) {
        var result = tokenizer.tokenize(answer);
        console.log(result);
        rl.close();
    });
});

実際に動かしてみた。

$ node kuromoji_test.js 
文をどうぞ 今日はがんばったんだよ
[ { word_id: 126270,
    word_type: 'KNOWN',
    word_position: 1,
    surface_form: '今日',
    pos: '名詞',
    pos_detail_1: '副詞可能',
    pos_detail_2: '*',
    pos_detail_3: '*',
    conjugated_type: '*',
    conjugated_form: '*',
    basic_form: '今日',
    reading: 'キョウ',
    pronunciation: 'キョー' },
  { word_id: 93010,
    word_type: 'KNOWN',
    word_position: 3,
    surface_form: 'は',
    pos: '助詞',
    pos_detail_1: '係助詞',
    pos_detail_2: '*',
    pos_detail_3: '*',
    conjugated_type: '*',
    conjugated_form: '*',
    basic_form: 'は',
    reading: 'ハ',
    pronunciation: 'ワ' },
  { word_id: 3153770,
    word_type: 'KNOWN',
    word_position: 4,
    surface_form: 'がんばっ',
    pos: '動詞',
    pos_detail_1: '自立',
    pos_detail_2: '*',
    pos_detail_3: '*',
    conjugated_type: '五段・ラ行',
    conjugated_form: '連用タ接続',
    basic_form: 'がんばる',
    reading: 'ガンバッ',
    pronunciation: 'ガンバッ' },
  { word_id: 23430,
    word_type: 'KNOWN',
    word_position: 8,
    surface_form: 'た',
    pos: '助動詞',
    pos_detail_1: '*',
    pos_detail_2: '*',
    pos_detail_3: '*',
    conjugated_type: '特殊・タ',
    conjugated_form: '基本形',
    basic_form: 'た',
    reading: 'タ',
    pronunciation: 'タ' },
  { word_id: 63530,
    word_type: 'KNOWN',
    word_position: 9,
    surface_form: 'ん',
    pos: '名詞',
    pos_detail_1: '非自立',
    pos_detail_2: '一般',
    pos_detail_3: '*',
    conjugated_type: '*',
    conjugated_form: '*',
    basic_form: 'ん',
    reading: 'ン',
    pronunciation: 'ン' },
  { word_id: 23680,
    word_type: 'KNOWN',
    word_position: 10,
    surface_form: 'だ',
    pos: '助動詞',
    pos_detail_1: '*',
    pos_detail_2: '*',
    pos_detail_3: '*',
    conjugated_type: '特殊・ダ',
    conjugated_form: '基本形',
    basic_form: 'だ',
    reading: 'ダ',
    pronunciation: 'ダ' },
  { word_id: 92300,
    word_type: 'KNOWN',
    word_position: 11,
    surface_form: 'よ',
    pos: '助詞',
    pos_detail_1: '終助詞',
    pos_detail_2: '*',
    pos_detail_3: '*',
    conjugated_type: '*',
    conjugated_form: '*',
    basic_form: 'よ',
    reading: 'ヨ',
    pronunciation: 'ヨ' } ]

品詞と標準型をとりだしてみる

var readline = require('readline');
var kuromoji = require("kuromoji");

kuromoji.builder({
    dicPath: "node_modules/kuromoji/dict"
}).build(function(err, tokenizer) {
    if (err) {
        throw err;
    }

    // 標準入力をうけつけるインターフェース
    var rl = readline.createInterface({
        input: process.stdin,
        output: process.stdout
    });

    // 入力をうけつけて解析する
    rl.question("文をどうぞ ", function(answer) {
        var result = tokenizer.tokenize(answer);

        // ひとつずつ確認する
        result.forEach(function(word) {
            console.log(word.pos + ' ' + word.basic_form);
        });


        rl.close();
    });
})

標準形にできると形容詞の使い勝手があがりそう。

$ node kuromoji_test.js 
文をどうぞ 明日はマラソン大会で今からすごい憂鬱なの
名詞 明日
助詞 は
名詞 マラソン
名詞 大会
助詞 で
名詞 今
助詞 から
形容詞 すごい
名詞 憂鬱
助動詞 だ
助詞 の

名詞・動詞・形容詞ごとにとりだせるようにしておく

var readline = require('readline');
var kuromoji = require("kuromoji");

kuromoji.builder({
    dicPath: "node_modules/kuromoji/dict"
}).build(function(err, tokenizer) {
    if (err) {
        throw err;
    }

    // 標準入力をうけつけるインターフェース
    var rl = readline.createInterface({
        input: process.stdin,
        output: process.stdout
    });

    // 入力をうけつけて解析する
    rl.question("文をどうぞ ", function(answer) {
        var result = tokenizer.tokenize(answer);

        var noun = [],
            verb = [],
            adjective = [];

        // ひとつずつ確認する
        result.forEach(function(word) {
            switch (word.pos) {
                case '名詞':
                    noun.push(word.basic_form);
                    break;
                case '動詞':
                    verb.push(word.basic_form);
                    break;
                case '形容詞':
                    adjective.push(word.basic_form);
                    break;
            }
        });

        // 一覧を確認する
        console.log(noun);
        console.log(verb);
        console.log(adjective);

        rl.close();
    });

結果はこんな感じ。使いやすそうなので、実際に組み込んでみる。

$ node kuromoji_test.js 
文をどうぞ 明日は関ヶ原で憎きあの男を倒すの
[ '明日', '関ヶ原', '男' ]
[ '倒す' ]
[ '憎い' ]