見出し画像

非エンジニアのためのChatGPTによるPython/VBAコーディング手法(3)

要件定義と処理内容を言語化した指示文

これがChatGPTでPythonやVBAコーディングを行う上でのキモです。これを具体的にどうやるかを説明したいと思います。

要件定義

正直に告白すると、ボクが今までに作成した(作成してもらった)コードは、システム開発における”要件定義”と比較するとボリュームはとても限定的で、”要件定義”という言葉を使うことすら憚れるぐらいのものです。

  1. Suumoサイトにアクセスし、XXX、YYYの情報をスクレイピングし、CSVファイルに出力する(Python)

  2. au Pay注文明細(PDF)から仕訳に必要な情報を取得して、CSVファイルに出力する(Python)

  3. 銀行入出金履歴(日付、出金、入金、入出金者名)を、入金、出金、入居者で異なる処理を施した後に、弥生会計フォーマットに仕分けする(VBA)

とはいえ、”要件定義”は、簡単に言ってしまうと、

概要と構想
システムの概要や、どのような仕上がりになる予定なのか、プロジェクトの全体的な概要と目的予想を説明

ユーザーの要求と必須要件
「こうして欲しい、この機能が欲しい」というユーザーの要望と、開発側で出た必須要件を記載

目標や目的
ユーザー側もイメージが掴みやすい、システムを導入する目的、それによって得られるメリットなどを記載

IT-Trend

なわけで、機能が限定的なボクのコードレベルであれば、上記の箇条書きを”要件定義”と言っても間違いではないと思われます。ただし、このレベルの”要件定義”だけで、ChatGPTに指示を出しても具体的なコードには落としてくれないはずです。そこで重要になってくるのが、指示文です。

指示文

正式名称は知りませんが、要は、実際にどういう動きをするコードがほしいか、より具体的に処理方法を明記する文章のことです。

粗粗の指示文

粗々の指示文と書きましたが、"(まだ)抽象度が低い指示文"の方が理解し易いかもしれません。1.の「Suumoサイトのスクレイピング」で説明したいと思います。

  • 対象URL

  • 抽出する文字列(XXX、YYY)の指定

  • CSVファイルの形式(1列目にXXX、2行目にYYY)の指定

は最低限必要な指示です。要件定義とこの情報があればChatGPTもなんとか動き出すことはできるかもしれません。

Suumoサイトにアクセスし、##要件に従い、CSVファイルに出力するPythonのスクレイピングコードを作成して下さい。

##要件
・対象URL:https://www.suumo.jp/xxxxxxxxxxx
・抽出する文字列:"価格:XXX"の"XXX"、"所在地:YYY"の"YYY"
・CSVファイルの形式:1列目にXXX、2行目にYYY

(まだ)抽象度が低い指示文

しかし、この指示文では、なかなかコードを作成してくれません。コードを作成してはくれるのですが、思った通りの結果が得られずに、とてもイライラするはずです。初期のボクですねw

そこで抽象度をより高くなるような指示にします。

抽象度の高い指示文

抽象度の高い指示文とは、”人間が(無意識に)行っている作業を、結果が一意になり、汎用的に使用可能な処理として言語化”することです。

上記のSuumoサイトのスクレイピングコードを作成するのであれば、「自分が20-30件のデータを見て、どのような判断に基づき対象文字列を抽出して、Excelにまとめるか」をより詳細に記述します。

数ページに渡り掲載されている物件情報を人間が見れば、時間がかかり、面倒くさくはありますが、このような形でまとめられると思います。

その判断、処理を言語化します。

(例としてリアルな情報を使わせてもらうため網掛け)

上記のExcelのようにまとめる場合は、

  • "所在地"の横に、”東京都港区白金5”、”東京都港区南麻布3”と記載

  • "販売価格"の横に、"8980万円"、"9990万円"と記載

されているのがわかります。これをソースコードレベルで指定します。

Pythonをちゃんと学んだエンジニアであれば、このHTMLコードを見ればPythonコードに落しこめるのでしょうが、入門動画を2-3本見ただけの非エンジニアでは無理です。

とはいえ、心強い相棒、ChatGPT4.0がいます。そのまま日本語で言語化してOKです!

販売価格は、以下の形式で記載されているので
<dt class="dottable-vm">販売価格</dt> <dd class="dottable-vm"> <span class="dottable-value">8980万円</span>
の"8980万円"を対象と認識し、"8980万円"部分を抽出。"万円"は不要なので、"8980"と出力。他のデータに関しても、同様の記載方法で抽出。

こうなると所在地ももう簡単ですね。日本語で抽出の指示文を書きます。

所在地は、以下の形式で記載されているので
<dl> <dt>所在地</dt> <dd>東京都港区白金5</dd> </dl>
の"東京都港区白金5"を対象と認識し、"東京都港区白金5
"部分を抽出。他のデータに関しても、同様の記載方法で抽出。

ただし、上記だと"販売価格"や"所在地"に変数が代入されることになってしまいます。問題ないといえば問題ないのでしょうが、少々気持ち悪いので、変数名を定義しておきます。

抽出する文字列:"価格:XXX"の"XXX"、"所在地:YYY"の"YYY"
価格は"price"、所在地は"address"を使用してコードを作成


CSVについては、そのままでOKです。ただ、このままだと文字化けを起こすと思うので、

CSVファイルの形式:1列目に"address"、2行目に"price"の形式で出力。その際に encoding='utf-8-sig でエンコーディングする

encoding='utf-8-sigは、「やっとCSVに出力できたー」と思ったら文字化けだった、という苦い経験をしたために、身につけたTipsです。エンジニアの方であれば常識なのかもしれませんが、非エンジニアはそんなこともしらないですからね。

まとめるとこんな感じのプロンプトになりました。

Suumoサイトにアクセスし、##要件に従い、CSVファイルに出力するPythonスクレイピングコードを作成して下さい。

##要件
対象URL:https://www.suumo.jp/xxxxxxxxxx

変数"price":
・ 販売価格の値を抽出
・以下の形式で記載されているので
<dt class="dottable-vm">販売価格</dt>
<dd class="dottable-vm">
  <span class="dottable-value">8980万円</span>
の"8980万円"を対象と認識し、"8980万円"部分を抽出
・"万円"は不要なので、"8980"と出力
・他のデータに関しても、同様の記載方法で抽出

変数"address":
・所在地の値を抽出
<dl>
<dt>所在地</dt>
<dd>東京都港区白金5</dd>
</dl>
の"東京都港区白金5"を対象と認識し、"東京都港区白金5
"部分を抽出。他のデータに関しても、同様の記載方法で抽出

CSVファイルの形式:
・1列目に"address"、2行目に"price"の形式で出力。
・その際に encoding='utf-8-sig でエンコーディングする

” "は具体的な文字列を表す際に使用する書き方らしい

スクレイピングについては他にもいくつかのコードを作成して経験したことがあるのですが、ここでは割愛します。知っていただきたいのは、「抽象度の高い指示文」についてなので。

これだとかなり苦労すると思うのですが、最終的にはなんとか試行錯誤を繰り返し、コードが完成すると思います。

この先に、「抽象度が高く、具体的な指示文」があるのですが、それは次回に。


いいなと思ったら応援しよう!