筋トレ大学生によるアウトプット雑記

筋トレや読書のことをはじめとして、プログラミングその他日常生活における様々なことについて書いていきます。

PythonによるMeCabの使い方まとめ

スポンサーリンク

f:id:daimori1005:20191012101035p:plain

こんにちは!
台風でアルバイトが休みになってしまい暇になりました。

今回はMecabの使い方を記事にしていこうと思います。
自分の備忘録も兼ねて、基礎的な使い方を書いていければな~と思っています。

自然言語処理をする方は一度は使うライブラリだと思うので、
みなさんにわかりやすく伝わればいいなといったところですね!

それではご覧ください。

f:id:daimori1005:20191012102325j:plain

スポンサーリンク



MeCabとは?

MeCabとは形態素解析エンジンのことを指します。
言語において意味を持つ最小単位のことを形態素と言い、文章をこれに分割することを形態素解析と言います。

MeCabは、現在世に知れ渡っている形態素解析エンジンの中で、最も有名と言っても過言ではありません。

仕組みとしては、

  • ラティス構造とビタビアルゴリズムによる解析結果の推定
  • CRF(系列ラベリング)を用いたコスト算出

から成り立っています。

Mecabの基本的な使い方

基本的な使い方を説明していきます。

今回使う文章は、

「日本政府に引き取られた難民は、定住促進センターで、生まれて初めての日本語を、来日からわずか3カ月間学習の後、満足な職業訓練もないまま、まったく異質な社会に投げ出される。」

です。

MeCabには出力モードが4つ存在します。
それぞれ解説していきます。

デフォルト出力

import MeCab
m = MeCab.Tagger("mecabrc")
 
line = "日本政府に引き取られた難民は、定住促進センターで、生まれて初めての日本語を、来日からわずか3カ月間学習の後、満足な職業訓練もないまま、まったく異質な社会に投げ出される。"
print(m.parse(line))

ソースコードは上記のようになります。
Taggerの所に、mecabrcと書くとデフォルト出力となります。

実行結果は、

日本  名詞,固有名詞,地域,国,*,*,日本,ニッポン,ニッポン
政府  名詞,一般,*,*,*,*,政府,セイフ,セイフ
に   助詞,格助詞,一般,*,*,*,に,ニ,ニ
引き取ら    動詞,自立,*,*,五段・ラ行,未然形,引き取る,ヒキトラ,ヒキトラ
れ   動詞,接尾,*,*,一段,連用形,れる,レ,レ
た   助動詞,*,*,*,特殊・タ,基本形,た,タ,タ
難民  名詞,一般,*,*,*,*,難民,ナンミン,ナンミン
は   助詞,係助詞,*,*,*,*,は,ハ,ワ
、   記号,読点,*,*,*,*,、,、,、
定住  名詞,サ変接続,*,*,*,*,定住,テイジュウ,テイジュー
促進  名詞,サ変接続,*,*,*,*,促進,ソクシン,ソクシン
センター    名詞,一般,*,*,*,*,センター,センター,センター
で   助詞,格助詞,一般,*,*,*,で,デ,デ
、   記号,読点,*,*,*,*,、,、,、
生まれ 動詞,自立,*,*,一段,連用形,生まれる,ウマレ,ウマレ
て   助詞,接続助詞,*,*,*,*,て,テ,テ
初めて 副詞,一般,*,*,*,*,初めて,ハジメテ,ハジメテ
の   助詞,連体化,*,*,*,*,の,ノ,ノ
日本語 名詞,一般,*,*,*,*,日本語,ニホンゴ,ニホンゴ
を   助詞,格助詞,一般,*,*,*,を,ヲ,ヲ
、   記号,読点,*,*,*,*,、,、,、
来日  名詞,サ変接続,*,*,*,*,来日,ライニチ,ライニチ
から  助詞,格助詞,一般,*,*,*,から,カラ,カラ
わずか 副詞,助詞類接続,*,*,*,*,わずか,ワズカ,ワズカ
3   名詞,数,*,*,*,*,3,サン,サン
カ月  名詞,接尾,助数詞,*,*,*,カ月,カゲツ,カゲツ
間   名詞,接尾,一般,*,*,*,間,カン,カン
学習  名詞,サ変接続,*,*,*,*,学習,ガクシュウ,ガクシュー
の   助詞,連体化,*,*,*,*,の,ノ,ノ
後   名詞,非自立,副詞可能,*,*,*,後,ノチ,ノチ
、   記号,読点,*,*,*,*,、,、,、
満足  名詞,形容動詞語幹,*,*,*,*,満足,マンゾク,マンゾク
な   助動詞,*,*,*,特殊・ダ,体言接続,だ,ナ,ナ
職業  名詞,一般,*,*,*,*,職業,ショクギョウ,ショクギョー
訓練  名詞,サ変接続,*,*,*,*,訓練,クンレン,クンレン
も   助詞,係助詞,*,*,*,*,も,モ,モ
ない  形容詞,自立,*,*,形容詞・アウオ段,基本形,ない,ナイ,ナイ
まま  名詞,非自立,副詞可能,*,*,*,まま,ママ,ママ
、   記号,読点,*,*,*,*,、,、,、
まったく    副詞,助詞類接続,*,*,*,*,まったく,マッタク,マッタク
異質  名詞,形容動詞語幹,*,*,*,*,異質,イシツ,イシツ
な   助動詞,*,*,*,特殊・ダ,体言接続,だ,ナ,ナ
社会  名詞,一般,*,*,*,*,社会,シャカイ,シャカイ
に   助詞,格助詞,一般,*,*,*,に,ニ,ニ
投げ出さ    動詞,自立,*,*,五段・サ行,未然形,投げ出す,ナゲダサ,ナゲダサ
れる  動詞,接尾,*,*,一段,基本形,れる,レル,レル
。   記号,句点,*,*,*,*,。,。,。
EOS


