前回は、日時を表示する部分のスクリプトを作成しながら、モジュールと変数について説明しました。今回は「条件分岐」について理解しながら、ユーザーの入力(発話に当たる部分)を取得し、それが「何時」だった場合に時刻を出力する処理を実装して、対話システムを完成させましょう。

今回も作業ディレクトリは前回と同じ「C:\Users\user\Documents\pychat\datebot」とします。

ユーザーの入力を取得する

ユーザーが入力したデータの取得には「input」という関数を使います。作業ディレクトリ以下に、「user.py」というスクリプト名で次のようなコードを作成してください。

user_uttr = input("ユーザー発話> ")
print("ユーザーの発話内容:", user_uttr)

このスクリプトでは、まずinput関数を用いてユーザーが入力したデータを取得します。input関数は、引数に指定された文字列を表示した後、ユーザーからの入力を待機します。今回の場合、コマンドプロンプトに「ユーザー発話> 」と出力してから、ユーザーの入力を待機するようになります。

そこで、ユーザーがコマンドプロンプトに文字を入力してエンターキーを押すと、その文字列をinput関数が戻り値として返します。このスクリプトでは、その戻り値を「user_uttr」という変数に束縛し、最後にprint関数で表示します。

それでは実際に実行してみましょう。実行すると、以下のように「ユーザ発話> 」の行でユーザーの入力を待機します。

$ python user.py
ユーザー発話>

ここで、例えば「何時」と入力すると、入力内容の「何時」がそのまま出力されます。

$ python user.py
ユーザー発話> 何時
ユーザーの発話内容: 何時

これで、ユーザーの入力データを取得できるようになりました。

最後に、ユーザーの入力が「何時」かどうかの判定を行う処理を実装していきましょう。

条件分岐を使う

プログラミングの世界では、特定の条件によってその後の動作を変えることを「条件分岐」と呼びます。今回のように、「ユーザーの入力が『何時』かどうかによって行う処理を変える」というのは、まさに条件分岐です。

Pythonで条件分岐を行う際には、「if文」を使います。まずは手始めに、user.pyを修正してユーザーの入力が「何時」の場合には「条件は成り立ちます。」と表示し、そうでない場合は「条件は成り立ちません。」と表示するようにしてみましょう。

user_uttr = input("ユーザー発話> ")

if user_uttr == "何時":
    print("条件は成り立ちます。")
else:
    print("条件は成り立ちません。")

上記のように、if文では「if」の後ろに条件式を書き、その条件が成立する場合には続くインデントされた行を実行します。また、条件が成り立たない場合は「else」に続くインデントされた行を実行します。

このようにPythonでは、インデントで特定の条件の処理を行う範囲を表します。インデント開始直前の行末が「:(コロン)」で終わることにも注意してください。

今回は条件式に「user_uttr == “何時”」のように演算子「==」を用いて、2つのオブジェクトの値が等しいかどうか確認しています。値が等しい場合にはそれに続いてインデントされた行のprint文が実行されるというわけです。

それでは早速実行してみましょう。

$ python user.py
ユーザー発話> 何時
条件は成り立ちます。

「何時」と入力された場合には、想定通りの動作をしています! それでは、「何時」以外の文字列を入力した場合はどうでしょうか。

$ python user.py
ユーザー発話> 時計
条件は成り立ちません。

想定通り「条件は成り立ちません」が表示されました! 「時計」以外の文字列を入力してみても、同様の結果になるはずです。これで条件分岐は実装できたことになります。

※ 「インデント」とは、行頭に複数の半角スペースやタブ文字を入力して文の書き出しを下げることです。Pythonのコーディングスタイルについて言及している「PEP8」では、インデントには半角スペース文字を4つ使用することを推奨しています。エディタに「VSCode」を利用している場合、行頭で「Tab」キーを押すことでインデントが行えるので、ぜひ活用してください。

仕上げ

それでは、date.pyとuser.pyの内容を合わせて、今回作成する対話システムを仕上げましょう。作業ディレクトリ以下に「datebot.py」という名前で次のようなスクリプトを作成してください。


import datetime

# Windows環境でstrftimeメソッドを使うために必要な設定
import locale
locale.setlocale(locale.LC_ALL, '')

user_uttr = input("ユーザー発話> ")

if user_uttr == "何時":
    # 日付文字列を取得
    d = datetime.datetime.now()
    d_formatted = d.strftime("%Y年%m月%d日%H時%M分")
    # 応答発話を作成
    # 文字列オブジェクトの format メソッドで "{}です。" という文字列の {} に日時をいれる。
    system_uttr = "{}です。".format(d_formatted)
    print(system_uttr)
else:
    print("すみません、わかりません。")

いきなりコードが長くなったように感じられるかもしれませんが、よく見るとここまでで作成したスクリプトを組み合わせただけであることがおわかりいただけると思います。

1つだけ、if文で条件が成立したときに複数行を実行したい場合は、上記のコードのようにif文の後に実行する行を連続してインデントすることに注意してください。

それでは実行してみましょう。

$ python datebot.py
ユーザー発話> 何時
2019年05月12日01時48分です。

期待通りの動作をしています! では、ユーザーが「何時」以外の発話を入力した場合はどうでしょうか。

$ python datebot.py
ユーザー発話> 時計
すみません、わかりません。

こちらも想定通りの動作をしていますね。

* * *

前回と今回の2回に渡り、モジュールと変数、条件分岐について理解しながら日時を教えてくれる対話システムを作成しました。ユーザーの入力データ(発話)の取得も行うことで、より対話システムらしいプログラムを作成できるようになってきました。

次回もPythonの機能を紹介しながら、少しずつ複雑な対話システムを実装していきます。

著者紹介


株式会社NTTドコモ
R&Dイノベーション本部 サービスイノベーション部
阿部憲幸

2015年京都大学大学院理学研究科数学・数理解析専攻修了。 同年、NECに入社。 2016年から国立研究開発法人情報通信研究機構出向。 2018年より現職。 自然言語処理、特に対話システムの研究開発に従事。 毎日話したくなるAIを夢見て日夜コーディングに励む。
GitHub:https://github.com/noriyukipy