AIの自然言語処理や検索エンジンなどにも使われている形態素解析ですが、
pythonでは形態素解析エンジンMeCabを使用すれば、簡単に行うことができます
今回はpythonで形態素解析エンジンMeCabを使用する方法を解説していきたいと思います
こんなあなたにおすすめ
pythonを使って形態素解析を行いたい
pythonのMeCabを使ってみたい
Contents
pythonの形態素解析エンジンMeCabとは

MeCabとは、形態素解析が行えるソフトウェアのことを指します
pythonのライブラリではありませんが、MeCabとpythonは連携して使用することができます
形態素解析とは
形態素解析とは、自然言語処理の一種で、文章を最小の単語に分け、さまざまな方法を使って解析することです
文章を最小の単語に分けるというのは、
自立語・付属語に分けるということになります
形態素解析を実行する流れとして、
- 分かち書き
- 品詞の特定
- 活用形の特定
形態素解析の詳しい解説は以下の記事をご覧ください

pythonでMeCabを使用する準備

ではpythonでMeCabを使用する方法について解説をしていきたいと思います
流れとしては以下のようになります
- pythonの環境構築を行う
- Homebrewのインストール
- MeCabと形態素解析に必要な辞書をインストール
- MeCabの動作確認
- mecab-ipadic-NEologdのインストール
pythonの環境構築を行う
まずはpythonでMeCabを使用するためには、pythonの環境構築を行なっていきます
Anacondaを使用してpythonをインストールする方法はこちら

Homebrewのインストール
続いてHomebrewをインストールしていきます
ターミナルを開いて以下のコマンドを実行します
/bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"

その後、パスワードの入力を求められるので、パスワードを入力します
途中で以下の内容が表示されるので、表示されたらEnterを押します
Press RETURN to continue or any other key to abort
Homebrewのインストールが終わったら、パスを追加していきます
==> Next steps:
-Add Homebrew to your PATH in /Users/ユーザ名/.zprofile:
echo 'eval "$(/opt/homebrew/bin/brew shellenv)"' >> /Users/ユーザ名/.zprofile
eval "$(/opt/homebrew/bin/brew shellenv)"
-Run 'brew help' to get started
-Further documentation:
https://docs.brew.sh
echo 'eval "$(/opt/homebrew/bin/brew shellenv)"' >> /Users/ユーザ名/.zprofile

Homebrewが正常にインストールされ、パスが通っているかを確認します
brew help

上記の画面が表示されれば、Homebrewのインストールとパスは正常に通っているのでOKです
MeCabと形態素解析に必要な辞書をインストール
Homebrewのインストールが完了したら、MeCabおよび形態素解析に必要な辞書をインストールしていきます
こちらの辞書を使用することで、多数の固有名詞や品詞が網羅されており、効率的にPythonでMeCabが利用が可能です
これもターミナル上で行なっていきます
brew install mecab
brew install mecab-ipadic
pip install mecab-python3
MeCabおよび形態素解析に必要な辞書をインストールはこれで完了です
MeCabの動作確認
そのままターミナル上でMeCabの動作確認を行なっていきます
python
import MeCab
MeCabをインポートしてエラーが出なければ準備完了です
pythonでMeCabを実行する