いい感じですね。
MeCabはとても優秀だと思います。

Chasen互換形式出力

Chasenも形態素解析ツールの1つです。
MeCabは元々Chasenをベースに作られました。(今は違います)

import MeCab
m = MeCab.Tagger("-Ochasen")
 
line = "日本政府に引き取られた難民は、定住促進センターで、生まれて初めての日本語を、来日からわずか3カ月間学習の後、満足な職業訓練もないまま、まったく異質な社会に投げ出される。"
print(m.parse(line))

ソースは上記のようになります。
"-Ochasen"を付けることでChasen互換形式での出力です。

日本  ニッポン    日本  名詞-固有名詞-地域-国        
政府  セイフ 政府  名詞-一般       
に   ニ   に   助詞-格助詞-一般       
引き取ら    ヒキトラ    引き取る    動詞-自立   五段・ラ行   未然形
れ   レ   れる  動詞-接尾   一段  連用形
た   タ   た   助動詞 特殊・タ    基本形
難民  ナンミン    難民  名詞-一般       
は   ハ   は   助詞-係助詞      
、   、   、   記号-読点       
定住  テイジュウ   定住  名詞-サ変接続     
促進  ソクシン    促進  名詞-サ変接続     
センター    センター    センター    名詞-一般       
で   デ   で   助詞-格助詞-一般       
、   、   、   記号-読点       
生まれ ウマレ 生まれる    動詞-自立   一段  連用形
て   テ   て   助詞-接続助詞     
初めて ハジメテ    初めて 副詞-一般       
の   ノ   の   助詞-連体化      
日本語 ニホンゴ    日本語 名詞-一般       
を   ヲ   を   助詞-格助詞-一般       
、   、   、   記号-読点       
来日  ライニチ    来日  名詞-サ変接続     
から  カラ  から  助詞-格助詞-一般       
わずか ワズカ わずか 副詞-助詞類接続        
3   サン  3   名詞-数        
カ月  カゲツ カ月  名詞-接尾-助数詞       
間   カン  間   名詞-接尾-一般        
学習  ガクシュウ   学習  名詞-サ変接続     
の   ノ   の   助詞-連体化      
後   ノチ  後   名詞-非自立-副詞可能     
、   、   、   記号-読点       
満足  マンゾク    満足  名詞-形容動詞語幹       
な   ナ   だ   助動詞 特殊・ダ    体言接続
職業  ショクギョウ  職業  名詞-一般       
訓練  クンレン    訓練  名詞-サ変接続     
も   モ   も   助詞-係助詞      
ない  ナイ  ない  形容詞-自立  形容詞・アウオ段    基本形
まま  ママ  まま  名詞-非自立-副詞可能     
、   、   、   記号-読点       
まったく    マッタク    まったく    副詞-助詞類接続        
異質  イシツ 異質  名詞-形容動詞語幹       
な   ナ   だ   助動詞 特殊・ダ    体言接続
社会  シャカイ    社会  名詞-一般       
に   ニ   に   助詞-格助詞-一般       
投げ出さ    ナゲダサ    投げ出す    動詞-自立   五段・サ行   未然形
れる  レル  れる  動詞-接尾   一段  基本形
。   。   。   記号-句点       
EOS

