はじめに
Pythonでチャットボットを作りたくなった。
ChatterBotが便利に使えそうだということで、インストールログを残しておく。
動作環境
- Python3.9.13
- macOS BigSur 11.6
インストール
まず仮想環境を準備する。
python3 -m venv chatbot
chatbotディレクトリができるので、移動する。その後、binディレクトリにactivateコマンドがあるので、sourceで仮想環境を起動する。
cd chatbot
source bin/activate
以下の手順を実行する。
git clone https://github.com/feignbird/ChatterBot-spacy_fixed
pip3 install ./ChatterBot-spacy_fixed
pip3 install chatterbot-corpus
pip3 uninstall pyYAML
pip3 install pyYAML==5.3.1
python -m spacy download en_core_web_sm
pip3 install chatterbot-corpus
実行時、chatterbot-corpusが要求するpyyamlのバージョンが低く、一時的にpyyaml(実行時はver 5.3.1)がアンインストールされ、ver 3.13がインストールされる。以下はその際のメッセージ抜粋。
Installing collected packages: PyYAML, chatterbot-corpus
Attempting uninstall: PyYAML
Found existing installation: PyYAML 5.3.1
Uninstalling PyYAML-5.3.1:
Successfully uninstalled PyYAML-5.3.1
Running setup.py install for PyYAML ... done
ERROR: pip's dependency resolver does not currently take into account all the packages that are installed. This behaviour is the source of the following dependency conflicts.
chatterbot 1.1.0a7 requires pyyaml<5.4,>=5.3, but you have pyyaml 3.13 which is incompatible.
Successfully installed PyYAML-3.13 chatterbot-corpus-1.2.0
しかしながら、これはchatterbot-corpusのメンテがほぼされていないためであって、pyyamlは新しくしてもOKなのである。
そこで古いpyyamlをアンインストールし、改めて新しいものを入れるわけである。
以上のコマンド群が走れば、あとは日本語用のコーパス(会話テンプレート)をセットすれば完了する。
chatterbot-corpusのリポジトリをzipでダウンロードする。
github.com
ダウンロードされたファイルはchatterbot-corpus-master.zipである。
これを適当なところで解凍する。そして
chatterbot_corpus-master/chatterbot_corpus/data/
から、japanese
ディレクトリをコピーする。
その後、venvの仮想環境フォルダ(chatbot
)以下の
chatbot/lib/python3.9/site-packages/chatterbot_corpus/data/
にコピーする。
テスト
from chatterbot import ChatBot
from chatterbot.trainers import ChatterBotCorpusTrainer
chatbot = ChatBot('test')
trainer = ChatterBotCorpusTrainer(chatbot)
trainer.train("chatterbot.corpus.japanese")
response = chatbot.get_response("こんにちは")
print(response)
これを適当な名前で保存する(test_chat.py
とか)。
そして実行する。
python3 test_chat.py
すると以下の実行結果が得られる。
Training ai.yml: [####################] 100%
Training botprofile.yml: [####################] 100%
Training computers.yml: [####################] 100%
Training conversations.yml: [####################] 100%
Training emotion.yml: [####################] 100%
Training food.yml: [####################] 100%
Training gossip.yml: [####################] 100%
Training greetings.yml: [####################] 100%
Training health.yml: [####################] 100%
Training history.yml: [####################] 100%
Training humor.yml: [####################] 100%
Training literature.yml: [####################] 100%
Training money.yml: [####################] 100%
Training movies.yml: [####################] 100%
Training politics.yml: [####################] 100%
Training psychology.yml: [####################] 100%
Training science.yml: [####################] 100%
Training sports.yml: [####################] 100%
Training trivia.yml: [####################] 100%
お元気ですか?
最後の「お元気ですか?」の部分はランダムに変わる(「こんにちは」に変わったりなど)。その返答の候補たちはgreetings.yamlに書いてある。つまりこれらのyamlファイルを調整することで返答は作り込める。
さらに進んで
上記のテストスクリプトは実行のたびにtraining(訓練)が走るので、非効率である。しかしながらchatbotを「保存」するということはできない。厳密には保存という概念ではなく、データベースの「更新」なのである。これがChatterBotの仕様である。
テストスクリプトを実行した後、db.sqlite3
というファイルが保存されていることに気づく。これが先ほど訓練したchatbotのデータベースである。ファイル名はデフォルトの状態であり、例えば以下のようにすれば保存ファイルを変更できる。
from chatterbot import ChatBot
from chatterbot.trainers import ChatterBotCorpusTrainer
chatbot = ChatBot(
'test',
database_uri='sqlite:///database.db'
)
trainer = ChatterBotCorpusTrainer(chatbot)
trainer.train("chatterbot.corpus.japanese")
データベース名はdatabase.db
である。このデータベースを再度読み込んでchatbotを構築する際には、
from chatterbot import ChatBot
chatbot = ChatBot(
'test',
database_uri='sqlite:///database.db',
)
response = chatbot.get_response("こんにちは")
print(response)
を使う。データベースを更新済なので、再度の訓練は不要である。当然、新たにyamlファイルを更新すれば、訓練してデータベースを更新する必要はある。
ChatterBotにはまだいくつか訓練するためのクラスが存在しており、必ずしもyamlの編集・更新が必要というわけではないらしい。
おわりに
ひとまずインストールは完了した。
ChatterBotを「賢く」するには、何らかの方法でデータベースを更新する必要がある(自動・半自動・手動)。
それはまた記事を改めて書くことにする。
参考
インストール全般はこちらのスレッドを参考にした。
github.com
言語モデルを導入して賢くしていくには、以下の記事が参考になろう。
zerofromlight.com