MeCab辞書カスタムで恋の鶴舞線の歌詞を形態素解析する【Pythonによる自然言語処理超入門】

自然言語処理 Python

 

こんにちは!monachan_papaです。
前回までで、形態素解析の基本的なことについてやりました。

男は黙ってサッポロビールを形態素解析してみよう!【Pythonによる自然言語処理超入門】
川端康成『雪国』の冒頭を形態素解析してみよう!【Pythonによる自然言語処理超入門】

さて、このシリーズで使っている形態素解析器はMeCabを採用していますが、MeCabの辞書について今回ひとつ取り上げてみたいと思います。

MeCabの辞書とは?

形態素解析は、辞書によって行われています。とてもたくさんの単語情報を網羅したデータベースみたいなものです。このデータベースがあるからこそ初めて形態素解析ができるといえるでしょう。

import MeCab
t = MeCab.Tagger()
print(t.parse('男は黙ってサッポロビール'))
男   名詞,一般,*,*,*,*,男,オトコ,オトコ
は   助詞,係助詞,*,*,*,*,は,ハ,ワ
黙っ  動詞,自立,*,*,五段・ラ行,連用タ接続,黙る,ダマッ,ダマッ
て   助詞,接続助詞,*,*,*,*,て,テ,テ
サッポロビール 名詞,固有名詞,組織,*,*,*,サッポロビール,サッポロビール,サッポロビール
EOS

過去の投稿で、上記を取り上げました。サッポロビールという固有名詞を適切に判別できているのは、辞書という名のデータベースにサッポロビールの情報が登録されているから実現できたわけです。もし、「サッポロビール」が入っていなかったら、うまくいかないでしょう。

つまり、形態素解析の結果とういものは、辞書の登録情報に大きく依存するというわけなのです。

代表的な辞書

MeCabで使用する辞書をいくつか紹介します。

      • IPAdic
        MeCabが公式推奨している辞書です。よって、定番辞書といえるでしょう。IPA品詞体系に基づき構築されています。 本ブログでは、IPAdicを使っています。

     

      • Unidic
        国立国語研究所が開発した辞書です。表記ゆれに強い特徴があります。表記ゆれとは、同じ音・同じ意味の語句で異なる表記が混在しているわけなので、音声認識に向くと言えるでしょう。

     

    • ipadic-NEologd
      IPA辞書をベースにして、さらに単語情報を充実させた辞書です。特徴を一言で言えば、新語に強い!インターネットから単語をクローリングして語彙情報を、頻繁に更新しています。固有名詞なんかは特に強いでしょう。初めて私が使ってみた日には、色々固有名詞を打ち込んで楽しんだものです!

この中のどれが良いのかというのは、用途や好みによるかと思います。しかしながら、一つ言えるのはどれを使ったとしても期待通りの結果が得られないケースがどうしても出てきます。そんなときはどうしたらいいのでしょうか?

MeCab辞書のカスタム(ユーザー辞書)

既存の辞書で期待通りの結果が得られないとするならば……

これはもう自分でなんとかするしかありません!

そこで考えれれるのは、辞書をカスタムすることです。カスタムと言っても、目的はひとつ。辞書に単語を追加登録することです。登録には2通りの方法があります。

      • システム辞書への追加
        システム辞書とは大元になる辞書で、私の場合で言えばIPAdicになります。この手法は、解析速度が安定してしているというメリットがあります。デメリットは辞書をソースファイルからビルドしなければならないなど、手間がかかることです。辞書へ頻繁に追加をしたいときはなかなかつらいものがあります。
        このことから、まとめてドン!とやって、しばらく追加はないかな?というときはシステム辞書は良い選択になると思います。

     

    • ユーザー辞書への追加
      一方のユーザー辞書は、解析速度が落ちるという犠牲はあるものの、とにかく手軽さが一番の売りです!解析の際は、システム辞書と並行して読み込まれます。私は頻繁に辞書へ追加登録をよくしているので、こちらの方法をよく使います。

