mecabで形態素解析 macOS/Linux/Unix

【シェル】mecabで形態素解析をはじめよう【macOS】
【シェル】mecabで形態素解析をはじめよう【macOS】
この記事では、形態素解析のMeCabをMacにインストールして、シェルスクリプトで使いやすくする方法を紹介していきます。

macOSにmecabをセットアップ

形態素解析のMeCabを使ってみることにしました。 MeCab: Yet Another Part-of-Speech and Morphological Analyzer

自分の環境がMacですので、MeCab本体をbrewからインストールしてみます。

shell
$ brew install mecab

このままではparam.cpp(69) [ifs] no such file or directory: /usr/local/lib/mecab/dic/ipadic/dicrcとエラーが出てしまいました。辞書がないと使えないようです。下記のコマンドで辞書をインストールしてみます。

mecabの使い方

セットアップが完了したところで、Macのターミナル上でmecabと入力してreturnを押します。そして解析したい文章を入力します。たとえば「下記のコマンドで辞書をインストールしてみます。」と入力してみました。すると、次の形で品詞分けされました。mecabを終了する場合はcntl + cでキャンセルできます。

shell
$ mecab
下記のコマンドで辞書をインストールしてみます。
下記	名詞,一般,*,*,*,*,下記,カキ,カキ
の	助詞,連体化,*,*,*,*,の,ノ,ノ
コマンド	名詞,一般,*,*,*,*,コマンド,コマンド,コマンド
で	助詞,格助詞,一般,*,*,*,で,デ,デ
辞書	名詞,一般,*,*,*,*,辞書,ジショ,ジショ
を	助詞,格助詞,一般,*,*,*,を,ヲ,ヲ
インストール	名詞,一般,*,*,*,*,インストール,インストール,インストール
し	動詞,自立,*,*,サ変・スル,連用形,する,シ,シ
て	助詞,接続助詞,*,*,*,*,て,テ,テ
み	動詞,非自立,*,*,一段,連用形,みる,ミ,ミ
ます	助動詞,*,*,*,特殊・マス,基本形,ます,マス,マス
。	記号,句点,*,*,*,*,。,。,。
テキスト品詞
下記名詞,一般,,,,,下記,カキ,カキ
助詞,連体化,,,,,の,ノ,ノ
コマンド名詞,一般,,,,,コマンド,コマンド,コマンド
助詞,格助詞,一般,,,*,で,デ,デ
辞書名詞,一般,,,,,辞書,ジショ,ジショ
助詞,格助詞,一般,,,*,を,ヲ,ヲ
インストール名詞,一般,,,,,インストール,インストール,インストール
動詞,自立,,,サ変・スル,連用形,する,シ,シ
助詞,接続助詞,,,,,て,テ,テ
動詞,非自立,,,一段,連用形,みる,ミ,ミ
ます助動詞,,,*,特殊・マス,基本形,ます,マス,マス
記号,句点,,,,,。,。,。

シェルスクリプトでmecabを使いやすくする

mecabを実用的に使えるようにするにはシェルスクリプトを組む必要があります。まずは単純にファイルを解析して、行ごとで処理できるようにしてみます。

bash
#!/bin/bash

file="post/about-introduce.md"
mecab $file | while read line
do
    echo $line     
done

つぎに、上記の$line変数をタグ区切りで分けてみます。awkコマンドは、-Fオプションで区切り文字を指定しない限り、タブまたは半角スペースで区切ってくれます。そしてMeCabの出力はタグ区切りです。ですから、次のように書くことができます。

bash
do
    text=`echo $line | awk '{print $1}'`
    hinshi=`echo $line | awk '{print $2}'`
done

これでテキスト部分と品詞に別れました。それでは、品詞の中から「名詞,一般」の文字が含まれている行だけを抽出してみましょう。

bash
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

bash
#!/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を気軽に利用できるようになりました。

shell
$ ./mecabDeKaiseki.sh post/about-introduce.md "名詞,一般"

関連記事

最後までご覧いただきありがとうございます!

▼ 記事に関するご質問やお仕事のご相談は以下よりお願いいたします。
お問い合わせフォーム