ちょっと話題の記事

Python3で形態素解析エンジンMeCabを使ってみた

2018.08.17

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

形態素解析エンジンMeCabをPython3から使ってみましたのでご紹介します。

環境

  • macOS 10.13.6
  • Python 3.6.4

準備

MeCabと辞書と、mecab-python3をインストール

$ brew install mecab mecab-ipadic git curl xz
$ pip install mecab-python3

mecab-ipadic-NEologdのインストール

標準の辞書だとEC2とかS3とかうまく分かち書きができなかったのでWeb上の新語が追加されたシステム辞書 mecab-ipadic-NEologd もインストールしました。

インストール方法の詳細は mecab-ipadic-NEologd : Neologism dictionary for MeCab を確認してみてください。

$ git clone --depth 1 git@github.com:neologd/mecab-ipadic-neologd.git
$ cd mecab-ipadic-neologd
$ ./bin/install-mecab-ipadic-neologd -n

インストール先は以下コマンドで確認できます。

$ echo `mecab-config --dicdir`"/mecab-ipadic-neologd"
/usr/local/lib/mecab/dic/mecab-ipadic-neologd

やってみる

インストールができたのでPython3で形態素解析をやっていきたいと思います。 解析する文章はウィキペディアの以下の文で試してみました。

Amazon Web Services

AWSの有名なサービスにAmazon Elastic Compute Cloud (EC2) とAmazon Simple Storage Service (S3) がある。これまでのクライアントが保有していた物理的なサーバファームと比較してAWSは大規模な計算処理能力を速やかに提供出来ることが強みである。

#!/usr/bin/python
# -*- coding: utf-8 -*-

import MeCab

sentence = """AWSの有名なサービスにAmazon Elastic Compute Cloud (EC2) とAmazon Simple Storage Service (S3) がある。
これまでのクライアントが保有していた物理的なサーバファームと比較してAWSは大規模な計算処理能力を速やかに提供出来ることが強みである。"""

t = MeCab.Tagger('')
print(t.parse(sentence))

実行結果

AWS     名詞,固有名詞,組織,*,*,*,*
の      助詞,連体化,*,*,*,*,の,ノ,ノ
有名    名詞,形容動詞語幹,*,*,*,*,有名,ユウメイ,ユーメイ
な      助動詞,*,*,*,特殊・ダ,体言接続,だ,ナ,ナ
サービス        名詞,サ変接続,*,*,*,*,サービス,サービス,サービス
に      助詞,格助詞,一般,*,*,*,に,ニ,ニ
Amazon  名詞,一般,*,*,*,*,*
Elastic 名詞,一般,*,*,*,*,*
Compute 名詞,一般,*,*,*,*,*
Cloud   名詞,一般,*,*,*,*,*
(       名詞,サ変接続,*,*,*,*,*
EC      名詞,一般,*,*,*,*,*
2       名詞,数,*,*,*,*,*
)       名詞,サ変接続,*,*,*,*,*
と      助詞,並立助詞,*,*,*,*,と,ト,ト
Amazon  名詞,固有名詞,組織,*,*,*,*
Simple  名詞,一般,*,*,*,*,*
Storage 名詞,一般,*,*,*,*,*
Service 名詞,一般,*,*,*,*,*
(       名詞,サ変接続,*,*,*,*,*
S       名詞,一般,*,*,*,*,*
3       名詞,数,*,*,*,*,*
)       名詞,サ変接続,*,*,*,*,*
が      助詞,格助詞,一般,*,*,*,が,ガ,ガ
ある    動詞,自立,*,*,五段・ラ行,基本形,ある,アル,アル
。      記号,句点,*,*,*,*,。,。,。
これ    名詞,代名詞,一般,*,*,*,これ,コレ,コレ
まで    助詞,副助詞,*,*,*,*,まで,マデ,マデ
の      助詞,連体化,*,*,*,*,の,ノ,ノ
クライアント    名詞,一般,*,*,*,*,*
が      助詞,格助詞,一般,*,*,*,が,ガ,ガ
保有    名詞,サ変接続,*,*,*,*,保有,ホユウ,ホユー
し      動詞,自立,*,*,サ変・スル,連用形,する,シ,シ
て      助詞,接続助詞,*,*,*,*,て,テ,テ
い      動詞,非自立,*,*,一段,連用形,いる,イ,イ
た      助動詞,*,*,*,特殊・タ,基本形,た,タ,タ
物理    名詞,一般,*,*,*,*,物理,ブツリ,ブツリ
的      名詞,接尾,形容動詞語幹,*,*,*,的,テキ,テキ
な      助動詞,*,*,*,特殊・ダ,体言接続,だ,ナ,ナ
サーバ  名詞,一般,*,*,*,*,サーバ,サーバ,サーバ
ファーム        名詞,一般,*,*,*,*,ファーム,ファーム,ファーム
と      助詞,格助詞,一般,*,*,*,と,ト,ト
比較    名詞,サ変接続,*,*,*,*,比較,ヒカク,ヒカク
し      動詞,自立,*,*,サ変・スル,連用形,する,シ,シ
て      助詞,接続助詞,*,*,*,*,て,テ,テ
AWS     名詞,一般,*,*,*,*,*
は      助詞,係助詞,*,*,*,*,は,ハ,ワ
大      接頭詞,名詞接続,*,*,*,*,大,ダイ,ダイ
規模    名詞,一般,*,*,*,*,規模,キボ,キボ
な      助動詞,*,*,*,特殊・ダ,体言接続,だ,ナ,ナ
計算    名詞,サ変接続,*,*,*,*,計算,ケイサン,ケイサン
処理    名詞,サ変接続,*,*,*,*,処理,ショリ,ショリ
能力    名詞,一般,*,*,*,*,能力,ノウリョク,ノーリョク
を      助詞,格助詞,一般,*,*,*,を,ヲ,ヲ
速やか  名詞,形容動詞語幹,*,*,*,*,速やか,スミヤカ,スミヤカ
に      助詞,副詞化,*,*,*,*,に,ニ,ニ
提供    名詞,サ変接続,*,*,*,*,提供,テイキョウ,テイキョー
出来る  動詞,自立,*,*,一段,基本形,出来る,デキル,デキル
こと    名詞,非自立,一般,*,*,*,こと,コト,コト
が      助詞,格助詞,一般,*,*,*,が,ガ,ガ
強み    名詞,一般,*,*,*,*,強み,ツヨミ,ツヨミ
で      助動詞,*,*,*,特殊・ダ,連用形,だ,デ,デ
ある    助動詞,*,*,*,五段・ラ行アル,基本形,ある,アル,アル
。      記号,句点,*,*,*,*,。,。,。
EOS

