※現在、ブログ記事を移行中のため一部表示が崩れる場合がございます。
順次修正対応にあたっておりますので何卒ご了承いただけますよう、お願い致します。

Pythonから形態素解析システムMeCabを使ってみよう


2018年 04月 01日

自然言語処理をやろうとすると、日本語の場合全ての文字がベタッとくっついているため意味のある最小単位の形態素(単語)に区切ってから処理する必要がある。
そのために、最初に日本語文字列の形態素解析を行う。
ChaSen, KAKASI, MeCab などがあるが、今はMeCabを使うことが多いのではと思う。
とりあえずフリーで使え、よく利用されているMeCabを紹介しようと思う。

インストールついては、環境によって違うので、MeCab公式サイトを参考にして欲しい。

ということで、さっそく使ってみよう。
実行例はUbuntu上である。
$ mecab
吾輩は人工知能である。
吾輩	名詞,代名詞,一般,*,*,*,吾輩,ワガハイ,ワガハイ
は	助詞,係助詞,*,*,*,*,は,ハ,ワ
人工	名詞,一般,*,*,*,*,人工,ジンコウ,ジンコー
知能	名詞,一般,*,*,*,*,知能,チノウ,チノー
で	助動詞,*,*,*,特殊・ダ,連用形,だ,デ,デ
ある	助動詞,*,*,*,五段・ラ行アル,基本形,ある,アル,アル
。	記号,句点,*,*,*,*,。,。,。
EOS

mecab[Return]とすると、入力を受け付けるので、何かを入れて[Return]すると、形態素解析した結果が示され、また次の解析対象文字列の入力待ちになる。
入力した文字列には下線をつけた。
$ mecab -Owakati
吾輩は人工知能である。
吾輩 は 人工 知能 で ある 。

すもももももももものうち
すもも も もも も もも の うち

バナナの謎のなぞなぞなど謎なのだけれどバナナの謎はまだ謎なのだぞ
バナナ の 謎 の なぞなぞ など 謎 な の だ けれど バナナ の 謎 は まだ 謎 な の だ ぞ

厚生労働省医政局総務課医療安全推進室
厚生 労働省 医 政局 総務 課 医療 安全 推進 室

高知県宿毛市愛媛県南宇和郡愛南町篠山小中学校組合立篠山中学校
高知 県 宿毛 市 愛媛 県 南宇和 郡 愛 南町 篠山 小中学校 組合 立 篠山 中学校

大阪府立大学21世紀科学研究機構産学協同高度人材育成センター科学技術駆動型イノベーション創出プレイヤー養成プログラム運営統括
大阪府立大学 21 世紀 科学 研究 機構 産学 協同 高度 人材 育成 センター 科学 技術 駆動 型 イノベーション 創出 プレイヤー 養成 プログラム 運営 統括

…ということ簡単に確認できる。
「医政局」が「医-政局」に分かれてしまったが、このような分かれ方を防止するには、もっと辞書を強化しないといけない。
しかし、辞書を賢くするのは大変な作業になることが多く、通常は妥協して使うことが多い。

AI、自然言語処理ではPythonが使われることが多いので、MeCabをPythonから使いたいものである。
実は、非常に簡単である。

pythonからmecabが使えるようにするには、mecabのインストールが必要だが、やり方は色々あるので説明は省略する。
これもネット上に多数情報があるので、ちょっと探せば分かるはず。

対話モードでPythonを動かし、動作テストした結果を示す。
>>> import MeCab
>>> from pprint import pprint
>>> list = MeCab.Tagger().parse("吾輩は猫である。").split('\n')
>>> pprint(list)
['吾輩\t名詞,代名詞,一般,*,*,*,吾輩,ワガハイ,ワガハイ',
'は\t助詞,係助詞,*,*,*,*,は,ハ,ワ',
'猫\t名詞,一般,*,*,*,*,猫,ネコ,ネコ',
'で\t助動詞,*,*,*,特殊・ダ,連用形,だ,デ,デ',
'ある\t助動詞,*,*,*,五段・ラ行アル,基本形,ある,アル,アル',
'。\t記号,句点,*,*,*,*,。,。,。',
'EOS',
'']
>>> MeCab.Tagger("-Owakati").parse("吾輩は猫である。").split(" ")
['吾輩', 'は', '猫', 'で', 'ある', '。', '\n']
>>>

以上のようにして、テキストを形態素単位に分けてリストに入れることができる。
ここまでできれば、後は好きに弄れると思う。

MeCabの機能、あるいはその他の形態素解析システムの機能は多数あるが、よく使うのは上記の2種類だと思う。
MeCabで前処理をした文章をAIで学習し、何か有用な結果を取り出すのがよくある自然言語利用パターンの1つであろう。