mecabで形態素解析 macOS/Linux/Unix
この記事では、形態素解析のMeCabをMacにインストールして、シェルスクリプトで使いやすくする方法を紹介していきます。
macOSにmecabをセットアップ
形態素解析のMeCabを使ってみることにしました。 MeCab: Yet Another Part-of-Speech and Morphological Analyzer
自分の環境がMacですので、MeCab本体をbrewからインストールしてみます。
$ brew install mecab
このままではparam.cpp(69) [ifs] no such file or directory: /usr/local/lib/mecab/dic/ipadic/dicrcとエラーが出てしまいました。辞書がないと使えないようです。下記のコマンドで辞書をインストールしてみます。
$ brew install mecab-ipadic
mecabの使い方
セットアップが完了したところで、Macのターミナル上でmecabと入力してreturnを押します。そして解析したい文章を入力します。たとえば「下記のコマンドで辞書をインストールしてみます。」と入力してみました。すると、次の形で品詞分けされました。mecabを終了する場合はcntl + cでキャンセルできます。
$ mecab
下記のコマンドで辞書をインストールしてみます。
下記 名詞,一般,*,*,*,*,下記,カキ,カキ
の 助詞,連体化,*,*,*,*,の,ノ,ノ
コマンド 名詞,一般,*,*,*,*,コマンド,コマンド,コマンド
で 助詞,格助詞,一般,*,*,*,で,デ,デ
辞書 名詞,一般,*,*,*,*,辞書,ジショ,ジショ
を 助詞,格助詞,一般,*,*,*,を,ヲ,ヲ
インストール 名詞,一般,*,*,*,*,インストール,インストール,インストール
し 動詞,自立,*,*,サ変・スル,連用形,する,シ,シ
て 助詞,接続助詞,*,*,*,*,て,テ,テ
み 動詞,非自立,*,*,一段,連用形,みる,ミ,ミ
ます 助動詞,*,*,*,特殊・マス,基本形,ます,マス,マス
。 記号,句点,*,*,*,*,。,。,。
テキスト | 品詞 |
---|---|
下記 | 名詞,一般,,,,,下記,カキ,カキ |
の | 助詞,連体化,,,,,の,ノ,ノ |
コマンド | 名詞,一般,,,,,コマンド,コマンド,コマンド |
で | 助詞,格助詞,一般,,,*,で,デ,デ |
辞書 | 名詞,一般,,,,,辞書,ジショ,ジショ |
を | 助詞,格助詞,一般,,,*,を,ヲ,ヲ |
インストール | 名詞,一般,,,,,インストール,インストール,インストール |
し | 動詞,自立,,,サ変・スル,連用形,する,シ,シ |
て | 助詞,接続助詞,,,,,て,テ,テ |
み | 動詞,非自立,,,一段,連用形,みる,ミ,ミ |
ます | 助動詞,,,*,特殊・マス,基本形,ます,マス,マス |
。 | 記号,句点,,,,,。,。,。 |
シェルスクリプトでmecabを使いやすくする
mecabを実用的に使えるようにするにはシェルスクリプトを組む必要があります。まずは単純にファイルを解析して、行ごとで処理できるようにしてみます。
#!/bin/bash
file="post/about-introduce.md"
mecab $file | while read line
do
echo $line
done
つぎに、上記の$line変数をタグ区切りで分けてみます。awkコマンドは、-Fオプションで区切り文字を指定しない限り、タブまたは半角スペースで区切ってくれます。そしてMeCabの出力はタグ区切りです。ですから、次のように書くことができます。
do
text=`echo $line | awk '{print $1}'`
hinshi=`echo $line | awk '{print $2}'`
done
これでテキスト部分と品詞に別れました。それでは、品詞の中から「名詞,一般」の文字が含まれている行だけを抽出してみましょう。
do
text=`echo $line | awk '{print $1}'`
hinshi=`echo $line | awk '{print $2}'`
meishi=`echo $hinshi | grep 名詞,一般`
if [ "$meishi" = "" ]; then
continue
fi
echo $text
done
プログラミング中に [: =: unary operator expectedのエラーが吐き出されてしまいました。if [ "$meishi" = "" ]; thenのように変数をダブルクオーテーションで囲ってあげることで回避できました。
さて、これで無事「名詞,一般」のみの行をフィルタリングすることができました。
サイト
about
サイト
アプリ
ヘルプ
ページ
モチベーション
忘備
ブログ
有料
Pages
無料
github
io
カッコ
サイト
書き出し
自前
サイトジェネレーター
シェル
スクリプト
PHP
HTML
リダイレクト
ファイル
PHPのexecから使えるように、もう少し改良したのがこちらです。 mecabDeKaiseki.sh
#!/bin/bash
CMDNAME=`basename $0`
if [ $# -ne 2 ]; then
echo "Usage: $CMDNAME filepath hinshi" 1>&2
exit 1
fi
file=$1
filter=$2
mecab $file | while read line
do
text=`echo $line | awk '{print $1}'`
hinshi=`echo $line | awk '{print $2}'`
meishi=`echo $hinshi | grep "$filter"`
if [ -n "$meishi" ]; then
echo $text
fi
done
ターミナルで使う場合は第一引数にファイルパスを、第二引数にフィルタリングしたい品詞の文字列を渡してあげます。簡易的な実装ではありますが、これでMeCabを気軽に利用できるようになりました。
$ ./mecabDeKaiseki.sh post/about-introduce.md "名詞,一般"