Python3で形態素解析エンジンMeCabを使ってみた
形態素解析エンジンMeCabをPython3から使ってみましたのでご紹介します。
環境
- macOS 10.13.6
- Python 3.6.4
準備
MeCabと辞書と、mecab-python3をインストール
1 2 | $ 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 を確認してみてください。
1 2 3 | $ git clone --depth 1 git@github.com:neologd/mecab-ipadic-neologd.git$ cd mecab-ipadic-neologd$ ./bin/install-mecab-ipadic-neologd -n |
インストール先は以下コマンドで確認できます。
1 2 | $ echo `mecab-config --dicdir`"/mecab-ipadic-neologd"/usr/local/lib/mecab/dic/mecab-ipadic-neologd |
やってみる
インストールができたのでPython3で形態素解析をやっていきたいと思います。 解析する文章はウィキペディアの以下の文で試してみました。
AWSの有名なサービスにAmazon Elastic Compute Cloud (EC2) とAmazon Simple Storage Service (S3) がある。これまでのクライアントが保有していた物理的なサーバファームと比較してAWSは大規模な計算処理能力を速やかに提供出来ることが強みである。
1 2 3 4 5 6 7 8 9 10 | #!/usr/bin/python# -*- coding: utf-8 -*-import MeCabsentence = """AWSの有名なサービスにAmazon Elastic Compute Cloud (EC2) とAmazon Simple Storage Service (S3) がある。これまでのクライアントが保有していた物理的なサーバファームと比較してAWSは大規模な計算処理能力を速やかに提供出来ることが強みである。"""t = MeCab.Tagger('')print(t.parse(sentence)) |
実行結果
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 | AWS 名詞,固有名詞,組織,*,*,*,*の 助詞,連体化,*,*,*,*,の,ノ,ノ有名 名詞,形容動詞語幹,*,*,*,*,有名,ユウメイ,ユーメイな 助動詞,*,*,*,特殊・ダ,体言接続,だ,ナ,ナサービス 名詞,サ変接続,*,*,*,*,サービス,サービス,サービスに 助詞,格助詞,一般,*,*,*,に,ニ,ニAmazon 名詞,一般,*,*,*,*,*Elastic 名詞,一般,*,*,*,*,*Compute 名詞,一般,*,*,*,*,*Cloud 名詞,一般,*,*,*,*,*( 名詞,サ変接続,*,*,*,*,*EC 名詞,一般,*,*,*,*,*2 名詞,数,*,*,*,*,*) 名詞,サ変接続,*,*,*,*,*と 助詞,並立助詞,*,*,*,*,と,ト,トAmazon 名詞,固有名詞,組織,*,*,*,*Simple 名詞,一般,*,*,*,*,*Storage 名詞,一般,*,*,*,*,*Service 名詞,一般,*,*,*,*,*( 名詞,サ変接続,*,*,*,*,*S 名詞,一般,*,*,*,*,*3 名詞,数,*,*,*,*,*) 名詞,サ変接続,*,*,*,*,*が 助詞,格助詞,一般,*,*,*,が,ガ,ガある 動詞,自立,*,*,五段・ラ行,基本形,ある,アル,アル。 記号,句点,*,*,*,*,。,。,。これ 名詞,代名詞,一般,*,*,*,これ,コレ,コレまで 助詞,副助詞,*,*,*,*,まで,マデ,マデの 助詞,連体化,*,*,*,*,の,ノ,ノクライアント 名詞,一般,*,*,*,*,*が 助詞,格助詞,一般,*,*,*,が,ガ,ガ保有 名詞,サ変接続,*,*,*,*,保有,ホユウ,ホユーし 動詞,自立,*,*,サ変・スル,連用形,する,シ,シて 助詞,接続助詞,*,*,*,*,て,テ,テい 動詞,非自立,*,*,一段,連用形,いる,イ,イた 助動詞,*,*,*,特殊・タ,基本形,た,タ,タ物理 名詞,一般,*,*,*,*,物理,ブツリ,ブツリ的 名詞,接尾,形容動詞語幹,*,*,*,的,テキ,テキな 助動詞,*,*,*,特殊・ダ,体言接続,だ,ナ,ナサーバ 名詞,一般,*,*,*,*,サーバ,サーバ,サーバファーム 名詞,一般,*,*,*,*,ファーム,ファーム,ファームと 助詞,格助詞,一般,*,*,*,と,ト,ト比較 名詞,サ変接続,*,*,*,*,比較,ヒカク,ヒカクし 動詞,自立,*,*,サ変・スル,連用形,する,シ,シて 助詞,接続助詞,*,*,*,*,て,テ,テAWS 名詞,一般,*,*,*,*,*は 助詞,係助詞,*,*,*,*,は,ハ,ワ大 接頭詞,名詞接続,*,*,*,*,大,ダイ,ダイ規模 名詞,一般,*,*,*,*,規模,キボ,キボな 助動詞,*,*,*,特殊・ダ,体言接続,だ,ナ,ナ計算 名詞,サ変接続,*,*,*,*,計算,ケイサン,ケイサン処理 名詞,サ変接続,*,*,*,*,処理,ショリ,ショリ能力 名詞,一般,*,*,*,*,能力,ノウリョク,ノーリョクを 助詞,格助詞,一般,*,*,*,を,ヲ,ヲ速やか 名詞,形容動詞語幹,*,*,*,*,速やか,スミヤカ,スミヤカに 助詞,副詞化,*,*,*,*,に,ニ,ニ提供 名詞,サ変接続,*,*,*,*,提供,テイキョウ,テイキョー出来る 動詞,自立,*,*,一段,基本形,出来る,デキル,デキルこと 名詞,非自立,一般,*,*,*,こと,コト,コトが 助詞,格助詞,一般,*,*,*,が,ガ,ガ強み 名詞,一般,*,*,*,*,強み,ツヨミ,ツヨミで 助動詞,*,*,*,特殊・ダ,連用形,だ,デ,デある 助動詞,*,*,*,五段・ラ行アル,基本形,ある,アル,アル。 記号,句点,*,*,*,*,。,。,。EOS |
EC2やS3が分かれてしまっていますので mecab-ipadic-NEologd の辞書を使用してみました。
1 2 3 4 5 6 7 8 9 10 | #!/usr/bin/python# -*- coding: utf-8 -*-import MeCabsentence = """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)) |
実行結果
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 | 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 を使うのが良さそうです。
解析できましたが、特定の品詞だけ欲しい場合もあるかと思います。 以下のようにして名詞のみ取得してみました。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | #!/usr/bin/python# -*- coding: utf-8 -*-import MeCabsentence = """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 |
実行結果
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 | AWS 名詞,固有名詞,一般,*,*,*,AWS,アマゾンウェブサービス,アマゾンウェブサービス有名 名詞,形容動詞語幹,*,*,*,*,有名,ユウメイ,ユーメイサービス 名詞,サ変接続,*,*,*,*,サービス,サービス,サービスAmazon 名詞,固有名詞,一般,*,*,*,Amazon,アマゾン,アマゾンElastic 名詞,固有名詞,一般,*,*,*,Elastic,エラスティック,エラスティックCompute 名詞,一般,*,*,*,*,*Cloud 名詞,一般,*,*,*,*,*EC2 名詞,固有名詞,一般,*,*,*,EC2,イーシーツー,イーシーツーAmazon 名詞,固有名詞,一般,*,*,*,Amazon,アマゾン,アマゾンSimple 名詞,固有名詞,一般,*,*,*,Simple,シンプル,シンプルStorage 名詞,一般,*,*,*,*,*Service 名詞,一般,*,*,*,*,*S3 名詞,固有名詞,人名,一般,*,*,S3,エススリーマイルスボニーアンドブレンクシナトラ,エススリーマイルスボニーアンドブレンクシナトラこれ 名詞,代名詞,一般,*,*,*,これ,コレ,コレクライアント 名詞,固有名詞,一般,*,*,*,client,クライアント,クライアント保有 名詞,サ変接続,*,*,*,*,保有,ホユウ,ホユー物理 名詞,一般,*,*,*,*,物理,ブツリ,ブツリ的 名詞,接尾,形容動詞語幹,*,*,*,的,テキ,テキサーバファーム 名詞,固有名詞,一般,*,*,*,サーバファーム,サーバファーム,サーバファーム比較 名詞,サ変接続,*,*,*,*,比較,ヒカク,ヒカクAWS 名詞,固有名詞,一般,*,*,*,AWS,アマゾンウェブサービス,アマゾンウェブサービス大規模 名詞,一般,*,*,*,*,大規模,ダイキボ,ダイキボ計算 名詞,サ変接続,*,*,*,*,計算,ケイサン,ケイサン処理 名詞,サ変接続,*,*,*,*,処理,ショリ,ショリ能力 名詞,一般,*,*,*,*,能力,ノウリョク,ノーリョク速やか 名詞,形容動詞語幹,*,*,*,*,速やか,スミヤカ,スミヤカ提供 名詞,サ変接続,*,*,*,*,提供,テイキョウ,テイキョーこと 名詞,非自立,一般,*,*,*,こと,コト,コト強み 名詞,一般,*,*,*,*,強み,ツヨミ,ツヨミ |
結果をリストで取得したかったので最終的に以下のようになりました。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 | #!/usr/bin/python# -*- coding: utf-8 -*-import MeCabsentence = """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.nextprint(keywords) |
実行結果
1 | ['AWS', '有名', 'サービス', 'Amazon', 'Elastic', 'Compute', 'Cloud', 'EC2', 'Amazon', 'Simple', 'Storage', 'Service', 'S3', 'これ', 'クライアント', '保有', '物理', '的', 'サーバファーム', '比較', 'AWS', '大規模', '計算', '処理', '能力', '速やか', '提供', 'こと', '強み'] |
おまけ
コードの中で t.parse('') と空文字をパースしていますがこれをしないと以下のようなエラーが発生しました。
1 | UnicodeDecodeError: 'utf-8' codec can't decode byte 0xe0 in position 0: invalid continuation byte |
まとめ
今回はMeCabを使って形態素解析をしてみました。 AWSの内容を分かち書きしたかったので、色々試してみたのですが、mecab-ipadic-NEologd の辞書を使うことでいい感じに分かち書きができました。 形態素解析システムは他にも Janome や JUMAN++ などありますが興味がある方は試してみてください。