「Chat(チャット)GPT」を使ってみました 2023.2.9

 支部ホームページ担当の鷲見です。
 いつも支部ホームページをご覧いただきありがとうございます。

 最近「Chat(チャット)GPT」という言葉をTVやネットでよく目にします。  (GPT)は Generative Pre-trained Transformer の略だそうです。

 マイクロソフトは自社のサービスに利用しようとChatGPTを運営する米企業に数十億ドルの追加投資を発表しました。最近、マイクロソフトの株価はこの話題で上昇傾向です。
 対する米グーグルは、対抗する対話AIサービスなどについて説明会を開催しましたが、説明会でのAI回答に誤りがあったことが発覚して株価が大幅に下落した。

 以下、実際に使用しての「驚きの性能」について書きます。
 確かにAIの回答にも誤りもありますが、私はGoogle検索に頼っていましたので、それと比較して、便利さが一段上がった気がします。
 今後、良いとこ取りする形で、利用したいと思います。

 なお、利用を開始する方法は、ネット検索でお調べ下さい。

 それでは実際に使用した内容をお知らせします。

(背景)
 私は支部ホームページの案内を、支部会員の皆様に毎月メルマガの形でメール配信しています。
 支部会員の入退会や認証登録アドレスの変更など、本部の登録内容と、メルマガの名簿とを比較してメンテナンスをしている関係から、表を触る機会が多いです。そこで、エクセルの関数について聞いてみました。

【エクセルの関数の問い合わせの例】

ChatGPTのイメージ

ChatGPTのイメージです。
質問に対して回答が届きます。

 以下、『質問』に対する『AI回答』を列記します。

『質問』
氏名 E-MAIL フリガナ
山田 太郎 yamada@abc.com ヤマダ タロウ
鈴木 二郎 suzuki@def.jp スズキ ジロウ
A列から始まるこのような表があります。
R2セルから下の列にE-MAILを記入した時にその右隣のセルに氏名を表から探して表示する関数は何ですか?

『AI回答』
その場合、VLOOKUP関数を使用することができます。
VLOOKUP関数の使用方法は次のようになります。
=VLOOKUP(検索値,範囲,列番号,真偽値)
検索値 : R2セルに記載されているE-MAILアドレス
範囲 : A列から始まる表
列番号 : 2 (氏名が記載されている列)
真偽値 : 0 (完全一致)
具体的には下記のようになります。
=VLOOKUP(R2,A:C,2,0)
このようにすれば、E-MAILが記入されたR2セルに対応する氏名が表示されます。

実際のエクセルシートに関数を入力すると、こうなりました。ChatGPTのイメージ

AI回答の関数をシートの S2 に挿入しました。(赤字の部分です)
ところが、私の質問は「R2セルから下の列にE-MAILを記入した時にその右隣のセルに氏名を表から探して表示する関数」でした。この回答の関数では「氏名を記入した時にアドレスを表示する関数」になっています。

そこで、質問を投げ返しました。
『質問』
この回答では、R2に氏名を記入するとR2セルに対応するE-MAILがS2に表示されます。
先の質問は、「R2セルから下の列にE-MAILを記入した時にその右隣のセルに氏名を表から探して表示する関数は何ですか?」でした。
再度回答を下さい。

『AI回答』
申し訳ありません、前回の質問の意図を誤りました。
先の質問に対して、R2セルにE-MAILを入力したときにその右隣のセルに氏名を表から探して表示する関数は、INDEX関数とMATCH関数の組み合わせを使用することで実現できます。
INDEX関数:
=INDEX(範囲,MATCH関数の結果,列番号)
MATCH関数:
=MATCH(検索値,範囲,真偽値)
範囲 : A列から始まる表
検索値 : R2セルに記載されているE-MAILアドレス
真偽値 : 0 (完全一致)
具体的には下記のようになります。
=INDEX(A:C,MATCH(R2,B:B,0),1)
このようにすれば、E-MAILが記入されたR2セルに対応する氏名がS2セルに表示されます。

