【Ubuntu18.04】python3で形態素解析する
昔作った形態素解析のPythonプログラムを久しぶりに動かしてみようとしたら動きませんでした。
昔と今では実行環境が変わっているのでなんとか動くようにします。
今までは純粋なMecabしか使っていませんでしたが、良い機会なのでmecab-ipadic-NEologdを導入します。
以下はgithubのmecab-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
実行結果。
本来は名詞だけを出力するはずですが、なんだかよく分からないことになっています。
辞書のパス以外は全く同じなのに結果は全く違います。
別の環境で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)
実行結果。
こっちのほうがスッキリ書けるような気がしますけど、どうなんでしょう。
個人的にはもうこれでいいじゃんと思っています。