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 文をどうぞ 明日は関ヶ原で憎きあの男を倒すの [ '明日', '関ヶ原', '男' ] [ '倒す' ] [ '憎い' ]