LINE Botで自動作文
初めに
PythonでLINE Botを開発したことについて書きます。
簡単なBotであれば、初心者でも開発できるということで、下記の技術情報を参考に作ってみました。
【初心者向け】PythonによるHeroku環境で簡単LINEBot開発 | 技術ブログ | MIYABI Lab
https://miyabi-lab.space/blog/21
環境など
LINE Developers:LINE APIの登録、設定をしました。
Heroku:WEBアプリを開発・設置するためのプラットフォーム(PaaS)。
Git:ファイルの差分管理をするしくみ。
VSCode:ローカルの開発環境用のエディタ。今回はPythonで作成。
Windows Powershell:Gitコマンドを使って、VSCodeでコーディングした素材をHerokuへPushします。VSCodeからも操作できます。
だいたい、上記のツールを使って作ることができました。
LINE Botの内容
MIYABI Labさんで説明されているのは、オウム返しのBotです。
LINEのトーク画面で「こんにちは」と入力すると、「こんにちはって何?」と返してくるしくみです。ただそれだけのように感じるかもしれませんが、これを実現するためにすべきことが、初心者にはわからないので、ブログで解説してもらえるのはありがたいですね。
これをベースに試行錯誤しながら、THE HANON仕様のBotをつくってみました。
入力例
かきくけこ
出力例
「かきくけこ」でTHE HANONの音楽を説明するよ。
THE HANONは、まるで
かなしみの
きかいが
くるしく
けだもののように
こいこがれた
かのような電子音楽だよ。
という動きをするBotです。
「THE HANONは、まるで」と「かのような電子音楽だよ。」は固定の文字列です。
「かなしみの~こいこがれた」の部分は、入力された「かきくけこ」に対して、自動作文をする仕様になっています。
いわゆる「あいうえお作文」ですね。
入力するたびに別の作文ができるよう、複数の語句を登録しておいて、ランダムで出現させていますが、まだそんなに多くはないので、数回試すと底が見えてしまうのですが。
自動作文プログラム
LINE Developers、Heroku、Gitについては、上記のサイトに書かれているので割愛しまして、THE HANONで作成した部分について書いてみます。
list1=[
['あっとほーむな','あくまの'],
['かなしみの','きみの'],
]
list2=[
['あいつが','いかが'],
['かみさまが','きかいが']
]
これは辞書部分のサンプルです。
実際には修飾語1、主語、修飾語2、述語の4つのカテゴリで作っています。
テーブル構成やカテゴリ設計なども変更しながら試しているため、いまのところあ行、か行などのリストをたばねた多次元リストにしています。
(仕様が固まったらデータベースにしようと思います)
# 結合リストを作成
import itertools
mod1_list=list(itertools.chain.from_iterable(list1))
これは、多次元リストをひとつのリストにまとめているところです。
(そもそもデータベースにすればこうしたプロセスは不要です…。)
# ひらがな判別と変数の準備
import re
words=event.message.text # 入力された文字
re_hiragana = re.compile(r'^[あ-ん]+$') # ひらがなを定義
if(re_hiragana.fullmatch(words)): # ひらがなだったら、という条件分岐
mylist=list(words) # 入力語をmylistに格納
rep_text = '' # 変数の初期化
i=1 # 変数の初期化
words_length = len(words) # 入力語の数
まずは入力文字であるwordsを、ひらがな限定にする条件文から開始しています。
入力文字をバラして、あいうえお作文をつくるためです。
#文章作成部分
if(words_length==1):
# 1語の場合、動詞だけ
templist = [item for item in verb_list if item[0]==words]
rep_text = rep_text + '\n' + random.choice(templist)
elif(words_length==2):
# 2語の場合、主語と動詞
for w in mylist: # mylistの1文字をwとしてループ処理
if(i==1):
templist = [item for item in subject_list if item[0]==w]
rep_text = rep_text + '\n' + random.choice(templist)
else:
templist = [item for item in verb_list if item[0]==w]
rep_text = rep_text + '\n' + random.choice(templist)
i +=1
else:
# 3語以上の場合
for w in mylist: # mylistの1文字をwとしてループ処理
if(i==1):
# 1は主語にかかる修飾語
templist = [item for item in mod1_list if item[0]==w]
rep_text = rep_text + '\n' + random.choice(templist)
elif(i==2):
# 2は主語
templist = [item for item in subject_list if item[0]==w]
rep_text = rep_text + '\n' + random.choice(templist)
elif(i==words_length):
# 最後なら動詞
templist = [item for item in verb_list if item[0]==w]
rep_text = rep_text + '\n' + random.choice(templist)
else:
# それ以外は動詞にかかる修飾語
templist = [item for item in mod2_list if item[0]==w]
rep_text = rep_text + '\n' + random.choice(templist)
i +=1
rep_text = 'THE HANONは、まるで'+rep_text+'\nかのような電子音楽だよ。'
ここが自動作文のループ部分です。
入力が1文字なら、述語。
入力が2文字なら、主語+述語。
入力が3文字なら、修飾語1+主語+述語。
入力が4文字なら、修飾語1+主語+修飾語2+述語。
入力が5文字なら、修飾語1+主語+修飾語2+修飾語2+述語。
という分岐にしてみました。
それぞれの語句は、文字群のリストから、先頭の文字が一致する単語だけを呼び出してtemplistを作り、ここからランダムに1語をチョイスしています。
これをrep_textという変数に追加する形で格納していき、最後にメッセージとして出力します。
主語と述語を配置することで、なんとなく意味がありそうな文面になります。
else:
rep_text = 'あ、ひらがなだけを書いてね。'
これは、ひらがな判別の
if(re_hiragana.fullmatch(words)):
に対する「else」です。
ひらがな以外が入力されたときにエラーメッセージとして表示します。
ざっとですが、こういう感じでつくってみました。
もっとスマートなコーディングもあろうかと思いますが、THE HANONの開発部としてはこれが現状です。
自動作文の結果
コンピュータによる自動作文のなんともいえない雰囲気が好きなので、ほぼ自分のために作ったようなBotですが、気に入ったものを紹介してみます。
のびやかと寝ころびながらと、お題ののらねことライオンが、偶然マッチした感じです。こんな音楽なら聴いてみたいですね。
凛々しく諦めるというところに清潔感があります。。こんな音楽はおそらく作れないです。
適当だから、論破も苦しいんでしょうね。お題のてぶくろとつながらなかったけど。
魔物も頑張っています。
ねんだいもののむし=三葉虫のような。
結成以来、だいぶ年月も経っているのでそういう感じかもしれません。
お知らせ
ということで、THE HANONのLINE Botの開発記録でした。
興味があれば、触ってみてください。
ただし、いまのところ無料プランで動いているので、予告なく終了するかもしれませんが、その際はご了承ください。
本日は以上です。
駄文にお付き合い頂き、ありがとうございました!
#python #linebot #the_hanon #電子音楽 #自動作文 #LINE