なんと「申し訳ありません。」と回答して来ました。
新回答は正解です。先のエクセルシートの S4 セルに関数を入れました。(エクセルシートの青字の部分です)
今度は私の希望通り、メールを記入するとそれに対応する氏名が表示されています。

 エクセルに慣れた皆様には「ルックアップ関数などお手の物、聞く必要ない。」とおっしゃるかもしれませんね。
 では次の例を御覧ください。タマゲます。

【AIにpython言語のプログラムを書かせる】
 先に書きましたように、私はホームページのお知らせにメルマガを送信しています。
 支部会員の入退会やメールアドレスの変更により松愛会本部の名簿が改定されます。私は本部の名簿とメルマガ配信用名簿を突き合わせて更新しています。
 この検索作業に使用するPythonのスクリプト(プログラム)をAIに作らせてみました。

『質問』
・日本語で回答作成して欲しい。
・Python言語を使って、Google Colab Notebooks にファイル名”test1.py”のスクリプトを作成して欲しい。
・pandas と numpy を使用する。
・Googleスプレッドシートのファイル名を”maildata.xlsx”とします。
・Googleスプレッドシートに1番目のシートと2番目のシートがあります。

“maildata.xlsx”の1番目のシートの一行目のカラム名とその会員データは

E-MAIL 氏名 sso 配信しない=1 会員番号
shn@aan.com 南 正一 お済みではありません 159

“maildata.xlsx”の2番目のシートの一行目のカラム名とその会員データは

会員番号 氏名 フリガナ E-Mail1 E-Mail2 支部地域 年度末年齢
638 山田 太郎 ヤマダ タロウ tato@abc.jp あすか野 66

・”maildata.xlsx”に新しいシートを作ります、内容は以下とする。
1.1番目のシートのデータフレームをdf1、2番目のシートのデータフレームをdf2とする。
2.df1とdf2に対して Perform the full outer join using “会員番号” as the key でmergeしてdf3とする。df3に新しいカラム名”新アドレス”を追加する。
3.mergeする時にdf1のカラム名の”E-MAIL”とdf2のカラム名の”E-Mail1″の内容(文字列)が違っていれば、df3の新しいカラム名”新アドレス”にフラグ”1″を立てる。同じであれば空白””とする。ただし、このカラムの文字列のアルファベットの大文字と小文字は判別しない。
4.df3を、”maildata.xlsx”に、新しくシートを追加し、その追加したシートに内容(データ)を出力する。

『AI回答』
以下がGoogle Colab Notebooks上に”test1.py”というファイル名でスクリプトを作成するためのサンプルコードです。
import pandas as pd
import numpy as np
# 1番目のシートの読み込み
df1 = pd.read_excel(‘maildata.xlsx’, sheet_name=0)
# 2番目のシートの読み込み
df2 = pd.read_excel(‘maildata.xlsx’, sheet_name=1)
# full outer join using “会員番号” as the key
df3 = pd.merge(df1, df2, how=’outer’, on=’会員番号’)
# 新しいカラム名”新アドレス”を追加
df3[‘新アドレス’] = np.where((df3[‘E-MAIL’].str.lower() != df3[‘E-Mail1’].str.lower()), ‘1’, ”)
# df3を”maildata.xlsx”に新しくシートを追加し、内容を出力
with pd.ExcelWriter(‘maildata.xlsx’, engine=’openpyxl’, mode=’a’) as writer:
df3.to_excel(writer, sheet_name=’Sheet3′, index=False)

 これ、正解なのです。動きます。
 私は、プログラムを生業にしておりませんでしたので、専門家の皆さまには、私のAIとの会話に突っ込み処が多々あると思います。
 実際は、この回答になる前に何回か質問方法を変えて試行錯誤しました。回答を実際に実行させると色々とエラーが出ましたので、その時は質問方法を変えて、さらに具体的に質問をしなおし、このようになりました。
 この結果は実用になりますので、今月からこのスクリプトを使って名簿のメンテをします。先に自分で書いて使ったスクリプト(プログラム)と比較すると、無駄がなく美しく出来上がっています。自作では面倒な事をしていたと気付かされました。

 思うに、Pythonのステップを日本語で書けば、日本語が高級プログラム言語になっていて、それをPythonの言語に翻訳してくれています。すなわち対象とするプログラム言語の概略(流れ)を勉強するだけで、それが使える時代が来ています。細かい記号を覚える必要は無くなっています。算盤が苦手でも電卓は使える、の感覚でしょう。
 ただし、素人がこれを使って悪意のあるプログラムを作る輩も現れそうに思います。

  さて、私の勉強不足で、出来上がったスクリプトに良くわからない所がありましたので、追加の質問をしました。
 上記の np.where() の関数の使い方で、 != の使い方が理解できなかったので聞いてみました。ヒェ~、ビックリです。よく理解できました。

