イノベーション エンジニアブログ


株式会社イノベーションのエンジニアたちの技術系ブログです


このエントリーをはてなブックマークに追加

今更ながらPythonとMeCabで形態素解析してみた

こんにちは、夏ですね!
先日キャンプに行ってきたのですが、買い出しの時にしれっと餃子を入れた中村です。

今回は形態素解析からキーワードを抽出してみたお話をしたいと思います。

形態素解析とは?

形態素解析(けいたいそかいせき、Morphological Analysis)とは、文法的な情報の注記の無い自然言語のテキストデータ(文)から、対象言語の文法や、辞書と呼ばれる単語の品詞等の情報にもとづき、形態素(Morpheme, おおまかにいえば、言語で意味を持つ最小単位)の列に分割し、それぞれの形態素の品詞等を判別する作業である。

弊社では「ITトレンド」というIT製品の比較サイトを運営しているのですが、
各コンテンツの形態素解析を行うことで、ユーザーがどのようなものに興味があるのかを分析できるのではと思い
勉強の為にも今回試してみることにしました。

目標

・URLを指定すると、キーワードを抽出してくれる
・APIは使わない(リクエスト回数などに制限があるため)

全くの初心者ですが、頑張ります!(笑)

なぜMeCabにしたか?

MeCabとは…

MeCabはオープンソースの形態素解析エンジンで、奈良先端科学技術大学院大学出身、現GoogleソフトウェアエンジニアでGoogle 日本語入力開発者の一人である工藤拓[1][2]によって開発されている。名称は開発者の好物「和布蕪(めかぶ)」から取られた。

ウィキペディア参照 https://ja.wikipedia.org/wiki/MeCab

だそうです。
今回選定した理由としては、以下の3つになります。

・フリーの日本語形態素解析エンジンとしてメジャーな存在
・Pythonで使える
・追加学習なども可能

ちなみに対応言語としては、C C# C++ Java Perl Python Ruby R だそうです。
詳しくはこちら http://taku910.github.io/mecab/

それでは早速やってみましょ〜

環境

・macOS Sierra 10.12.4
・Python 3.6.2
・Homebrewがインストールされていること

①MeCabをインストール

$ brew install mecab-ipadic

とっても簡単ですね!
MeCabでIPA辞書を使用するために必要なコマンドですが、依存関係にあるMeCabもちゃんとインストールされます。

以下のコマンドでバージョンが表示されれば、無事インストール完了です。

$ mecab -v
mecab of 0.996

使い方は非常に簡単で、ターミナル上で「mecab」と入力後に文章を入力するだけで結果が表示されます。

$ mecab
すもももももももものうち
すもも	名詞,一般,*,*,*,*,すもも,スモモ,スモモ
も	助詞,係助詞,*,*,*,*,も,モ,モ
もも	名詞,一般,*,*,*,*,もも,モモ,モモ
も	助詞,係助詞,*,*,*,*,も,モ,モ
もも	名詞,一般,*,*,*,*,もも,モモ,モモ
の	助詞,連体化,*,*,*,*,の,ノ,ノ
うち	名詞,非自立,副詞可能,*,*,*,うち,ウチ,ウチ
EOS

いいですね〜。
次はPythonで実行してみましょう。

②mecab-python3をインストール

pip install mecab-python3

試してみる。