pythonでMeCabを実行していきたいと思います
import MeCab
mecab = MeCab.Tagger()
sent ="昨日はHTMLの勉強をした"
print(mecab.parse(sent))
>>>出力結果
昨日 キノウ 昨日 名詞-副詞可能
は ハ は 助詞-係助詞
HTML HTML HTML 名詞-固有名詞-組織
の ノ の 助詞-連体化
勉強 ベンキョウ 勉強 名詞-サ変接続
を ヲ を 助詞-格助詞-一般
し シ する 動詞-自立 サ変・スル 連用形
た タ た 助動詞 特殊・タ 基本形
EOS
MeCab.Tagger()
MeCab.Tagger()で形態素解析を行うための辞書を指定します
このTaggerは「タグ付けする」という意味になります
MeCabにTaggerでタグ付けをするということです
MeCab::Tagger のコンストラクタの引数は, 基本的に mecab の実行形式に与えるパラメータと同一で, それらを文字列として与えます.
MeCab公式HPより
今回のサンプルコードは「-Owakati」を指定していますが、それ以外にも、
- MeCab.Tagger(“-Ochasen”):ChaSen互換形式
- MeCab.Tagger(“-Oyomi”):読みのみを出力
- MeCab.Tagger(“-Odump”):単語の全情報
- MeCab.Tagger(“-Osimple”):シンプルな形態素解析
などがあります
import MeCab
mecab = MeCab.Tagger('-Ochasen')
sent ="昨日はHTMLの勉強をした"
print(mecab.parse(sent))
>>>出力結果
昨日 キノウ 昨日 名詞-副詞可能
は ハ は 助詞-係助詞
HTML HTML HTML 名詞-固有名詞-組織
の ノ の 助詞-連体化
勉強 ベンキョウ 勉強 名詞-サ変接続
を ヲ を 助詞-格助詞-一般
し シ する 動詞-自立 サ変・スル 連用形
た タ た 助動詞 特殊・タ 基本形
EOS
import MeCab
mecab = MeCab.Tagger('-Oyomi')
sent ="昨日はHTMLの勉強をした"
print(mecab.parse(sent))
>>>出力結果
キノウハHTMLノベンキョウヲシタ
import MeCab
mecab = MeCab.Tagger('-Odump')
sent ="昨日はHTMLの勉強をした"
print(mecab.parse(sent))
>>>出力結果
0 BOS BOS/EOS,*,*,*,*,*,*,*,* 0 0 0 0 0 0 2 1 0.000000 0.000000 0.000000 0
2 昨日 名詞,副詞可能,*,*,*,*,昨日,キノウ,キノー 0 6 1314 1314 67 2 0 1 0.000000 0.000000 0.000000 4626
14 は 助詞,係助詞,*,*,*,*,は,ハ,ワ 6 9 261 261 16 6 0 1 0.000000 0.000000 0.000000 5501
19 HTML 名詞,固有名詞,組織,*,*,*,* 9 13 1292 1292 45 5 1 1 0.000000 0.000000 0.000000 18682
24 の 助詞,連体化,*,*,*,*,の,ノ,ノ 13 16 368 368 24 6 0 1 0.000000 0.000000 0.000000 19304
30 勉強 名詞,サ変接続,*,*,*,*,勉強,ベンキョウ,ベンキョー 16 22 1283 1283 36 2 0 1 0.000000 0.000000 0.000000 21841
35 を 助詞,格助詞,一般,*,*,*,を,ヲ,ヲ 22 25 156 156 13 6 0 1 0.000000 0.000000 0.000000 21392
41 し 動詞,自立,*,*,サ変・スル,連用形,する,シ,シ 25 28 610 610 31 6 0 1 0.000000 0.000000 0.000000 24165
44 た 助動詞,*,*,*,特殊・タ,基本形,た,タ,タ 28 31 435 435 25 6 0 1 0.000000 0.000000 0.000000 21709
47 EOS BOS/EOS,*,*,*,*,*,*,*,* 31 31 0 0 0 0 3 1 0.000000 0.000000 0.000000 20599
import MeCab
mecab = MeCab.Tagger('-Osimple')
sent ="昨日はHTMLの勉強をした"
print(mecab.parse(sent))
>>>出力結果
昨日 名詞-副詞可能
は 助詞-係助詞
の 助詞-連体化
勉強 名詞-サ変接続
を 助詞-格助詞-一般
し 動詞-自立
た 助動詞
EOS
mecab.parse()
mecab.parseでは、指定した辞書を使用して、指定した文字列やテキストファイルの形態素解析を実施していきます
sentを指定しなくても、文字列を直接入力すれば、形態素解析を行うことができます
しかし、形態素解析を行う場合の多くはテキストファイルなどから読み込んで実行をすると思いますので、指定する方が便利だと思います
import MeCab
mecab = MeCab.Tagger('-Osimple')
#sent ="昨日はHTMLの勉強をした"
print(mecab.parse("昨日はHTMLの勉強をした"))
>>>出力結果
昨日 名詞-副詞可能
は 助詞-係助詞
の 助詞-連体化
勉強 名詞-サ変接続
を 助詞-格助詞-一般
し 動詞-自立
た 助動詞
EOS
mecab.parseToNode()
前回の記事のサンプルコードでは、「mecab.parseToNode()」を使用しました
これを使用することで、最初のnodeを取得し、node.nextとすることで、次のnodeに移ります
surfaceには単語が、featureには特徴(品詞の種類や活用形など)が含まれます
import collections
import MeCab
import matplotlib.pyplot as plt
from wordcloud import WordCloud
import seaborn as sns
sns.set(font='Hiragino Sans')
f= open('.txt', 'r', encoding='UTF-8')
text=f.read()
f.close()
tagger =MeCab.Tagger()
tagger.parse('')
node = tagger.parseToNode(text)
word_list=[]
while node:
word_type = node.feature.split(',')[0]
if word_type in ["名詞",'代名詞']:
word_list.append(node.surface)
node=node.next
word_chain=' '.join(word_list)
形態素解析に出てきた品詞の数を数える
形態素解析を実施した後に、どの品詞がどれくらいの数出てきているのかを知りたい時があります
そういう時は「collections.Counter」を使用することで数を数えることができます
import collections
・・・省略・・・
・・・省略・・・
・・・省略・・・
・・・省略・・・
word_list=[]
while node:
word_type = node.feature.split(',')[0]
if word_type in ["名詞",'代名詞']:
word_list.append(node.surface)
node=node.next
word_chain=' '.join(word_list)
#word_listの中身を数える
c=collections.Counter(word_list)
まとめ

- MeCabは形態素解析用のソフトウェア
- MeCabとpythonは連携して使うことができる
- 指定の品詞のみや品詞の数をカウントすることができる