EC2やS3が分かれてしまっていますので mecab-ipadic-NEologd の辞書を使用してみました。

#!/usr/bin/python
# -*- coding: utf-8 -*-

import MeCab

sentence = """AWSの有名なサービスにAmazon Elastic Compute Cloud (EC2) とAmazon Simple Storage Service (S3) がある。
これまでのクライアントが保有していた物理的なサーバファームと比較してAWSは大規模な計算処理能力を速やかに提供出来ることが強みである。"""

t = MeCab.Tagger('-d /usr/local/lib/mecab/dic/mecab-ipadic-neologd')
print(t.parse(sentence))

実行結果

AWS     名詞,固有名詞,一般,*,*,*,AWS,アマゾンウェブサービス,アマゾンウェブサービス
の      助詞,連体化,*,*,*,*,の,ノ,ノ
有名    名詞,形容動詞語幹,*,*,*,*,有名,ユウメイ,ユーメイ
な      助動詞,*,*,*,特殊・ダ,体言接続,だ,ナ,ナ
サービス        名詞,サ変接続,*,*,*,*,サービス,サービス,サービス
に      助詞,格助詞,一般,*,*,*,に,ニ,ニ
Amazon  名詞,固有名詞,一般,*,*,*,Amazon,アマゾン,アマゾン
Elastic 名詞,固有名詞,一般,*,*,*,Elastic,エラスティック,エラスティック
Compute 名詞,一般,*,*,*,*,*
Cloud   名詞,一般,*,*,*,*,*
(       記号,一般,*,*,*,*,*
EC2     名詞,固有名詞,一般,*,*,*,EC2,イーシーツー,イーシーツー
)       記号,一般,*,*,*,*,*
と      助詞,並立助詞,*,*,*,*,と,ト,ト
Amazon  名詞,固有名詞,一般,*,*,*,Amazon,アマゾン,アマゾン
Simple  名詞,固有名詞,一般,*,*,*,Simple,シンプル,シンプル
Storage 名詞,一般,*,*,*,*,*
Service 名詞,一般,*,*,*,*,*
(       記号,一般,*,*,*,*,*
S3      名詞,固有名詞,人名,一般,*,*,S3,エススリーマイルスボニーアンドブレンクシナトラ,エススリーマイルスボニーアンドブレンクシナトラ
)       記号,一般,*,*,*,*,*
が      助詞,格助詞,一般,*,*,*,が,ガ,ガ
ある    動詞,自立,*,*,五段・ラ行,基本形,ある,アル,アル
。      記号,句点,*,*,*,*,。,。,。
これ    名詞,代名詞,一般,*,*,*,これ,コレ,コレ
まで    助詞,副助詞,*,*,*,*,まで,マデ,マデ
の      助詞,連体化,*,*,*,*,の,ノ,ノ
クライアント    名詞,固有名詞,一般,*,*,*,client,クライアント,クライアント
が      助詞,格助詞,一般,*,*,*,が,ガ,ガ
保有    名詞,サ変接続,*,*,*,*,保有,ホユウ,ホユー
し      動詞,自立,*,*,サ変・スル,連用形,する,シ,シ
て      助詞,接続助詞,*,*,*,*,て,テ,テ
い      動詞,非自立,*,*,一段,連用形,いる,イ,イ
た      助動詞,*,*,*,特殊・タ,基本形,た,タ,タ
物理    名詞,一般,*,*,*,*,物理,ブツリ,ブツリ
的      名詞,接尾,形容動詞語幹,*,*,*,的,テキ,テキ
な      助動詞,*,*,*,特殊・ダ,体言接続,だ,ナ,ナ
サーバファーム  名詞,固有名詞,一般,*,*,*,サーバファーム,サーバファーム,サーバファーム
と      助詞,格助詞,一般,*,*,*,と,ト,ト
比較    名詞,サ変接続,*,*,*,*,比較,ヒカク,ヒカク
し      動詞,自立,*,*,サ変・スル,連用形,する,シ,シ
て      助詞,接続助詞,*,*,*,*,て,テ,テ
AWS     名詞,固有名詞,一般,*,*,*,AWS,アマゾンウェブサービス,アマゾンウェブサービス
は      助詞,係助詞,*,*,*,*,は,ハ,ワ
大規模  名詞,一般,*,*,*,*,大規模,ダイキボ,ダイキボ
な      助動詞,*,*,*,特殊・ダ,体言接続,だ,ナ,ナ
計算    名詞,サ変接続,*,*,*,*,計算,ケイサン,ケイサン
処理    名詞,サ変接続,*,*,*,*,処理,ショリ,ショリ
能力    名詞,一般,*,*,*,*,能力,ノウリョク,ノーリョク
を      助詞,格助詞,一般,*,*,*,を,ヲ,ヲ
速やか  名詞,形容動詞語幹,*,*,*,*,速やか,スミヤカ,スミヤカ
に      助詞,副詞化,*,*,*,*,に,ニ,ニ
提供    名詞,サ変接続,*,*,*,*,提供,テイキョウ,テイキョー
出来る  動詞,自立,*,*,一段,基本形,出来る,デキル,デキル
こと    名詞,非自立,一般,*,*,*,こと,コト,コト
が      助詞,格助詞,一般,*,*,*,が,ガ,ガ
強み    名詞,一般,*,*,*,*,強み,ツヨミ,ツヨミ
で      助動詞,*,*,*,特殊・ダ,連用形,だ,デ,デ
ある    助動詞,*,*,*,五段・ラ行アル,基本形,ある,アル,アル
。      記号,句点,*,*,*,*,。,。,。
EOS

