はじめに
PythonでMecabを使用している記事がほとんどだったため、Node + Typescript + mecabで実装してみた。
本記事の記載のコードはこちらにあるため、ご参考ください。
Mecabとは
MeCabはオープンソースの形態素解析エンジンである。
MeCabは形態素解析ツールの中でも知名度が高く、実行速度が早いという特徴がある。
Docker上にMecabをインストール
Dockerfile
Dockerfile
FROM node:12-slim
# mecabの導入
RUN apt-get update \
&& apt-get install -y \
mecab \
libmecab-dev \
mecab-ipadic-utf8
WORKDIR /src
docker-compose.yml
docker-compose.yml
version: '3'
services:
mecab-node:
container_name: mecab-node
build:
context: ./
dockerfile: Dockerfile
tty: true # コンテナの起動永続化
volumes:
- ./src:/src
コンテナ内でmecabの動作確認
コンテナを起動する
$ docker-compose up -d
起動したコンテナに入る
$ docker exec -it mecab-node sh
コンテナ内でmecabを実行する
今回は、半角・全角を混合した「昔々、ある所にお爺さんとお婆さんとマイケルが居たそうですよ!!」を試した。
実行コマンド
$ mecab
昔々、ある所にお爺さんとお婆さんとマイケルが居たそうですよ!!
実行結果
mecabでは半角記号、半角英数字はフリガナを振ってくれていないため、Node + Typescriptでは、半角を全角に変換した上、mecabを呼び出すように実装した。(半角を全角に変換する処理は本記事で省略するため、こちらのgithubをご確認ください。)
昔 名詞,副詞可能,*,*,*,*,昔,ムカシ,ムカシ
々 記号,一般,*,*,*,*,々,々,々
、 記号,読点,*,*,*,*,、,、,、
ある 連体詞,*,*,*,*,*,ある,アル,アル
所 名詞,非自立,副詞可能,*,*,*,所,トコロ,トコロ
に 助詞,格助詞,一般,*,*,*,に,ニ,ニ
お爺さん 名詞,一般,*,*,*,*,お爺さん,オジイサン,オジーサン
と 助詞,並立助詞,*,*,*,*,と,ト,ト
お婆さん 名詞,一般,*,*,*,*,お婆さん,オバアサン,オバーサン
と 助詞,並立助詞,*,*,*,*,と,ト,ト
マイケル 名詞,一般,*,*,*,*,*
が 助詞,格助詞,一般,*,*,*,が,ガ,ガ
居 動詞,自立,*,*,一段,連用形,居る,イ,イ
た 助動詞,*,*,*,特殊・タ,基本形,た,タ,タ
そう 名詞,特殊,助動詞語幹,*,*,*,そう,ソウ,ソー
です 助動詞,*,*,*,特殊・デス,基本形,です,デス,デス
よ 助詞,終助詞,*,*,*,*,よ,ヨ,ヨ
!! 名詞,サ変接続,*,*,*,*,*
EOS
実装
Node + TypescriptでMecabを呼び出す
mecab.ts
import { tokenizeSync } from '@enjoyjs/node-mecab';
import { Token } from '@enjoyjs/node-mecab/src/types';
// MeCabを用いてフリガナ(全角)を抽出する関数
export const extractFurigana = (text: string) => {
let katakana = '';
const result = tokenizeSync(text);
result.map((token: Token) => {
if (token.feature.reading) {
katakana += token.feature.reading;
}
});
return katakana;
};
実行コマンド
npx ts-node index.ts 昔々、ある所にお爺さんとお婆さんとマイケルが居たそうですよ!!
実行結果
むかし々、あるところにおじいさんとおばあさんとまいけるがいたそうですよ!!
さいごに
mecabを実行してみて、「昔々」の「々」が変換ができていないことがわかった。