やってみる

アウトプットすべく己を導くためのブログ。その試行錯誤すらたれ流す。

PythonでMeCabのCSVを使い基本形から未然形へと変形させる

 ついに変形の第1弾ができた。

成果物

準備

 カタカナをひらがなに変換するため。

pip3 install jaconv
  • 実行パスに辞書ファイルが存在すること

コード

Precaution.py

 CSVから指定した基本形のレコードを抽出する。

class Precaution:
    ...
    # 指定した用言(基本形)に一致するレコードを丸ごと返す
    def get(self, word):
        return self.__get_csv_rows(
            lambda row: word == row[10],
            lambda row: row)
    ...

Mizen.py

 未然形に変形する。

import re
import jaconv
class Mizen:
    def __init__(self):
        self.__re_conj_conn = re.compile(r'^未然(.+)接続$')
    # 「ない」
    def get_not(self, row):
        if '未然形' == row[9] or '未然特殊' == row[9]: return row[0] + 'ない'
        else: return None
    # 「ず」
    def get_not_old(self, row):
        if '未然形' == row[9]: return row[0] + 'ず'
        else: return None
    # 「未然ウ接続」など
    def get_conn(self, row):
        m = self.__re_conj_conn.match(row[9])
        if m: return row[0] + jaconv.kata2hira(m.group(1))
        else: return None
    # 「ん」
    def get_not_special(self, row):
        if '未然特殊' == row[9]: return row[0] + 'ねぇ'
        else: return None
    # 「れる/られる」受け身・可能・自発・尊敬
    def get_reru(self, row):
        if '未然形' == row[9]:
            if '五段' in row[8] or 'サ変' in row[8]: return row[0] + 'れる'
            if '一段' in row[8] or 'カ変' in row[8]: return row[0] + 'られる'
            raise Exception('れる/られるパターン外: {}, {}'.format(row[8], row))
        else: return None

run.py

 いくつかの語を変形する。

#!/usr/bin/env python3
# coding: utf8
import Precaution
import Mizen
p = Precaution.Precaution()
mizen = Mizen.Mizen()

def prints(words):
    for word in words:
        if word is not None: print(word)

words = ['走る','押す','愛する','見る','食べる','来る', '悲しい', 'ござる']
for word in words:
    print('===== {} ====='.format(word))
    rows = p.get(word)
    for row in rows:
        mizens = (mizen.get_not(row),
                    mizen.get_not_old(row),
                    mizen.get_conn(row),
                    mizen.get_not_special(row),
                    mizen.get_reru(row))
        prints(mizens)

実行結果

./run.sh
===== 走る =====
走らない
走らず
走られる
走んない
走んねぇ
走ろう
===== 押す =====
押さない
押さず
押される
押そう
===== 愛する =====
愛しない
愛しず
愛しれる
愛しよう
愛しょう
愛せれる
===== 見る =====
見ない
見ず
見られる
見よう
===== 食べる =====
食べない
食べず
食べられる
食べよう
===== 来る =====
来ない
来ず
来られる
来よう
来らない
来らず
来られる
来んない
来んねぇ
来ろう
来ない
来ず
来られる
来よう
===== 悲しい =====
悲しからぬ
悲しかろう
===== ござる =====
ござらない
ござらず
ござられる
ござんない
ござんねぇ
ござろう

 ポイントだった「れる/られる」は大体うまくいっているっぽい。ただ、いくつか気になるところがある。

  • 走られるって違和感あるのだが。走れるはラ抜き言葉だったのか? それとも自動詞だから?
  • 愛しないでなく愛さないでは? 愛しずでなく愛さずでは?
  • 来る系がおかしい
    • なんか重複してる
    • 来らないでなく来ないでは?
    • 来んないっておかしい。未然特殊がなんなのかよくわかってない。末尾がとしか
  • 形容詞悲しい悲しくないにならない
  • 助動詞ござるござらぬござらんにならない

課題

  • おかしいヤツの原因調査
  • 表現の追加
    • れる/られるの否定形れない/られないがあってもいいか
    • 可能を意味する〜ことができるがあってもいいか
  • 他の活用形も調査して変形ツールを作る
  • CSVからデータを抽出するクラスを作る

所感

 これで「走る」と入力したら「走らない」という否定形を返してくれる。嫌なヤツBOTが作れそう。

 でも「走る」と入力したら「歩く」とは返してくれない。対義語や類語を返してくれるとなお生意気なBOTが作れそうなのだが。それは別の辞書を作らないと不可能。

 あるいはもっと普通に「来る」を「いらっしゃる」「おいでになさる」に変換してくれると嬉しい。「食べる」を「召し上がる」に。尊敬語、謙譲語、丁寧語への変換ならネタでなく普通に使えそう。

対象環境

$ uname -a
Linux raspberrypi 4.19.42-v7+ #1218 SMP Tue May 14 00:48:17 BST 2019 armv7l GNU/Linux