以上のような特徴となります。以降、手軽なユーザー辞書への追加について進めていきます。
大まかな手順としては以下の通りです。

1. とりあえず普通に形態素解析して、うまくいかなかった語の洗い出し
2. 規定フォーマットでユーザ辞書CSVファイルを作成
3. 作成したCSVファイルをMeCab付属コマンドで、.dic形式ファイルにする
4. 形態素解析時にユーザ辞書を読み込ませてリトライする

とりあえず、普通に「恋の鶴舞線」の歌詞を形態素解析

さて、ここからガンガンいきます!

サンプルとして、名古屋のちんどん べんてんや 駒子さん作詞による「恋の鶴舞線」を形態素解析します。以下をあらかじめ、koitsuru.txt で用意しておきます。
※歌詞は冒頭部分のみを引用しました。

地下鉄通学 一年生
眠気まなこで 乗り込んだ
夢見る夢子は 気がつけば
上小田井赤池 二往復

ここは誰?
私はどこ?
あなたに逢いたい
恋の鶴舞線

import MeCab

with open('koitsuru.txt', 'r') as f:
    words = f.read()

t = MeCab.Tagger()
print(t.parse(words))
地下鉄 名詞,一般,*,*,*,*,地下鉄,チカテツ,チカテツ
通学  名詞,サ変接続,*,*,*,*,通学,ツウガク,ツーガク
    記号,空白,*,*,*,*, , , 
一   名詞,数,*,*,*,*,一,イチ,イチ
年生  名詞,接尾,助数詞,*,*,*,年生,ネンセイ,ネンセイ
眠気  名詞,一般,*,*,*,*,眠気,ネムケ,ネムケ
まなこ 名詞,一般,*,*,*,*,まなこ,マナコ,マナコ
で   助詞,格助詞,一般,*,*,*,で,デ,デ
    記号,空白,*,*,*,*, , , 
乗り込ん    動詞,自立,*,*,五段・マ行,連用タ接続,乗り込む,ノリコン,ノリコン
だ   助動詞,*,*,*,特殊・タ,基本形,だ,ダ,ダ
夢見る 動詞,自立,*,*,一段,基本形,夢見る,ユメミル,ユメミル
夢子  名詞,固有名詞,人名,名,*,*,夢子,ユメコ,ユメコ
は   助詞,係助詞,*,*,*,*,は,ハ,ワ
    記号,空白,*,*,*,*, , , 
気   名詞,一般,*,*,*,*,気,キ,キ
が   助詞,格助詞,一般,*,*,*,が,ガ,ガ
つけ  動詞,自立,*,*,五段・カ行イ音便,仮定形,つく,ツケ,ツケ
ば   助詞,接続助詞,*,*,*,*,ば,バ,バ
上小田井    名詞,固有名詞,地域,一般,*,*,上小田井,カミオタイ,カミオタイ
赤池  名詞,固有名詞,地域,一般,*,*,赤池,アカイケ,アカイケ
    記号,空白,*,*,*,*, , , 
二   名詞,数,*,*,*,*,二,ニ,ニ
往復  名詞,サ変接続,*,*,*,*,往復,オウフク,オーフク
ここ  名詞,代名詞,一般,*,*,*,ここ,ココ,ココ
は   助詞,係助詞,*,*,*,*,は,ハ,ワ
誰   名詞,代名詞,一般,*,*,*,誰,ダレ,ダレ
?   記号,一般,*,*,*,*,?,?,?
私   名詞,代名詞,一般,*,*,*,私,ワタシ,ワタシ
は   助詞,係助詞,*,*,*,*,は,ハ,ワ
どこ  名詞,代名詞,一般,*,*,*,どこ,ドコ,ドコ
?   記号,一般,*,*,*,*,?,?,?
あなた 名詞,代名詞,一般,*,*,*,あなた,アナタ,アナタ
に   助詞,格助詞,一般,*,*,*,に,ニ,ニ
逢い  動詞,自立,*,*,五段・ワ行促音便,連用形,逢う,アイ,アイ
たい  助動詞,*,*,*,特殊・タイ,基本形,たい,タイ,タイ
恋   名詞,一般,*,*,*,*,恋,コイ,コイ
の   助詞,連体化,*,*,*,*,の,ノ,ノ
鶴舞線 名詞,固有名詞,一般,*,*,*,鶴舞線,ツルマイセン,ツルマイセン
EOS

