前回は、発話するプログラムを作りながら、オブジェクトの概念について解説しました。続く今回と次回は、日時を教えてくれる対話システムを作成しながら、「モジュール」と「変数」、「条件分岐」について説明していきます。

対話システムをデザインする

今回作成する「日時を教えてくれる対話システム」は、以下のように、ユーザーの発話(入力)が「何時」だったときに現在の時刻を答えるというものです。

ユーザー発話:何時
システム発話:2018年05月11日10時11分です。

一方、もし「何時」ではない場合には、次のように「わからない」と答えることとします。

ユーザー発話:時計
システム発話:すみません、わかりません。

対話システムを設計するときは、このように具体的に対話例を書き出してみると、目標とするシステムの構成や課題を洗い出しやすくなります。皆さんも、何らかの対話システムを設計する際は、実際にどんな対話をさせたいのかを書き出してみてください。

それでは、Pythonでこの対話システムを実装していきましょう。作業ディレクトリは「C:\Users\user\Documents\pychat\datebot」としますので、実際に手を動かし始める前に作成しておいてください。

日時を扱う

まず初めに、Pythonで日時を扱う方法について説明しましょう。

Pythonでは、第3回で紹介した「電池付属」の哲学の下、便利な関数やオブジェクトをまとめた「モジュール」を提供しており、それらを組み合わせながらプログラムを作成してきます。今回は、日付や時間に関する操作を提供する「datetimeモジュール」を利用します。

モジュールをPythonスクリプトのなかで利用するには、次のように「import」に続いてモジュール名を指定します。

import datetime

importしたモジュールは、その名前の後ろに「.(ピリオド)」を付けて指定することで、そのモジュールに定義されている関数やオブジェクトなどを利用できます。

ここからは、モジュールの具体的な使い方を解説していくので、まずはモジュールを使えるようになることを目指しましょう。

それでは、作業ディレクトリ以下に「date.py」という名前でモジュールを扱うためのスクリプトを作成してください。

import datetime

d = datetime.datetime.now()
print(d)

datetime.datetime.now()が、モジュールを利用している部分となります。

datetimeモジュールは、そのなかで日時を取り扱うdatetimeオブジェクトを定義しています。モジュール名「datetime」の後ろに「.」を付けて「datetime.datetime」としている部分は、datetimeモジュールのなかのdatetimeオブジェクトを使うことを意味しています。

datetime.datetimeオブジェクトは、日時オブジェクトを返すnow()メソッドを持っています。そこで、第5回で解説したように、オブジェクトに「.メソッド名」を付けることでメソッドを呼び出しているわけです

※ より正確に言うと、このコードではdatetimeモジュールのdatetimeクラスオブジェクトのメソッドnow()を呼び出しています(「クラス」については、いずれ連載で解説します)。

このPythonスクリプトでは、「d = datetime.datetime.now()」の箇所にも注目してください。ここでは、datetime.datetimeオブジェクトのnow()メソッドによって作成した日時オブジェクトを「=」を使って「d」という名前の変数に束縛しています。Pythonの変数はオブジェクトに名前を付けるようなもので、変数を使うことで一度作成したオブジェクトにその後変数を通してアクセスすることができます。今回のスクリプトの場合は、変数「d」を通して日時オブジェクトを利用することができるようになるわけです。

変数はプログラミングをしていく上で何度も出てきますので、使えるように慣れておきましょう。

このスクリプトでは、最後の「print(d)」によって、変数dの内容(この場合、日時オブジェクトの中身)を出力しています。

それでは実行してみましょう。実行すると次のように日時オブジェクトの中身である「現在の日時」が表示されます。

$ python date.py
2019-05-11 23:39:28.305495

現在の日時が表示されましたが、フォーマットに少し違和感があります。今回作成する対話システムの日時フォーマットに合わせて、表示を変更してみましょう。

日時フォーマットの変更を行うには、日時オブジェクトのメソッドstrftimeを使います。このメソッドの引数に日時フォーマットを指定することで、対応する文字列を返します。正しいフォーマットで日時を表示するように、先ほどのスクリプトを少し変更したプログラムは以下の通りです。

import datetime

# Windows環境で必要な設定
import locale
locale.setlocale(locale.LC_ALL, '')

d = datetime.datetime.now()
# 日時オブジェクトを指定した日時フォーマットの文字列に変換する。
# 日時フォーマットは次の通り
# - %Y -> 西暦
# - %m -> 月
# - %H -> 時
# - %M -> 分
d_formatted = d.strftime("%Y年%m月%d日%H時%M分")
print(d_formatted)

※ 注意点として、Windows環境ではstrftimeメソッドで日本語を使うために「# Windows環境で必要な設定」で記載したlocaleの設定が必要となります。

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

$ python date.py
2019年05月12日00時17分

これで、対話システムが日時を表示する部分を実装できたことになります。

なお、この変更したスクリプトでは正しいフォーマットの日時文字列を「d_formatted」という変数に束縛しています。変数の名前にはアルファベットの大文字と小文字、数字、アンダーバーを使うことができるので、アンダーバーで単語を区切って後から読んでもわかりやすい名前を付けるようにしましょう。

次回は、ユーザーの発話を取得して「何時」だったときに日時を出力する処理を実装し、日時を教えてくれる対話システムを完成させましょう。

著者紹介


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

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