今度はEC2やS3も一つの名詞として正しく分割できました。 mecab-ipadic-NEologdに記載がありますが、Web上の文書の解析をするときは mecab-ipadic-NEologd を使うのが良さそうです。

解析できましたが、特定の品詞だけ欲しい場合もあるかと思います。 以下のようにして名詞のみ取得してみました。

#!/usr/bin/python
# -*- coding: utf-8 -*-

import MeCab

sentence = """AWSの有名なサービスにAmazon Elastic Compute Cloud (EC2) とAmazon Simple Storage Service (S3) がある。
これまでのクライアントが保有していた物理的なサーバファームと比較してAWSは大規模な計算処理能力を速やかに提供出来ることが強みである。"""

t = MeCab.Tagger('-d /usr/local/lib/mecab/dic/mecab-ipadic-neologd')
t.parse('')
m = t.parseToNode(sentence)

while m:
    if m.feature.split(',')[0] == '名詞':
        print(m.surface)
    m = m.next

実行結果

AWS      名詞,固有名詞,一般,*,*,*,AWS,アマゾンウェブサービス,アマゾンウェブサービス
有名     名詞,形容動詞語幹,*,*,*,*,有名,ユウメイ,ユーメイ
サービス         名詞,サ変接続,*,*,*,*,サービス,サービス,サービス
Amazon   名詞,固有名詞,一般,*,*,*,Amazon,アマゾン,アマゾン
Elastic          名詞,固有名詞,一般,*,*,*,Elastic,エラスティック,エラスティック
Compute          名詞,一般,*,*,*,*,*
Cloud    名詞,一般,*,*,*,*,*
EC2      名詞,固有名詞,一般,*,*,*,EC2,イーシーツー,イーシーツー
Amazon   名詞,固有名詞,一般,*,*,*,Amazon,アマゾン,アマゾン
Simple   名詞,固有名詞,一般,*,*,*,Simple,シンプル,シンプル
Storage          名詞,一般,*,*,*,*,*
Service          名詞,一般,*,*,*,*,*
S3       名詞,固有名詞,人名,一般,*,*,S3,エススリーマイルスボニーアンドブレンクシナトラ,エススリーマイルスボニーアンドブレンクシナトラ
これ     名詞,代名詞,一般,*,*,*,これ,コレ,コレ
クライアント     名詞,固有名詞,一般,*,*,*,client,クライアント,クライアント
保有     名詞,サ変接続,*,*,*,*,保有,ホユウ,ホユー
物理     名詞,一般,*,*,*,*,物理,ブツリ,ブツリ
的       名詞,接尾,形容動詞語幹,*,*,*,的,テキ,テキ
サーバファーム   名詞,固有名詞,一般,*,*,*,サーバファーム,サーバファーム,サーバファーム
比較     名詞,サ変接続,*,*,*,*,比較,ヒカク,ヒカク
AWS      名詞,固有名詞,一般,*,*,*,AWS,アマゾンウェブサービス,アマゾンウェブサービス
大規模   名詞,一般,*,*,*,*,大規模,ダイキボ,ダイキボ
計算     名詞,サ変接続,*,*,*,*,計算,ケイサン,ケイサン
処理     名詞,サ変接続,*,*,*,*,処理,ショリ,ショリ
能力     名詞,一般,*,*,*,*,能力,ノウリョク,ノーリョク
速やか   名詞,形容動詞語幹,*,*,*,*,速やか,スミヤカ,スミヤカ
提供     名詞,サ変接続,*,*,*,*,提供,テイキョウ,テイキョー
こと     名詞,非自立,一般,*,*,*,こと,コト,コト
強み     名詞,一般,*,*,*,*,強み,ツヨミ,ツヨミ