わりとうまくいっています。しかし、一年生、二往復が分断されてしまっています。私の期待するところは、分断されずにそれぞれ一語で出て欲しいのでありました!あと、恋の鶴舞線も、この解析で良いと思いますが、今回は気分で一語にしようと思います。

飽くまでも、趣味な形態素解析なので!!

よって、この3語を辞書への追加登録対象とします。

ユーザー辞書CSVファイルの作成

追加登録対象が決まったので、ユーザー辞書CSVを作っていきます。規定フォーマットは以下の通りです。

表層形,左文脈ID,右文脈ID,生起コスト,品詞,品詞細分類1,品詞細分類2,品詞細分類3,活用型,活用形,原形,読み,発音

難しい内容がいくつかありますが、問題なしです。最低限、以下の情報だけを埋めればOKです!

表層形、生起コスト、品詞、品詞細分類1、原形、読み、発音

上記以外は*(アスタリスク)にします。これらを踏まえて、作成したものが以下となります。

一年生,*,*,0,カスタム名詞,一般,*,*,*,*,一年生,イチネンセイ,イチネンセイ
二往復,*,*,0,カスタム名詞,一般,*,*,*,*,二往復,ニオウフク,ニオウフク
恋の鶴舞線,*,*,0,カスタム名詞,一般,*,*,*,*,恋の鶴舞線,コイノツルマイセン,コイノツルマイセン

特記事項として、生起コストは本来、適切な値を入れたほうが推奨ですが、0にしました。また、品詞は分かりやすいようにカスタム名詞としました。

ファイル名:userdic.csv、文字コード:utf-8 で作成内容を保存します。
作成保存後、問題なく作成できているか確認します。

import pandas as pd

cols = '表層形,左文脈ID,右文脈ID,生起コスト,品詞,品詞細分類1,品詞細分類2,品詞細分類3,活用型,活用形,原形,読み,発音'.split(',')
pd.read_csv('userdic.csv', names=cols)

pandas

問題なさそうなので、次のステップに進みます。

mecab-dict-indexコマンドで .dic形式のユーザ辞書にする

ここからターミナルを使って作業します。私はmacを使っています。

mecab-dict-indexコマンド説明
# -d システム辞書のディレクトリ
# -u 作成するユーザ辞書名(.dic形式)
# -f CSV辞書の文字コード
# -t 作成するユーザ辞書の文字コード
/usr/local/Cellar/mecab/0.996/libexec/mecab/mecab-dict-index \
-d /usr/local/lib/mecab/dic/ipadic \
-u userdic.dic \
-f utf-8 \
-t utf-8 userdic.csv

実行します。
成功すると、以下のように done! と出ます。

mecab-dict-index

.dic形式のユーザ辞書を読み込ませて、「恋の鶴舞線」の歌詞を再び形態素解析

.dic形式のユーザ辞書ができたので、形態素解析のリトライをします。

MeCab.Taggerの引数に、r’-u userdic.dic’ と指定をするだけです。

これでシステム辞書と並行して、解析ができるようになります。

with open('koitsuru.txt', 'r') as f:
    words = f.read()

# 引数にユーザ辞書を指定
t = MeCab.Tagger(r'-u userdic.dic')
print(t.parse(words))
地下鉄 名詞,一般,*,*,*,*,地下鉄,チカテツ,チカテツ
通学  名詞,サ変接続,*,*,*,*,通学,ツウガク,ツーガク
    記号,空白,*,*,*,*, , , 