『質問』
Pythonのnumpyで、()内の” != “は何を意味しているの?
df3[‘新アドレス’] = np.where((df3[‘E-MAIL’].str.lower() != df3[‘E-Mail1’].str.lower()), ‘1’, ”)

『AI回答』
Pythonのnumpyのnp.where()関数の使い方について説明します。
np.where()関数は、3つの引数を受け取ります。第1引数は条件式、第2引数は条件式が真の場合に返す値、第3引数は条件式が偽の場合に返す値です。
ここで、()内の” != “は、等しくないことを意味しています。
つまり、df3[‘E-MAIL’].str.lower()がdf3[‘E-Mail1’].str.lower()と等しくない場合に条件式が真となり、第2引数には’1’が返されます。
等しい場合には条件式が偽となり、第3引数には空文字列”が返されます。
つまり、上記のコードは、df3[‘E-MAIL’]とdf3[‘E-Mail1’]の値が異なる場合に、df3[‘新アドレス’]に’1’を代入し、等しい場合には空文字列を代入しています。

 もう完全に先生ですね。
 さて、もう一つの驚きの例です。
【支部ホームページに使用するCSSを作らせる】
(背景)
 ホームページにリスト表示した時に、リストの左側の文字が太字になっています。
 これを細字に変えたいのですが、方法がわかりません。CSSスタイルシートを加工する必要があるのですが、そのコマンドの書き方が私には分かりませんでした。
結果の画像を貼ります。

 この結果をもらうに至る、AIへの質問と回答は以下です。
『質問』
WordPressのWEBページのカスタムCSSを作ります。
対象のページは以下です。
https://pre.shoai.ne.jp/nara-w/2022/12/08/liststyle/
リスト形式になっているこのページの以下の部分の文字のスタイルを変更したいです。

<dt class=”m”>1.<br />
・姨捨の棚田(田毎の月)<br />
</dt>
変更後のスタイルは以下の説明文のスタイルと同じにします。
<dd class=”m”> ちなみに姨捨という地名はかつて貧しい村では70歳になる老人を山に捨てたという伝説に由来。<br />
<br />
</dd>

カスタムCSSは?

『AI回答』
以下のCSSを使用して、<dt class=”m”>の中の文字スタイルを変更することができます。
dt.m {
font-size: 16px;
font-weight: normal;
line-height: 1.5;
text-indent: 20px;
}
このCSSは、<dt class=”m”>に適用されるスタイルを定義しています。font-sizeは文字の大きさをpxで指定して、font-weightは文字の太さを(AIの回答がboltと太字で回答して来たので、ここは私がnormalに手直ししました)に指定し、line-heightは行間を1.5に指定し、text-indentは文字のインデントを20pxに指定しています。
このCSSを使用するには、WordPressのカスタマイズ機能を使用して、該当のページに適用することができます。それでもうまくいかない場合は、 WordPressのテーマのCSSファイルに追加しても良いでしょう。

 このCSSを実際にWordPressに適用した結果は上記に添付したイメージです。
 いやはや脱帽です。

コメント

  1. この記事へのコメントはありません。

  1. この記事へのトラックバックはありません。

PAGE TOP