結果をリストで取得したかったので最終的に以下のようになりました。

#!/usr/bin/python
# -*- coding: utf-8 -*-

import MeCab

sentence = """AWSの有名なサービスにAmazon Elastic Compute Cloud (EC2) とAmazon Simple Storage Service (S3) がある。
これまでのクライアントが保有していた物理的なサーバファームと比較してAWSは大規模な計算処理能力を速やかに提供出来ることが強みである。"""

t = MeCab.Tagger('-d /usr/local/lib/mecab/dic/mecab-ipadic-neologd')
t.parse('')
m = t.parseToNode(sentence)

keywords = []

while m:
    if m.feature.split(',')[0] == '名詞':
        keywords.append(m.surface)
    m = m.next

print(keywords)

実行結果

['AWS', '有名', 'サービス', 'Amazon', 'Elastic', 'Compute', 'Cloud', 'EC2', 'Amazon', 'Simple', 'Storage', 'Service', 'S3', 'これ', 'クライアント', '保有', '物理', '的', 'サーバファーム', '比較', 'AWS', '大規模', '計算', '処理', '能力', '速やか', '提供', 'こと', '強み']

おまけ

コードの中で t.parse('') と空文字をパースしていますがこれをしないと以下のようなエラーが発生しました。

UnicodeDecodeError: 'utf-8' codec can't decode byte 0xe0 in position 0: invalid continuation byte

まとめ

今回はMeCabを使って形態素解析をしてみました。 AWSの内容を分かち書きしたかったので、色々試してみたのですが、mecab-ipadic-NEologd の辞書を使うことでいい感じに分かち書きができました。 形態素解析システムは他にも JanomeJUMAN++ などありますが興味がある方は試してみてください。

参考URL