一年生 カスタム名詞,一般,*,*,*,*,一年生,イチネンセイ,イチネンセイ
眠気  名詞,一般,*,*,*,*,眠気,ネムケ,ネムケ
まなこ 名詞,一般,*,*,*,*,まなこ,マナコ,マナコ
で   助詞,格助詞,一般,*,*,*,で,デ,デ
    記号,空白,*,*,*,*, , , 
乗り込ん    動詞,自立,*,*,五段・マ行,連用タ接続,乗り込む,ノリコン,ノリコン
だ   助動詞,*,*,*,特殊・タ,基本形,だ,ダ,ダ
夢見る 動詞,自立,*,*,一段,基本形,夢見る,ユメミル,ユメミル
夢子  名詞,固有名詞,人名,名,*,*,夢子,ユメコ,ユメコ
は   助詞,係助詞,*,*,*,*,は,ハ,ワ
    記号,空白,*,*,*,*, , , 
気   名詞,一般,*,*,*,*,気,キ,キ
が   助詞,格助詞,一般,*,*,*,が,ガ,ガ
つけ  動詞,自立,*,*,五段・カ行イ音便,仮定形,つく,ツケ,ツケ
ば   助詞,接続助詞,*,*,*,*,ば,バ,バ
上小田井    名詞,固有名詞,地域,一般,*,*,上小田井,カミオタイ,カミオタイ
赤池  名詞,固有名詞,地域,一般,*,*,赤池,アカイケ,アカイケ
    記号,空白,*,*,*,*, , , 
二往復 カスタム名詞,一般,*,*,*,*,二往復,ニオウフク,ニオウフク
ここ  名詞,代名詞,一般,*,*,*,ここ,ココ,ココ
は   助詞,係助詞,*,*,*,*,は,ハ,ワ
誰   名詞,代名詞,一般,*,*,*,誰,ダレ,ダレ
?   記号,一般,*,*,*,*,?,?,?
私   名詞,代名詞,一般,*,*,*,私,ワタシ,ワタシ
は   助詞,係助詞,*,*,*,*,は,ハ,ワ
どこ  名詞,代名詞,一般,*,*,*,どこ,ドコ,ドコ
?   記号,一般,*,*,*,*,?,?,?
あなた 名詞,代名詞,一般,*,*,*,あなた,アナタ,アナタ
に   助詞,格助詞,一般,*,*,*,に,ニ,ニ
逢い  動詞,自立,*,*,五段・ワ行促音便,連用形,逢う,アイ,アイ
たい  助動詞,*,*,*,特殊・タイ,基本形,たい,タイ,タイ
恋の鶴舞線   カスタム名詞,一般,*,*,*,*,恋の鶴舞線,コイノツルマイセン,コイノツルマイセン
EOS

どうやらうまくいったようです。一年生、二往復、恋の鶴舞線がそれぞれ一語で出ました。

期待通りにできると嬉しいですね。
特に歌詞などの場合は、独特の表現なんかもあるので、辞書のカスタムをしないとうまくいかないことが多いかと思います。

私は初めて自分の好きな歌詞を形態素解析したとき、何となくうまくいかないだろうと分かっていましたが、それでも萎えたものです。

「この言葉はこの歌詞の核になるもんやのに、何で分断されるんじゃい!」

てなりました。

でも、辞書のカスタムができればそんなことはもう無問題!楽しくなります。
形態素解析を楽しみましょう。

 

 

また、爆速で 自然言語処理 を学びたい御方にはプログラミングスクールを考えるのも、ひとつの手です。独学よりも効果が出やすいですが、いかんせん投資がけっこうかかります。しかし、techgymというスクールは通うか通わないかは別として、無料のサンプルテキスト&解説動画がもらえます。これをとりあえず getしてまずは試しに体験学習するのもありでしょう。

コメント

タイトルとURLをコピーしました