kuromoji.jsで形態素解析
#TypeScript
#JavaScript
にメンテナンス済み
今回は形態素解析が簡単に実行できるライブラリ「kuromoji.js」を使って、任意の文字列を品詞ごとに分解・解析する方法を紹介します。
インストール
npm install kuromoji
使い方
辞書を読み込む
kuromoji のインスタンスを作成するタイミングで、辞書を指定する必要があります。 インストール時にデフォルトの辞書も入っているので、特別指定が無ければこれを使用すればよいと思います。
import { builder, IpadicFeatures, TokenizerBuilder } from 'kuromoji';
const defaultBuilder = builder({ dicPath: 'node_modules/kuromoji/dict' });
解析を実行
解析には作成したインスタンスの build 関数を使用します。 build 関数は引数にコールバック関数を指定し、コールバック関数から Tokenizer を受け取ることができます。 Tokenizer.tokenize の引数に解析したい文字列を指定することで、形態素解析が実行されます。
/** 解析する文字列 */
const target = '月がきれいですね。';
defaultBuilder.build((err, tokenizer) => {
if (err) {
console.error(err);
}
console.log(tokenizer.tokenize(target));
});
解析結果
結果は以下のようなオブジェクトの配列で返却されます。
[
{
word_id: 461780,
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: 92920,
word_type: 'KNOWN',
word_position: 2,
surface_form: 'が',
pos: '助詞',
pos_detail_1: '格助詞',
pos_detail_2: '一般',
pos_detail_3: '*',
conjugated_type: '*',
conjugated_form: '*',
basic_form: 'が',
reading: 'ガ',
pronunciation: 'ガ',
},
{
word_id: 111840,
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: 23760,
word_type: 'KNOWN',
word_position: 6,
surface_form: 'です',
pos: '助動詞',
pos_detail_1: '*',
pos_detail_2: '*',
pos_detail_3: '*',
conjugated_type: '特殊・デス',
conjugated_form: '基本形',
basic_form: 'です',
reading: 'デス',
pronunciation: 'デス',
},
{
word_id: 92590,
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: 90940,
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: '。',
},
];
処理にあたって
コールバック関数を使う仕様上、async/await と相性が良くないため、以下のように Promise に対応させておくと便利かもしれません。
const getTokenizer = (
builder: TokenizerBuilder<IpadicFeatures>
): Promise<Tokenizer<IpadicFeatures>> => {
return new Promise((resolve, reject) => {
builder.build((err, tokenizer) => {
if (err) {
reject(err);
}
resolve(tokenizer);
});
});
};