前回までで、プログラム開発の基本となるPythonスクリプトの作成方法と実行方法を解説しました。今回は、「発話するプログラム」の作成を通して、Pythonでプログラミングをする上で避けては通れない「オブジェクト」を理解しながら、プログラムを改良していく方法を学びましょう。
なお、作業ディレクトリは「C:\Users\user\Documents\pychat\utterance」としますので、実際に手を動かす前に作成しておいてください。作成の仕方がわからない場合は、前回の記事を参考にしていただければと思います。
発話するプログラムの基本的な仕組み
前回、「あいさつするプログラム」として次のようなプログラムを作成しました。
print("はじめまして!")
これは、システムから「はじめまして! 」とあいさつしてくれるプログラムです。「はじめまして」のように、「話している言葉」のことを対話システムでは「発話」と言い、話し手のことを「発話者」と言います。この例では、発話者であるシステムが「はじめまして!」と発話していることになります。
対話システムでは発話が基本的な構成要素となります。Pythonで発話を表現するのに最も簡単なのは、文字列を使うことです。文字列は “お帰りなさい!” 、もしくは ‘お帰りなさい!’ のように、「”(ダブルクォーテーション)」または「’(シングルクォーテーション)」で囲んで記述します。どちらでも結果は変わりません。
それでは早速、作業ディレクトリ以下に「utterance.py」というスクリプトを作成し、以下のように記述してみましょう。
# 文字列による発話
print("システム発話:", "お帰りなさい!")
スクリプトの1行目は「#(シャープ)」から始まっています。Pythonは、#から後はプログラムの動作には関わらない「コメント」として扱います。コメントを使うことで、スクリプトや一連の処理の説明をプログラム内に残しておくことができます。
上記のプログラムを実行すると、以下のように「システム発話: お帰りなさい!」と表示されます。
$ python utterance.py
システム発話: お帰りなさい!
皆さんが実装する際には、先述のプログラム内のコメント(「文字列による発話」)をそのまま記述する必要はないので、後から自分で読んだときにわかりやすいコメントに書き換えてもかまいません。例えば、次のようにコメントを変更しても上のプログラムと同じ動作をします。
# 文字列は「"」で文字を囲んで記述する
print("システム発話:", "お帰りなさい!")
スクリプトの2行目は、本連載でも既に何度か登場したprint関数を使って、2つの文字列”システム発話:”と”お帰りなさい!”を表示しています。print関数には複数の文字列を「,(カンマ)」区切りで渡すことができ、その場合はスペースを挟んで表示します。上の実行例では、”システム発話:”と”お帰りなさい!”の間にスペースを挟んで表示されているのがわかります。
「オブジェクト」と「メソッド」
print関数に渡した文字列は「オブジェクト」と呼ばれます。Pythonでは全てのものをオブジェクトとして扱います。今までプログラムの中で書いてきた”はじめまして!”や”お帰りなさい!”のような文字列も、print関数自身もオブジェクトだったのです。
オブジェクトを扱う際には、そのオブジェクトが持つ「メソッド」を使うことができます。例として、文字列のオブジェクトが持っている「formatメソッド」で説明しましょう。以下のようにformatメソッドを使うと、文字列中の「{}」の箇所にメソッドで指定した文字列(ここでは「”阿部”」)を挿入して表示します。
"{}さん、お帰りなさい!".format("阿部") # "阿部さん、お帰りなさい!" という文字列になる
メソッドを使うには、対象となるオブジェクトの後に「.メソッド名(指定するオブジェクト)」を付けます。メソッドに渡す(指定する)オブジェクトを「引数(ひきすう)」と呼び、メソッドに引数を渡すとメソッドが一定の処理を行って、その結果となるオブジェクトを返します。この「結果となるオブジェクト」のことを「戻り値」や「返り値」と呼びます。
これらの用語を使って表現すると、上記の例は「formatメソッドに文字列オブジェクト”阿部”を引数として渡し、戻り値として文字列オブジェクト”阿部さん、お帰りなさい”を得た」ことになります※。
* * *
以上、今回は発話するプログラムを通してオブジェクトとメソッドの解説をしました。次回は、文字列オブジェクトのformatメソッドを使って発話するプログラムを改良していきましょう。
※ ここでは詳細は割愛しますが、print関数もオブジェクトなのでメソッドを持っています。
著者紹介
![]() |
株式会社NTTドコモ
R&Dイノベーション本部 サービスイノベーション部
阿部憲幸
2015年京都大学大学院理学研究科数学・数理解析専攻修了。
同年、NECに入社。
2016年から国立研究開発法人情報通信研究機構出向。
2018年より現職。
自然言語処理、特に対話システムの研究開発に従事。
毎日話したくなるAIを夢見て日夜コーディングに励む。
GitHub:https://github.com/noriyukipy