こんにちは。エンジニアの梶野です。
昔からある技術ですが、最近になって触れる機会があったので形態素解析について書きたいと思います。
「形態素解析って何?」という方の為に軽く説明すると、「文章」を「辞書」を使って「形態素(言語で意味を持つ最小単位)」に分割、分類する作業と言えます。
例えば「これはペンです」という文章を形態素解析すると「これ/は/ペン/です」といった感じで分割されることになります。
どんなところで使っているのか?
形態素解析は自然言語処理、検索、テキストマイニング、かな漢字変換など色々な場面で利用されます。
Web の分野で具体例を出すならば、CMS の記事の自動タグ付け機能やキュレーションサービスなどが挙げられます。
MeCab
MeCab はオープンソースの形態素解析エンジンです。 今回はこの MeCab を使って文章から単語を抽出していきます。 インストール手順は Mac の環境では下記にようになります。
$ brew install mecab mecab-ipadic
「えッ!これだけで形態素解析できるの? 」というほど簡単ですが、これでできてしまいます。
使い方も簡単で CLI から使うなら mecab と入力したあと形態素解析にかけたい文字列を入力して Enter を押せば終わりです。
辞書ファイルとライセンス
さてここで先ほど試しに実行してみた文字列の分割結果を見てみます。
「ドナルド・トランプが米大統領選挙で勝利!」の入力に対して、「ドナルド/・/トランプ/が/米/大統領/選挙/で/勝利/!」というふうに分割されました。
しかし、これがタイトルをもとに記事を分類するという処理だったと仮定すると、この結果は適切とは言えません。
なぜなら、欲しい結果は「ドナルド・トランプ」という固有名詞であって「ドナルド」、「トランプ」という分割された名詞ではないからです。
前者が抽出できなければ、この文字列は某ファストフード店やカードゲームに分類されてしまうかもしれません。
なぜ、このようなことになるのか。それは分割に使用している辞書情報に「ドナルド・トランプ」という固有名詞が存在しないからです。
上記のインストール作業では MeCab の標準として広く使用されている IPA 辞書を使っています。
この辞書は優秀ではありますが新語・固有名詞の解析には向いていません。これはニュースなどの解析には致命的です。
解決方法は簡単です。辞書を変えればいいのです。
何かいい辞書はないだろうか。と探してみると良さそうなものを見つけました。
- ・ mecab-ipadic-NEologd → Apache Licence 2.0
mecab-ipadic-NEologd は IPA 辞書を拡張した MeCab のシステム辞書です。新語・固有名詞が160万語以上再録されているとのこと。
下記の手順でインストールし、インストール先を確認してみます。
$ git clone --depth 1 https://github.com/neologd/mecab-ipadic-neologd.git $ cd mecab-ipadic-neologd $ ./bin/install-mecab-ipadic-neologd -n $ echo `mecab-config --dicdir`"/mecab-ipadic-neologd" /usr/local/lib/mecab/dic/mecab-ipadic-neologd
辞書はコマンド実行時のオプション指定でも変更できますが、何度も指定するのは面倒なので設定ファイルを編集して dicdir を上記のインストール先に変更しておきます。
$ vim /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/mecab-ipadic-neologd ; userdic = /home/foo/bar/user.dic (略)
もう一度、同じ文章を解析にかけてみると以下のようになります。
出力結果は「ドナルド・トランプ/が/米/大統領選挙/で/勝利/!」となり、固有名詞「ドナルド・トランプ」が抽出されています。素晴らしい!
他の技術系のブログなどでは Wikipedia、はてなキーワード、ニコニコ大百科などの情報をもとに辞書を作っているものが多くありました。これらを使用することで前述の例と同じように新語・固有名詞に強い辞書を作成することは可能ですが、商用利用を想定しているのであればライセンスに注意する必要がありそうです。
- ・ Wikipedia → 頒布義務がある(CC BY-SA)
- ・ はてなキーワード → 商用利用には問い合わせが必要
- ・ ニコニコ大百科 → 商用目的による使用禁止
Ruby で試してみる
さて、実際に使用する際は CLI ではなく、何らかの言語経由で MeCab を使用したいという機会が多いと思います。今回は Ruby を使った一例を紹介します。
作成する処理の内容としては下記のような内容にします。
- 1. HTTP クライアントを用いて任意の Web ページ (HTML) を取得
- 2. title、h1、h2、p タグの文字列を抽出
- 3. 抽出した文字列を形態素解析して名詞の単語ごとの出現回数を集計
- 4. 出現回数上位 20 件を表示
下記の手順で登場する natto は mecab を Ruby で使用するための gem です。
$ gem install httpclient nokogiri natto $ vim html_morphological_analysis.rb
require 'httpclient' require 'nokogiri' require 'natto' counts = Hash.new(0) nmecab = Natto::MeCab.new html = HTTPClient.new.get_content(ARGV[0]) Nokogiri.parse(html).search('title,h1,h2,p').each do |tag| nmecab.parse(tag.text) do |n| counts[n.surface] += 1 if n.surface.length > 1 && n.feature =~ /名詞/ end end p counts.sort {|(k1, v1), (k2, v2)| v2 <=> v1 }.first(20)
上記のスクリプトを任意の URL を引数に指定して実行してみます。
今回は適当な Yahoo ニュースに記事の URL を指定してみましょう。
$ mecab ruby html_morphological_analysis.rb http://headlines.yahoo.co.jp/hl\?a\=20161114-00000010-jij_afp-int [["フェンス", 5], ["トランプ氏", 5], ["米国", 5], ["300万人", 4], ["11", 4], ["時事", 3], ["地域", 3], ["利用", 3], ["大統領", 3], ["Yahoo!ニュース", 3], ["配信", 3], ["JavaScript", 3], ["大統領選", 3], ["不法移民", 3], ["国境", 3], ["次期", 2], ["強制送還", 2], ["60", 2], ["14", 2], ["インタビュー", 2]]
出力結果を確認すると”数字”や”JavaScript”といった文字列も抽出されており、多少のノイズはありますが、概ね記事の内容が類推できる結果が得られています。
さいごに
いかがだったでしょうか?
形態素解析なんて堅苦しい名前ではありますが、触ってみると驚くほど簡単に動かすことができました。
まだ使ったことのない方は是非とも遊んでみてはいかがでしょうか?
フェンリルのオフィシャル Twitter アカウントでは、フェンリルプロダクトの最新情報などをつぶやいています。よろしければフォローしてください!