【形態素解析】MeCabをシェルスクリプトで使いやすくする

MacにMeCabをセットアップ

形態素解析のMeCabを使ってみることにしました。

自分の環境が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

使い方

セットアップが完了したところで、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 "名詞,一般"
ゼロから作るDeep Learning ❷ ―自然言語処理編
ゼロから作るDeep Learning ❷ ―自然言語処理編

ディープラーニングを(もしくは、何らかの高度な技術を)深く理解するには、「ゼロから作る」という経験が重要だと筆者は考えます。ゼロから作るとは、自分の理解できる地点からスタートし、できるだけ外部の既製品は使わずに目的とする技術を完成させることです。そのような経験を通じて、表面的ではなく、しっかりとディープラーニングに精通すること――それが本書の目指すところです。

Amazon
深層学習による自然言語処理 (機械学習プロフェッショナルシリーズ)
深層学習による自然言語処理 (機械学習プロフェッショナルシリーズ)

◆自然言語処理の応用(機械翻訳、文書要約、対話、質問応答)に焦点を当て、深層学習の利用方法を解説。◆「実装上の工夫」など、本書でしか読めない実践的な内容が充実! ◆自然言語処理の応用(機械翻訳、文書要約、対話、質問応答)に焦点を当て、深層学習の利用方法を解説。◆「実装上の工夫」など、本書でしか読めない実践的な内容が充実!

KindleAmazon

Amazonでお得に購入するなら、Amazonギフト券がオススメ!

\Amazonギフトがお得/

コンビニ・ATM・ネットバンキングで¥5,000以上チャージすると、プライム会員は最大2.5%ポイント、通常会員は最大2%ポイントがもらえます!
Amazonギフト券

\この記事をシェアする/