動詞と助動詞をつなげるpypiパッケージを作成したので紹介します
動詞と助動詞を組み合わせるライブラリの使い方
$ pip install kotodama
$ python
$ > from kotodama import kotodama
$ > print(kotodama.transformVerb("行く",{"過去","伝聞","希望","です・ます"}))
-> 行きたかったらしいです
詳細はgithubを見てください
以下は蛇足です
対話システムではなぜ動詞の変換が必要なのか
チャットボットやロボット対話などを研究していると、動詞の形を変えたいという時がちょくちょくあります
例えばtwitterなどから、「オーストラリアでパンダを見たけど、超かわいかった」というツイートを収集し、それをチャットボットに話させる場合
・「オーストラリアでパンダを見たけど、超かわいかった」とそのまま言わせる
・(場所:オーストラリア,対象:パンダ,動詞:見る)を抽出し、「[場所]で[対象]を[動詞]」というテンプレートを用意しておき文字列を置き換えることで「オーストラリアでパンダを見る」と言わせる
簡単な方法で済ませようとすると、こういったやり方があります
ロボットの記憶をもたせたりなど、ちょっとリッチな処理をしようとすれば文の内容に関して記号論的に取り扱える後者の手法がありがたかったりします
このとき「オーストラリアでパンダを見る」とだけ言われても聞き手は不自然さを感じます。最低でも「オーストラリアでパンダを見た」といった過去形になおしたほうがよいですし、「オーストラリアでパンダを見たらしい」と過去+伝聞の形にしたほうがユーザに「どこの動物園?」とか聞かれても「ネットで聞いた話だから詳しくはわからない」とか逃げ道ができたりします。
さらに音声認識と音声合成を組み合わせて音声対話システムとする場合、例えば音声合成システムによっては丁寧語しか自然に話せないといった場合が多いです(ニュースやアナウンサーの発話を元に作られている場合が多いため)
そうすると「オーストラリアでパンダを見たらしいです」というように、過去+伝聞+丁寧といった形が欲しくなります
もちろん、「見たらしいです」=「見たと聞きました」と言い換えができるので、過去+伝聞+丁寧といった必要な組み合わせが予めわかっているなら
「動詞の過去形+と聞きました」[過去,伝聞,丁寧]
「動詞の原型+ことをしたいです」[過去,伝聞,希望,丁寧]
「動詞の連用形+たかったらしいです」[過去,伝聞,希望,丁寧]
「動詞の連用形+たいそうです」[希望,伝聞,丁寧]
という形で、動詞の活用形生成エンジンと、使う助動詞の組み合わせの数だけテンプレートを用意しておけば目的が達成できそうです
ですが、あの助動詞が使いたい、この助動詞がほしい、と思うたびにテンプレートを作りなおすことが面倒になってきたため、汎用的な動詞と助動詞を組み合わせて文生成を行うモジュールを作ってしまうことにしました
基本的なアルゴリズム
中高の授業で習ったような話ですが、動詞と助動詞を組み合わせるためには
動詞の活用形+助動詞+(必要なら)終助詞
という形になります
このとき、動詞の活用形の種類[未然形,連体形,連用形,終止形,仮定形,命令形]はその直後に続く助動詞によって決まります
つまりこういうことです
また、「見る」に対して「希望」「過去」と言った形で複数助動詞をつなげる場合「どちらが先に来て、どちらが後に来るのか」というのもルールがあり
見る/希望/過去 => 見たかった 自然
見る/過去/希望 => 見たたく 不自然
のように過去に対しては希望が先に連なるというルールがあります
ですので、動詞に助動詞をつなげるためには
1. 動詞・助動詞の活用形を生成するライブラリを作成
2. 与えられた助動詞を並べ替えて順番を確定する(先頭は動詞)
3. 先頭から順に活用形を生成する(後ろの助動詞が何かによって活用形の種類が確定する)
という処理をしています
何が難しかったのか
一例を挙げます
「です」と「ます」の順序の違い
意味的には
です:丁寧な断定
ます:丁寧
と、違いは一般的に議論されているみたいですが、使う側としては「とにかく丁寧な感じが出せたらいい」「です・ます調に変換したい」という場合が多いので「です・ます」というラベルで定義しています
ここで問題になるのが、「です」と「ます」のどちらを使えばいいのか?ということです
動詞の活用に限定すると
見る/です・ます/過去 => 見ました
見る/希望/です・ます => 見たいです
見る/過去/希望 => 見たかった
ます > 過去 > 希望 > です
同じ「見る」でも「です」の場合も「ます」の場合もあります
つまり助動詞の組み合わせによって決まると考えたほうが良さそうです
いくつかの組み合わせを試したうえで
並び替えの順番 = ["使役", "可能", "受け身", "自分の希望", "他人の希望", "ます", "否定", "過去", "推定", "伝聞", "様態", "例示", "勧誘", "です"]
と定義し、与えられた助動詞の順番が一番遅いものが何なのかによって「です」「ます」が決まります
です = {"自分の希望", "推定", "伝聞", "様態", "例示", "勧誘"}
ます = {"使役", "可能", "受け身", "他人の希望", "否定", "過去"}
このあたりは知見を見つけられなかったので、誰か詳しい方がいたら教えてください
最後に
形容詞に対応させたり、格助詞「は・が」をどうやって使い分けるかなど、文生成器の開発に関心のある人がいましたらご協力いただけるとうれしいです
記事の内容の間違いのコメントもお待ちしています