見出し画像

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をつくってみました。

画像1

入力例

かきくけこ

出力例

「かきくけこ」で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ですが、気に入ったものを紹介してみます。

画像2

のびやかと寝ころびながらと、お題ののらねことライオンが、偶然マッチした感じです。こんな音楽なら聴いてみたいですね。

画像3

凛々しく諦めるというところに清潔感があります。。こんな音楽はおそらく作れないです。

画像4

適当だから、論破も苦しいんでしょうね。お題のてぶくろとつながらなかったけど。

画像5

魔物も頑張っています。

画像6

ねんだいもののむし=三葉虫のような。
結成以来、だいぶ年月も経っているのでそういう感じかもしれません。

お知らせ

ということで、THE HANONのLINE Botの開発記録でした。
興味があれば、触ってみてください。
ただし、いまのところ無料プランで動いているので、予告なく終了するかもしれませんが、その際はご了承ください。

画像7

本日は以上です。
駄文にお付き合い頂き、ありがとうございました!

#python #linebot #the_hanon #電子音楽 #自動作文 #LINE


この記事が気に入ったらサポートをしてみませんか?