前回の続きになります。前回の記事はこちら。
「パターン1.自分のPCでボットとチャットする(画面なし)」を作ってみます。
プログラムの詳しい説明は後で。まずは動かしてみましょう。
ボットのプログラムを動かしてみる
Pythonは、拡張子を「.py」でファイル保存すれば、Pythonプログラムと認識してもらえます。テキストエディタなどで、以下のプログラムを書いて保存、そのあとファイル名を変更し、拡張子を「.py」に変更してみて下さい。
from chatterbot import ChatBot
from chatterbot.trainers import ListTrainer
bot = ChatBot("チャットボット試作版")
training_ = open('chat.txt', 'r').readlines()
training2_ = open('chat2.txt', 'r').readlines()
trainer = ListTrainer(bot)
trainer.train(training_)
trainer.train(training2_)
while True:
try:
bot_input = bot.get_response(input())
print(bot_input)
except(KeyboardInterrupt, EOFError, SystemExit):
break
うまくいかない場合は、ファイル名拡張子が非表示設定になっている可能性があります。適当なフォルダを開いて、表示タブを選択、「ファイル名拡張子」にチェックを入れて下さい。
プログラムを書く際、スペースは意識して下さい。全角スペースはダメです。必ず半角で。Pythonに限らず、コメント行以外で、全角スペースをプログラムのコーディングで使うことはありません。
「while True:」と「try:」、「try:」と「bot_input = bot.get_response(input())」のところは、半角4文字分、右にずらして記述して下さい。
次に同じフォルダにchat.txt、chat2.txtを作ります。この内容は何でも構いませんが、検証のために2行以上記述して下さい。また、ファイル名はプログラム内のopenの記述と合わせて下さい。
ファイル名:chat.txt
こんにちは
こちらこそ こんにちは
今日もよろしくお願いします
ファイル名:chat2.txt
こんばんは
こちらこそ こんばんは
もう眠いですね
おやすみなさい
ただし、これだけではちゃんと動きません。動かないと知りつつも実行してみます。
コマンドプロンプトで「ファイル名.py」を実行して下さい。 パッケージがないため、
C:\Users\hoppa\Desktop\python\3.chatbot\Ver0.1>main_chatterbot_only.py
Traceback (most recent call last):
File “C:\Users\hoppa\Desktop\python\3.chatbot\Ver0.1\main_chatterbot_only.py”, line 1, in <module>
from chatterbot import ChatBot ModuleNotFoundError: No module named ‘chatterbot’
というエラーが発生するはずです。最後の「ModuleNotFoundError: No module named ‘〇〇〇〇’」は、Pythonでよく発生する「パッケージが見つからない」エラーパターンになります。これが出たら、〇〇〇〇のパッケージをインストールしましょう。「pip install 〇〇〇〇」と実行します。この場合は、
pip install chatterbot
です。(〇〇〇〇の文言について、稀にエラー内の文言とパッケージの文言で微妙に異なるケースがありますが、その時はググって調べてみて下さい。)
chatterbotパッケージの中で別のパッケージを呼んでおり、上記のコマンドで自動的に関連するパッケージもインストールしてくれます。chatterbotは関連するパッケージが多いので、ちょっと時間がかかります。。。
うまくインストールできると「Successfully installed chatterbot-〇〇〇」(〇〇〇はバージョン)と表示されるはずです。「pip list」で、インストールしたPythonパッケージの一覧を確認できます。
Pythonのすごいところはパッケージがとても充実していることです。世界中の優秀なシステムエンジニアが無償で便利なパッケージを公開しているので、自分で一からプログラミングしなくてもそれを流用することで、効率的な開発が行なえます。Pythonパッケージの詳細については、PyPIサイトをご確認下さい。
これで事前準備は整ったので、もう一度、コマンドプロンプトで「ファイル名.py」を実行します。
入力待ちになっているので「こんにちは」と入力してみます。すると「こちらこそ こんにちは」と応答してくれます。また、「もう眠いですね」と入力してみます。すると「おやすみなさい」と回答してくれます。
終了する時は、「Ctrl+C」(コントロールボタンを押しながらCを押す)です。
実行例:
C:\Users\hoppa\Desktop\python\3.chatbot\Ver0.1>main_chatterbot_only.py
[nltk_data] Downloading package averaged_perceptron_tagger to [nltk_data] C:\Users\hoppa\AppData\Roaming\nltk_data… [nltk_data] Package averaged_perceptron_tagger is already up-to- [nltk_data] date! [nltk_data] Downloading package punkt to [nltk_data] C:\Users\hoppa\AppData\Roaming\nltk_data… [nltk_data] Package punkt is already up-to-date! [nltk_data] Downloading package stopwords to [nltk_data] C:\Users\hoppa\AppData\Roaming\nltk_data… [nltk_data] Package stopwords is already up-to-date!List Trainer: [####################] 100%
List Trainer: [####################] 100%
こんにちは
こちらこそ こんにちは
もう眠いですね
おやすみなさい
実行フォルダに「db.sqlite3」というファイルが自動的に作成されていると思います。
これはPython で標準装備されているsqliteと呼ぶデータベースで、この中にボットとのやり取りの情報が蓄積されています。sqliteのコマンドを使うことでデータベースの中身を参照・更新しボットとのやりとりをカスタマイズできますが、当記事のテーマを少し外れるので今回は説明を割愛します。
ボットのプログラムの説明
次にボットのプログラムの説明です。それぞれのソースの上に説明文を追記しました。
Pythonでは、’’’(シングルクォーテーション3つ)で囲むか、#の行がコメント行になります。
# chatterbotのパッケージを読み込みます。
from chatterbot import ChatBot
from chatterbot.trainers import ListTrainer
# bot の本体を定義します。ここで作ったbotに紐づけたり、実行していきます。
bot = ChatBot("チャットボット試作版")
# トレーニングファイルを開いて、その中身を変数training_、training2_に格納します。
training_ = open('chat.txt', 'r').readlines()
training2_ = open('chat2.txt', 'r').readlines()
# botとトレーニングファイルの中身を紐づける前準備です。
trainer = ListTrainer(bot)
# ここでトレーニングファイルの中身をbotが学習することができました。
trainer.train(training_)
trainer.train(training2_)
'''
今までの記述は全て実行前の事前準備で、ここからがbotとのやりとりに関するプログラミングになります。
while文は条件を満たしている間、ループします。今回はTrueにしているので永遠に条件を満たし続けます。
つまり強制終了(Ctrl+C)しない限り、無限ループします。
while文は、4文字ずらして記載した行の全範囲に適用されます。
つまり、try:からbreakまでが、while文の適用範囲です。
同じようにtry:の適用範囲は4文字ずらしたbot_input~からprint~まで。
except~の適用範囲は4文字ずらしたbreakの1行になります。
Pythonではこの記述方法は文法として絶対必要ですが、Python以外の言語でもループや条件文の範囲の可読性を上げるために、
ネストする時は右にずらして書くのが一般的です。
try:とexcept~はセットの構文で、例外処理と呼ばれるものです。
正常系のロジックをtry:のところに書き、本来の動きで想定していないような異常な状態になってしまった場合の動作を
except~に記載します。
try:の適用範囲で、コマンドプロンプトからの入力input()に対して、botが回答をセットし、画面表示(print~)しています。
exceptの適用範囲で、break、つまり想定外のことが起きたら、プログラムを強制終了するよう記述しています。
'''
while True:
try:
bot_input = bot.get_response(input())
print(bot_input)
except(KeyboardInterrupt, EOFError, SystemExit):
break
最後にトレーニングファイルの意味です。コマンドプロンプトからの入力が、このファイルのある1行と一致した場合、その次の行を回答として返す、という動きをします。つまりルールベースで質問-回答を定義することができます。
トレーニングファイルを読み込まず、プログラムに直接、書くこともできます。
その場合、こんな感じになります。
~ 一部抜粋 ~
# bot の本体を定義します。ここで作ったbotに紐づけたり、実行していきます。
bot = ChatBot("チャットボット試作版")
# トレーニングファイルの代わりに、プログラム内にトレーニング内容を直接記述します。
training_ = [
"こんにちは",
"こちらこそ こんにちは",
"今日もよろしくお願いします",
]
training2_ = [
"こんばんは",
"こちらこそ こんばんは",
"もう眠いですね",
"おやすみなさい",
]
# botと紐づける前準備です。
trainer = ListTrainer(bot)
# ここでトレーニング内容をbotが学習することができました。
trainer.train(training_)
trainer.train(training2_)
まとめ
chatterbotパッケージを使ってボットとやり取りする基本的なプログラムについて書きました。プログラム初心者の方向けにできるだけ基礎的なところから書いたつもりですが、おかしなところやわかりづらいところがあれば、お問い合わせからご指摘いただけると幸いです。
また、この記事では基本的なプログラミングと使い方しか述べていませんので、興味のある方は関連サイトで勉強してみて下さい。特にボットの回答を作る時のアルゴリズムは、いわゆる機械学習と呼ばれている分野であり奥が深いです。
次の記事では「パターン2.自分のPCでボットとチャットする(画面あり)」について書きたいと思います。
<スポンサーリンク>