アオカケスの鳥かご

日々の出来事を綴っていきたい

【Ubuntu18.04】python3で形態素解析する

昔作った形態素解析Pythonプログラムを久しぶりに動かしてみようとしたら動きませんでした。
昔と今では実行環境が変わっているのでなんとか動くようにします。


今までは純粋なMecabしか使っていませんでしたが、良い機会なのでmecab-ipadic-NEologdを導入します。

以下はgithubmecab-ipadic-NEologdの説明。

mecab-ipadic-NEologd は、多数のWeb上の言語資源から得た新語を追加することでカスタマイズした MeCab 用のシステム辞書です。

通常の辞書では思い通りに形態素解析してくれないことが多いものですが、NEologdはかなり良い感じに形態素解析してくれます。
とくに固有名詞なんかは強い印象。

辞書の自動更新なんかもできるようなので頼もしいですね。

導入

導入にはこちらを参考にさせて頂きました。
qiita.com

MecabとNEologdをインストールします。
NEologdをインストールするときにメモリが足りずに失敗することがあるので注意してください。

2GBはないと無理っぽいです。

$ sudo apt install aptitude
$ sudo aptitude install mecab libmecab-dev mecab-ipadic-utf8 git make curl xz-utils file
$ git clone --depth 1 https://github.com/neologd/mecab-ipadic-neologd.git
$ cd mecab-ipadic-neologd
$ ./bin/install-mecab-ipadic-neologd -n -a

mecab-python3をインストール

$ sudo apt  install swig
$ sudo pip3 install mecab-python3

mecab-ipadic-neologdのパスを調べておきます。

$ echo `mecab-config --dicdir`"/mecab-ipadic-neologd"

こちらのサイトのプログラムをそのままお借りして動かしてみます。
dev.classmethod.jp

実行結果。
f:id:aokakes:20190118201337p:plain

本来は名詞だけを出力するはずですが、なんだかよく分からないことになっています。
辞書のパス以外は全く同じなのに結果は全く違います。

別の環境でMecabのインストールからやり直して同じプログラムを実行してみましたが結果は変わりませんでした。
どうやら形態素解析自体は問題無いようで、解析したものをwhile文で回したときに怪しい動きをしています。

仕様が変わったのか、私の導入の仕方が悪かったのか...
なぜでしょう。

このままだと気持ち悪いので自分なりに同じような動きをするプログラムを用意しました。

# coding: utf-8
import MeCab
import sys

def wether(text):
	#textを形態素解析して、名詞のみのリストを返す
	tagger = MeCab.Tagger ('-d /usr/lib/x86_64-linux-gnu/mecab/dic/mecab-ipadic-neologd') #使用する辞書
	tagger.parse('')
	results = tagger.parse(text).replace('	',',').replace('EOS','').split() #形態素解析してリストに格納

	#微妙に整形
	for idx, result in enumerate(results):
		results[idx] = result.split(',')

	keywords = []   #targetで抽出したものを格納するリスト
	target = "名詞"     #名詞を抽出

	for result in results:
		if result[1] == target:
			keywords.append(result[0])
	return keywords

text = '艦隊これくしょんは最高だな。'
keywords = wether(text)

for i in keywords:
	print(i)

実行結果。
f:id:aokakes:20190118204124p:plain

こっちのほうがスッキリ書けるような気がしますけど、どうなんでしょう。
個人的にはもうこれでいいじゃんと思っています。

まとめ

なんだか変に苦労したような気がします。

形態素解析は色んなところに繋げていけるので便利ですね。
自然言語処理には必須ですし、1つあれば何かと便利なプログラムです(たぶん)。