用言(動詞・形容詞・形容動詞)と活用形を入力して、活用された用言を取得する方法

mecabに文章を入力すると、形態素解析して、「用言の標準形」と「文中での活用形」を返してくれます。

【テキスト】
金田が泣い
mecab解析後】
泣い 動詞,自立,*,*,五段・カ行イ音便,連用タ接続,泣く,ナイ,ナイ

逆に「指定した用言の標準形」「指定した活用形」を入力して、「指定した活用での用言」を返してくれるプログラムが欲しいです。

【欲しいもの】
入力:泣く,連用
出力:泣い
 
しかし、mecab内にインストールした辞書(「sys.dic」ファイル)から取得しようにも、すでにバイナリ化されていたので、情報を取得できず困っていました。
思い返して見ると、自分で選んだ辞書をmecabにインストールしていました。つまり、mecabに辞書をインストールする前のファイルなら、バイナリ化されていないので扱える。今回は上記のように出力してくれる処理を書いてみました。 
 
【目的】
指定した用言の活用形を、別の活用形へと変化させる。例えば、終止形を連用形に変えることで、2文を融合させることが可能になる。私が要約研究を行っていて、2文を融合する処理があるので必要。

【例】
金田はリンゴを剥いた。金田はリンゴを食べた。
→金田はリンゴを剥き、リンゴを食べた

【使用した辞書】
IPA辞書(http://taku910.github.io/mecab/#download
※各個人がmecabにインストールした辞書を用いるべき
 

【ダウンロードしたフォルダの中身】

f:id:cland741953:20161019133640p:plain
▲画像:CSVファイルだけ出力
中身はいろいろありますが、予想どおりcsvファイルがあります。mecab内にインストールしてしまうと、ファイルがバイナリファイル(dic形式)になっていて扱えませんでしたが、csvファイルなのでプログラムで扱えます。
ファイル名をよく見ると、mecabへインストールする前では、動詞・名詞・形容詞などのように、csvファイルごとに分けられて収録されていることがわかりますね。
 

【ファイルの中身例:Verb.csv

f:id:cland741953:20161019133932p:plain▲Verb.csv中身

最高です。1つの動詞に対して各行で活用されています。カンマ(,)で区切られている情報について見慣れていない人のために簡単に説明しておきましょう。

表層形\t品詞,品詞細分類1,品詞細分類2,品詞細分類3,活用型,活用形,原形,読み,発音
※ファイルの中の数字は優先度的なもの

これらのファイルがあれば、「引き込む」「連用形」という情報を手がかりに、「引き込み」という言葉を取得することができますね。

私はPythonで現在書いているので、そのままPythonで実現します。特に難しい処理ではなくプログラミングの基本的な処理なので、コードは省略しますが、処理の流れは次のようになるでしょう。

  1. mecabで文章を形態素解析
  2. 指定した用言の原形を取得
  3. 「原形」と変化させたい「活用形」を手がかりにcsvファイル内を探索
  4. 活用された用言を出力
    ※未知語の処理は別途用意する必要があるかも 

と、省略するつもりでしたが、関数書いたので載せておきます。今回は、動詞、形容詞、助動詞について、convert(品詞, 標準形, 活用形) という関数に引数を与えると、活用された品詞が返ってくるものです。

##!/usr/bin/env python
# -*- coding: utf-8 -*-

# 注意:encode、decode、unicodeがやっかいだぜ

import csv
import sys

def convert(part, word, form):
    if part == "動詞":
        print "this is verb"
        file_name = "./Verb.csv"
    elif part == "形容詞":
        print "this is adj"
        file_name = "./Adj.csv"
    elif part == "助動詞":
        print "this is Auxil"
        file_name = "./Auxil.csv"
    #形容動詞がmecabに存在しない
    else :
        sys.exit("dont have part")
    f = open(file_name,'rb')
    dataReader = csv.reader(f)
    for row in dataReader:
        if unicode(word,'utf-8') == row[10].decode('EUC-JP'): #品詞発見
            if unicode(form,'utf-8') in row[9].decode('EUC-JP'): #活用発見
                return row[0].decode('EUC-JP')

print convert("動詞","行う","連用形")
#出力:行い

 
一応学部が情報系なので、今後はこういったPythonを始めとする自然言語処理の話題についても記事を書こうと思います。マーケター・メディアマン向けの初心者でも分かる記事にはしていこうかな。