出力は上記。
僕はChasen出力の方が好きです。

ただ出力をそのまま使う場合、品詞は2回 split する必要があり少し取り出しにくいですね。

分かち書き出力

次は分かち書きです。
僕が研究を始めてから一番使ってるやつです。

import MeCab
m = MeCab.Tagger("-Owakati")
 
line = "日本政府に引き取られた難民は、定住促進センターで、生まれて初めての日本語を、来日からわずか3カ月間学習の後、満足な職業訓練もないまま、まったく異質な社会に投げ出される。"
print(m.parse(line))

"-Owakati"を付けると分かち書きです。

日本 政府 に 引き取ら れ た 難民 は 、 定住 促進 センター で 、 生まれ て 初めて の 日本語 を 、
来日 から わずか 3 カ月 間 学習 の 後 、 
満足 な 職業 訓練 も ない まま 、 まったく 異質 な 社会 に 投げ出さ れる 。

見やすいように途中で改行してます。
単純に分かち書きしてくれます。
語義判別とか文書分類とかではかなり重宝します。

読み出力

読みをカタカナで出力するモードです。

import MeCab
m = MeCab.Tagger("-Oyomi")
 
line = "日本政府に引き取られた難民は、定住促進センターで、生まれて初めての日本語を、来日からわずか3カ月間学習の後、満足な職業訓練もないまま、まったく異質な社会に投げ出される。"
print(m.parse(line))

"-Oyomi"です。

ニッポンセイフニヒキトラレタナンミンハ、テイジュウソクシンセンターデ、
ウマレテハジメテノニホンゴヲ、ライニチカラワズカサンカゲツカンガクシュウノノチ、
マンゾクナショクギョウクンレンモナイママ、マッタクイシツナシャカイニナゲダサレル。

あんまり使わないかな?って感じ。

注意点

Mecabなんですが、parseにかけたあとに改行コードが付与されてしまいます。

もし大規模データをMecabで扱う場合は、parseにかけた後、rstrip()を必ずしましょう。

ParseToNodeを使う方法

import MeCab
m = MeCab.Tagger("-Ochasen")
 
line = "日本政府に引き取られた難民は、定住促進センターで、生まれて初めての日本語を、来日からわずか3カ月間学習の後、満足な職業訓練もないまま、まったく異質な社会に投げ出される。"
node = m.parseToNode(line)
while node:
    print(node.surface,node.feature.split(",")[0])
    node = node.next

surfaceは表層形(文章で使われているそのままの形)を返します。
featureは、詳細情報を返します。

featureは下記のような順番で出力されます。

品詞,品詞細分類1,品詞細分類2,品詞細分類3,活用形,活用型,原形,読み,発音

今回のソースでは、","でsplitをかけた後にインデックス[0]を取り出しているので、品詞を取り出しています。
出力した結果は以下のようになります。

 BOS/EOS
日本 名詞
政府 名詞
に 助詞
引き取ら 動詞
れ 動詞
た 助動詞
難民 名詞
は 助詞
、 記号
定住 名詞
促進 名詞
センター 名詞
で 助詞
、 記号
生まれ 動詞
て 助詞
初めて 副詞
の 助詞
日本語 名詞
を 助詞
、 記号
来日 名詞
から 助詞
わずか 副詞
3 名詞
カ月 名詞
間 名詞
学習 名詞
の 助詞
後 名詞
、 記号
満足 名詞
な 助動詞
職業 名詞
訓練 名詞
も 助詞
ない 形容詞
まま 名詞
、 記号
まったく 副詞
異質 名詞
な 助動詞
社会 名詞
に 助詞
投げ出さ 動詞
れる 動詞
。 記号
 BOS/EOS

特定の情報だけ取り出したい場合など、parseToNodeを使うと簡潔にプログラムを書くことができます。

ただし、parseToNodeはparseに比べてかなり遅いというデメリットがあります。
短い文章ではあまり影響はありませんが、大規模データを扱う場合には注意が必要です。

まとめ

いかがでしたか?

今回は形態素解析エンジンであるMeCabの使い方を記事にしました。

自然言語処理では必須のライブラリです。

自分の備忘録も兼ねて記事にしましたが、Mecabを初めて使う方々に読んでいただいてお役に立てれば幸いです。
また、こちらの記事もおすすめです。

www.i-like-output.work
www.i-like-output.work


それでは!

スポンサーリンク