python

pythonで形態素解析エンジンMeCabを使ってみる【サンプルコードあり】

pythonでmecabを使用する

AIの自然言語処理や検索エンジンなどにも使われている形態素解析ですが、

pythonでは形態素解析エンジンMeCabを使用すれば、簡単に行うことができます

今回はpythonで形態素解析エンジンMeCabを使用する方法を解説していきたいと思います

こんなあなたにおすすめ

pythonを使って形態素解析を行いたい

pythonのMeCabを使ってみたい

pythonの形態素解析エンジンMeCabとは

mecabとは

MeCabとは、形態素解析が行えるソフトウェアのことを指します

pythonのライブラリではありませんが、MeCabとpythonは連携して使用することができます

形態素解析とは

形態素解析とは、自然言語処理の一種で、文章を最小の単語に分け、さまざまな方法を使って解析することです

文章を最小の単語に分けるというのは、
自立語・付属語に分けるということになります

形態素解析を実行する流れとして、

  1. 分かち書き
  2. 品詞の特定
  3. 活用形の特定

形態素解析の詳しい解説は以下の記事をご覧ください

python 形態素解析
pythonで形態素解析をやってみよう【収益化したサンプルコードあり】形態素解析というもの自体、聞きなれない方が多いかと思います。私たちが使っている言語をさまざまな方法を使って解析する方法を自然言語処理と言いますが、形態素解析はそのうちの一つです。pythonを使えば形態素解析を簡単に行うことができます。今回は私が収益化することができたサンプルコードを交えつつ、pythonで形態素解析を行う方法を解説していきたいと思います。...

pythonでMeCabを使用する準備

pythonでmecabを使う準備

ではpythonでMeCabを使用する方法について解説をしていきたいと思います

流れとしては以下のようになります

  1. pythonの環境構築を行う
  2. Homebrewのインストール
  3. MeCabと形態素解析に必要な辞書をインストール
  4. MeCabの動作確認
  5. mecab-ipadic-NEologdのインストール

pythonの環境構築を行う

まずはpythonでMeCabを使用するためには、pythonの環境構築を行なっていきます

Anacondaを使用してpythonをインストールする方法はこちら

anacondaの構築方法
Pythonの環境構築〜Anacondaとは?〜サンプルコードと図解付きPythonの環境構築を調べると、「Anaconda」という文字を見かけるかと思います。 僕も最初はよくわからなくて、とりあえずwebサイトに書いてある通りに進めていきました。 そのおかげもあり、3回ほど環境構築で挫折をしました。 現在はAnacondaを使ってpythonの学習を進めています。 なので、今回はAnacondaの環境構築について解説をしていこうと思います。 この記事を読んでいるかたが迷子にならないように、画像付きで解説していこうと思いますので、最後までお付き合いください。...

Homebrewのインストール

続いてHomebrewをインストールしていきます

ターミナルを開いて以下のコマンドを実行します

/bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"
homebrewインストール

その後、パスワードの入力を求められるので、パスワードを入力します

途中で以下の内容が表示されるので、表示されたら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パス

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

brew help
homebrewパスの確認

上記の画面が表示されれば、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を実行する

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)

まとめ

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