$ python3
Python 3.6.2 (v3.6.2:5fd33b5926, Jul 16 2017, 20:11:06)
[GCC 4.2.1 (Apple Inc. build 5666) (dot 3)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> import MeCab
>>> m = MeCab.Tagger()
>>> print(m.parse("すもももももももものうち"))
すもも	名詞,一般,*,*,*,*,すもも,スモモ,スモモ
も	助詞,係助詞,*,*,*,*,も,モ,モ
もも	名詞,一般,*,*,*,*,もも,モモ,モモ
も	助詞,係助詞,*,*,*,*,も,モ,モ
もも	名詞,一般,*,*,*,*,もも,モモ,モモ
の	助詞,連体化,*,*,*,*,の,ノ,ノ
うち	名詞,非自立,副詞可能,*,*,*,うち,ウチ,ウチ
EOS

いい感じです!

③URLを指定すると解析結果を出力させる

流れとしてはこんな感じにします。

URLを指定 ⇒ title, description, h1 の内容を取得 ⇒ MeCabで解析

ページの全テキストを対象としても良かったのですが、
重要なワードが入っていそうな箇所に絞ってみました。

また今回は「キーワード」を抽出したいので、品詞が「名詞」のもののみ出力させることにします。

以下コードになります。

01.png

get_keywords_mecab.py

説明はコメントに記載させていただいたので省略させていただきます。

早速実行してみましょう。
今回の対象ページは「http://it-trend.jp/erp」にしてみます。
対象のテキスト(title, description, h1を繋げたもの)はこんな感じです。

ERPとは?パッケージ製品を一覧から徹底比較、無料で資料請求|ITトレンドERPとはEnterprise Resource Planningの略称で、企業の資産である人・モノ・カネを一元管理し、経営の効率化を図るための製品です。業種・業態に特化した製品もあるため、しっかりと比較検討して、自社に最適なERPを選びましょう。ERPの製品一覧

それでは実行してみます。

$ python3 get_keywords_mecab.py http://it-trend.jp/erp
['徹底',
 'Resource',
 '検討',
 '最適',
 '略称',
 'Enterprise',
 '経営',
 '特',
 '人',
 'カネ',
 '製品',
 '業態',
 '資産',
 'モノ',
 'Planning',
 '比較',
 '業種',
 '自社',
 'トレンド',
 '無料',
 '効率',
 '化',
 '一元',
 '一覧',
 'IT',
 '請求',
 'パッケージ',
 '企業',
 'ERP',
 '管理',
 'ため',
 '資料']

あれ。なんか微妙ですね。

④辞書登録する

何が微妙かっていうと、一部の単語が分割されてしまっていること。

「ITトレンド」 ⇒ IT、トレンド

は仕方ないとしても、

「特化」 ⇒ 特、化

ってなんだよ!
っていう感じなのでこのままだと使えなそうです。

色々調べてみると、どうやらMeCabにインストールした辞書に、さらにユーザー登録として辞書が追加できるとのこと。やってみます。

$ mecab-config --dicdir    ←辞書ディレクトリの確認
/usr/local/lib/mecab/dic

$ cd /usr/local/lib/mecab/dic
$ mkdir userdic        ←追加用の辞書ディレクトリを作成
$ cd userdic
$ touch add.csv        ←CSV新規作成

作成したディレクトリにCSVファイルを作成します。
CSVの形式も品詞により異なるそうなのですが、今回対象となる名詞の場合は以下のようになるそうです。

登録したい名詞,ID,ID,重み,品詞,品詞の説明,*,*,*,*,登録したい名詞,カタカナ表示,カタカナ表記

例えば「ITトレンド」という単語を登録する場合には、

ITトレンド,,,1,名詞,一般,*,*,*,*,ITトレンド,アイティートレンド,アイティートレンド

こんな感じで大丈夫です。
(重み付けは適当に1としています)

次に作成したCSVをコンパイルし、辞書ファイルを生成します。

$ mecab-config --libexecdir ←exeファイルのディレクトリ確認
/usr/local/Cellar/mecab/0.996/libexec/mecab

$ /usr/local/Cellar/mecab/0.996/libexec/mecab/mecab-dict-index \
-d /usr/local/lib/mecab/dic/ipadic \
-u /usr/local/lib/mecab/dic/userdic/add.dic \
-f utf-8 \
-t utf-8 \
add.csv

reading add.csv ... 8
emitting double-array: 100% |###########################################|

done!

最後に生成された辞書を使うようにMeCab側に設定を追加します。

$ vi /usr/local/etc/mecabrc

;
; Configuration file of MeCab
;
; $Id: mecabrc.in,v 1.3 2006/05/29 15:36:08 taku-ku Exp $;
;
dicdir =  /usr/local/lib/mecab/dic/ipadic

userdic = /usr/local/lib/mecab/dic/userdic/add.dic   ←ここのコメントを取りパスを変更する

; output-format-type = wakati
; input-buffer-size = 8192

; node-format = %m\n
; bos-format = %S\n
; eos-format = EOS\n

それではもう一度やってみましょう〜

$ python3 get_keywords_mecab.py http://it-trend.jp/erp
['無料',
 '資料請求',
 '製品',
 '資産',
 '企業',
 '業態',
 'モノ',
 '検討',
 '効率化',
 'カネ',
 'パッケージ',
 '業種',
 '略称',
 '一覧',
 '人',
 'ERP',
 'Planning',
 '比較',
 '経営',
 'Enterprise',
 '徹底比較',
 '一元管理',
 '自社',
 '最適',
 'ITトレンド',
 'Resource',
 '特化',
 'ため']

大分良くなりました!

感想

今回初めて形態素解析を試してみましたが、一連の流れはできたのでひとまず良かったです。

形態素解析をやってみたきっかけの「ITトレンドユーザー分析」までは出来ていませんが、ITトレンドのPVデータと今回の抽出した結果を掛け合わせるなどしてこれから分析していきたいと思います。

実は重み付けの部分も意識して試行錯誤してみたんですが、そのあたりは上手くいかず今回のブログには載せられなかったので、また挑戦してみたいと思います!

こちらからは以上です!