シロッコの青空ぶろぐ

高卒シニアが低学歴コンプレックス脱出のため、放送大学の人間と文化コースで学んでいます。通信制大学で学ぼうとする人を応援したい。学んで成功する人が増えれば、私のやる気も燃えるはず。

Python を知らないシニアがBing Chatの力を借りてプログラムを作る

写真提供:フリー素材.com

目次

Bing Chatの限界を感じた

こんにちはシロッコです。

 最近、私のブログには ChatGPT が登場することが多く、ChatGPTについて11本のブログを書いてしまいました。

 たくさんの反響を得ることができ、本当に感謝しています。

 ところが、調子に乗って《歌詞の感情分析》だけでなく、《小説の感情分析》もやってみようと挑戦しましたが、結果は惨敗でした。

 具体的には、「青空文庫」にある太宰治の『走れメロス』を感情分析しようとした結果、ボロボロでした。小説の要約も内容がダメでした。

 ChatGPTが動作する原理も学ぶ機会があり、ChatGPTは「確率的に確からしい」というロボットであるため、小説の文章のどこが重要かを判断することができないのだと思います。

 逆に、ベーシックなパラグラフの構成である、主張するメインセンテンスとそれを支える三つサポートセンテンスで構成された文章なら、要約に適していると思われます。

そして、プログラミングなら、ChatGPTの特性をうまく活用できるのではないかとおもいました。プログラミングの場合、「確率的に確からしい」ことを出力してもらえれば、正解らしいコードが出力されることが期待できます。そして、間違っても、実際に動かしてみれば、正誤を確認できます。

そこで、Python を知らない私が Bing Chatに質問しながら「Pythonプログラミング」を学ぶ記事を書くことにしました。もちろん、困ったときはBing Chatに相談することにします。

というわけで、今回は Python を知らないシニアがBing Chatの力を借りてプログラムを作ります。

Bing Chat にPythonプログラミングを教えて貰う

今回は、プログラとはこんなもの、と理解してもらうのが目的です。

「キネマ旬報ベストテン」が以下のような文字列だったとします。

  • "1位「ドライブ・マイ・カー」濱口竜介"

これをエクセルやデータベースで処理するには三つ項目に分けなければなりません。

それを処理してみます。

日本語の文字列を分割

Bing Chat へのプロンプト文

以下の【対象文】は先頭が順位、次が作品名、最後が監督名です。 Pythonで これを【順位】、【作品名】、【監督名】に分割するプログラムが書けますか?

【順位】とは1位、2位のように数字に「位」の文字がついている。

【作品名】は"「"と"」"で囲まれている。

【監督名】は【順位】ではなく、【作品名】でもなく、最後に登場します。

【対象文】 1位「ドライブ・マイ・カー」濱口竜介

Bing Chat からの回答

はい、Pythonでそのようなプログラムを書くことができます。以下に例を示します。

text = '1位「ドライブ・マイ・カー」濱口竜介'

rank = text.split('位')[0] + '位'
title_start = text.find('「')
title_end = text.find('」')
title = text[title_start+1:title_end]
director = text.split('」')[-1].strip()

print(f'順位: {rank}')
print(f'作品名: {title}')
print(f'監督名: {director}')

このプログラムは、split関数を使用して、対象文を分割し、それぞれの部分を抽出しています。最後に、print関数を使用して結果を表示しています。

text.split とはどのような関数ですか?

Bing Chat からの回答

splitはPythonの文字列メソッドの1つで、指定された区切り文字に基づいて文字列を分割することができます。このメソッドは、区切り文字を引数として受け取り、分割された部分文字列のリストを返します。

例えば、次のようなコードがあります。

text = 'apple,banana,cherry'
result = text.split(',')
print(result)

このコードは、カンマ,を区切り文字として使用してtextを分割し、結果として['apple', 'banana', 'cherry']というリストを返します。

text.split('位')[0] + '位' は何をしていますか?

Bing Chat からの回答

text.split('位')[0] + '位'は、与えられたテキストから順位を抽出するためのコードです。

まず、text.split('位')は、テキストを「位」の文字で分割します。この場合、元のテキストが「1位「ドライブ・マイ・カー」濱口竜介」なので、分割後のリストは ['1', '「ドライブ・マイ・カー」濱口竜介'] となります。

次に、このリストの最初の要素(インデックス0)を取得するために、[0]が使用されます。これにより、「1」という文字列が取得されます。

最後に、「1」という文字列に「位」という文字列を連結することで、「1位」という順位が抽出されます。

(「位」をとるように指示もできます)

処理してCSVファイルに保存

一行だけでなく、多くの行が連続して書かれているファイルの各行を分割してCSVファイルとして保存して欲しい。

Bing Chat へのプロンプト文

このプログラムを【対象文】が行として連続しているテキストファイルを開き、分割したCSVファイルに書き込むように変更してください。

Bing Chat からの回答

以下に、テキストファイルからデータを読み取り、分割してCSVファイルに保存するPythonプログラムの例を示します。

import csv

with open('input.txt', 'r', encoding='utf-8') as input_file:
    with open('output.csv', 'w', encoding='utf-8', newline='') as output_file:
        writer = csv.writer(output_file)
        writer.writerow(['順位', '作品名', '監督名'])
        for line in input_file:
            text = line.strip()
            rank = text.split('位')[0] + '位'
            title_start = text.find('「')
            title_end = text.find('」')
            title = text[title_start+1:title_end]
            director = text.split('」')[-1].strip()
            writer.writerow([rank, title, director])

 

このプログラムは、input.txtという名前のテキストファイルからデータを読み取り、各行を分割して順位、作品名、監督名を抽出し、output.csvという名前のCSVファイルに保存します。CSVファイルの最初の行にはヘッダーとして「順位」、「作品名」、「監督名」という列名が記載されます。

writer.writerow とはどんな関数ですか

writer.writerow は、Python の csv モジュールにある関数です。この関数は、与えられたリストを CSV ファイルの行として書き込みます。

例えば、次のように使います。

import csv

with open('output.csv', 'w') as f:
    writer = csv.writer(f)
    writer.writerow(['A', 'B', 'C'])

このコードは、output.csv というファイルを作成し、その中に A,B,C という行を書き込みます。

実際にやるときはファイル名にパス名をつければいいですね。

はい、その通りです。実際にプログラムを実行するときは、open関数の第1引数に、入力ファイルおよび出力ファイルのフルパスを指定することができます。

例えば、次のように指定することができます。

input_file_path = '/path/to/input.txt'
output_file_path = '/path/to/output.csv'

with open(input_file_path, 'r', encoding='utf-8') as input_file:
    with open(output_file_path, 'w', encoding='utf-8', newline='') as output_file:
        # 以下省略

このように指定することで、特定のディレクトリ内のファイルを読み書きすることができます。

C:\Users\kazka\Documents\python にファイルを作りました。

input_file_path = 'C:\Users\kazka\Documents\python\bestTen96.txt'

output_file_path = 'C:\Users\kazka\Documents\python\bestTen96.csv'

Windows で実行する方法

sirocco.hatenablog.com

Python はインストールしてあります。このプログラムをWindows で実行する方法を教えてください。

PythonがインストールされているWindowsコンピュータで、Pythonプログラムを実行するには、次の手順を実行します。

  1. プログラムをテキストエディタで開き、必要に応じて編集して保存します。例えば、program.pyという名前で保存することができます。
  2. Windowsのスタートメニューから「コマンドプロンプト」または「PowerShell」を開きます。
  3. コマンドプロンプトまたはPowerShellで、プログラムが保存されているディレクトリに移動します。例えば、cd C:\path\to\directoryのように入力します。
  4. 次に、python program.pyと入力してEnterキーを押すことで、プログラムが実行されます。

これらの手順を実行することで、Windowsコンピュータ上でPythonプログラムを実行することができます。

bestTen96.txt を作る

エクスプローラを開き、pythonを処理するディレクトリで右クリックをして新しいファイルを作ります。

「新しいテキスト ドキュメント.txt」が出来ます。

このファイル名を右クリック→「プログラムから開く」→「メモ帳」を選択すると、内容が空っぽの「メモ帳」が立ち上がります。

この内容をコピペします。これは「第96回 キネマ旬報ベストテン」です。

1位「ケイコ 目を澄ませて」三宅唱
2位「ある男」石川慶
3位「夜明けまでバス停で」高橋伴明
4位「こちらあみ子」森井勇佑
5位「冬薔薇(ふゆそうび)」阪本順治
6位「土を喰らう十二ヵ月」中江裕司
7位「ハケンアニメ!」吉野耕平
8位「PLAN 75」早川千絵
9位「さがす」片山慎三
10位「千夜、一夜」久保田直

そして、「ファイル(F)」→「名前をつけて保存(A)」でファイル名を「bestTen96.txt」とし、「文字コード」を「UTF-8」にして「保存」します。

「新しいテキスト ドキュメント.txt」が残りますが消してもいいですし、新しいテキストファイルを作るときのために残してもいいです。

Windows PowerShell で実行

Windows PowerShell を開きます。

簡単なコマンドは知っていますが、詳しいことは「Bing Chat」に「Windows PowerShell の使い方を教えて」とか「Windows PowerShell の cd とは何ですか」とか聞いてみてください。

「cd documents\python」は python関連のファイルを作った場所へ移動するコマンドです。

「ls」はそのディレクトリにあるファイルを表示します。

先に一度実行したので、「bestTen96.csv」が既にあります。

「python spritbestten.py」でプログラムを実行します。

もう一度「ls」を実行すると「bestTen96.csv」の時間が更新されています。

これはエラーが出ないよう対処が終わってからの実行で、実際はエラーがでました。

この方法以外でも実行する方法はありますか?

はい、Pythonプログラムを実行する方法は他にもいくつかあります。

  • Python IDE:Pythonには、IDLEやPyCharmなどの統合開発環境(IDE)があります。これらのIDEを使用すると、プログラムの編集、実行、デバッグなどが簡単に行えます。
  • Jupyter Notebook:Jupyter Notebookは、Webブラウザ上でPythonプログラムを実行することができるツールです。コードとテキストを組み合わせた文書を作成し、対話的にプログラムを実行することができます。
  • スクリプトファイルのダブルクリック:Windowsでは、.py拡張子のファイルをダブルクリックすることで、そのファイルを実行することができます。ただし、この方法ではプログラムの出力が表示されない場合があるため注意が必要です。

これらは、Pythonプログラムを実行する代表的な方法です。目的や好みに応じて適切な方法を選択してください。

Python IDEを使いたい人は「Python IDEとはどのようなものですか」と納得するまで、質問を繰り返してください。オススメは「PyCharm」で有償版と無償版があるようです。ために使うなら、無償版でいいとBing Chatが言っていました。

私のPCでは「spritbestten.py」を右クリックすると、「Edit with IDLE」と「Edit with Notepad++」が表示されます。

実行するとエラーがいっぱいでた

最初のエラー

PS C:\Users\kazka\documents\python> python spritbestten.py
  File "C:\Users\kazka\documents\python\spritbestten.py", line 4
        with open('C:\Users\kazka\Documents\python\bestTen96..csv', 'w', encoding='utf-8', newline='') as output_file:

「.」が2つある。「bestTen96..csv」を「bestTen96.csv」に修正。

SyntaxError:

SyntaxError: invalid non-printable character U+00A0
PS C:\Users\kazka\documents\python> python spritbestten.py
  File "C:\Users\kazka\documents\python\spritbestten.py", line 4
        with open('C:\Users\kazka\Documents\python\bestTen96.csv', 'w', encoding='utf-8', newline='') as output_file:

    ^

pythonの「 invalid non-printable character U+00A0」とは何ですか?

「invalid non-printable character U+00A0」とは、Pythonが文中に無効な非印刷文字を検出したときに発生する「SyntaxError」です1。このエラーが発生する原因として、コード行に中国語スペース、タブなどの非テキスト文字が含まれている可能性があります2。

見ても分からない・・・Orz

非テキスト文字が分からなかったので Bing Chat に文字列を貼り付けてみようとTerapad でプロンプトを編集しようとした。

「        writer.writerow(['順位','作品名','監督名'])? ? ? ? 」

「? ? ? ? 」ここに「非テキスト文字」があるのだ。

Bing Chat からのコピペの影響ですね。

pythonのインデントはタブでないとダメですか?

いいえ、Pythonではインデントにタブを使用する必要はありません。実際、Pythonではタブとスペースのどちらを使用しても構いませんが、PEP8では4つのスペースがインデントとして推奨されています1。

ただし、タブとスペースを混在させることはできません。多くのIDEでは、Tabキーに対して様々な最適化が行われていますが、コードの可読性や互換性を確保するためにも、インデントにはスペースだけを使用することが一般的です12。

日本語を使うという指示

SyntaxError: invalid non-printable character U+00A0
PS C:\Users\kazka\documents\python> python spritbestten.py
  File "C:\Users\kazka\documents\python\spritbestten.py", line 5
    writer.writerow(['順位', '作品名', '監督名'])       
                                         ^

pythonのプログラムの日本語のところを指示してエラーが出ます。日本語があってはダメですか?

いいえ、Pythonのプログラムに日本語が含まれていても問題ありません。ただし、Python 2ではデフォルトのエンコーディングがASCIIであるため、日本語を直接使用するにはエンコーディングを宣言する必要があります1。

pythonのプログラムがutf-8で書いてあることを指示するということですか。

はい、その通りです。PythonのプログラムがUTF-8で書かれている場合、ファイルを開くときにエンコーディングとして’utf-8’を指定することができます。これにより、プログラム内で日本語などの非ASCII文字を正しく扱うことができます。

例を示してください。

もちろんです。例えば、次のようなPythonプログラムがあります。

# coding: utf-8

with open('file.csv', 'r', encoding='utf-8') as f:
    for line in f:
        print(line)

このプログラムは、UTF-8でエンコードされたCSVファイルを開き、その内容を1行ずつ表示します。最初の行にある# coding: utf-8は、このプログラム自体がUTF-8で書かれていることを示しています。

行頭に 「# coding: utf-8」を記入した。

 

SyntaxError: (unicode error)

SyntaxError: (unicode error) 'unicodeescape' codec can't decode bytes in position 2-3: truncated \UXXXXXXXX escape
PS C:\Users\kazka\documents\python>
PS C:\Users\kazka\documents\python> python spritbestten.py
  File "C:\Users\kazka\documents\python\spritbestten.py", line 5
    with open('C:\Users\kazka\Documents\python\bestTen96.txt','r',encoding='utf-8') as input_file:
                                                             ^

pythonの「SyntaxError: (unicode error) 'unicodeescape' codec can't decode bytes in position 2-3: truncated \UXXXXXXXX escape」というエラーは何が原因ですか

このエラーは、文字列内のバックスラッシュ文字がエスケープ文字として使用されるために発生することがあります。例えば、\\nは改行を表し、\\\"や\\'は文字列リテラル内にダブルクォートやシングルクォートを挿入するために使用できます。また、コードポイントを指定して文字を挿入するために、\\U00000000のような形式で記述することもできます(ただし、00000000の部分は任意の16進数です)1。

この問題を解決するためには、バックスラッシュを2つ重ねて(\\\\)記述したり、ファイルパスの区切り文字としてスラッシュ(/)を使用したりすることができます2。

以下のように変更

with open('C:\\Users\\kazka\\Documents\\python\\bestTen96.txt','r',encoding='utf-8') as input_file:
    with open('C:\\Users\\kazka\\Documents\\python\\bestTen96.csv','w',encoding='utf-

これでエラーは消えた

最終的に以下のようなコードになった

# coding: utf-8

import csv

with open('C:\\Users\\kazka\\Documents\\python\\bestTen96.txt','r',encoding='utf-8') as input_file:
    with open('C:\\Users\\kazka\\Documents\\python\\bestTen96.csv','w',encoding='utf-8', newline='') as output_file:
        writer = csv.writer(output_file)
        writer.writerow(['順位','作品名','監督名'])
        for line in input_file:
            text = line.strip()
            rank = text.split('位')[0] + '位'
            title_start = text.find('「')
            title_end = text.find('」')
            title = text[title_start+1:title_end]
            director = text.split('」')[-1].strip()
            writer.writerow([rank, title, director])

実行結果の確認

「bestTen96.csv」を右クリック、「編集」を選択すると以下の内容が「メモ帳」に表示されます。

順位,作品名,監督名
1位,ケイコ 目を澄ませて,三宅唱
2位,ある男,石川慶
3位,夜明けまでバス停で,高橋伴明
4位,こちらあみ子,森井勇佑
5位,冬薔薇(ふゆそうび),阪本順治
6位,土を喰らう十二ヵ月,中江裕司
7位,ハケンアニメ!,吉野耕平
8位,PLAN 75,早川千絵
9位,さがす,片山慎三
10位,千夜、一夜,久保田直

10位が紛らわしいですか映画のタイトルが「千夜、一夜」と「、」が入っています。

csvファイルのデータに「,」が含まれるときはどのように処理すればいいですか?

CSVファイルのデータに「,」が含まれる場合、その値をダブルクォーテーションで囲むことで対応することができます12。例えば、「test list, of, items」という値は、「“test list, of, items”」のように表現することができます。

まとめ

 小説の感情分析をしようとして、Bing Chatの限界を感じました。しかし、ChatGPTの特徴を学んでいるうち、プログラミングなら、ChatGPTの特性をうまく活用できるのではないかと思いました。

 そこで、Python を知らない私が Bing Chatに質問しながら「Pythonプログラミング」を学ぶ記事を書くことにしました。もちろん、困ったときはBing Chatに相談することにします。

ソースコードはBing Chatへのプロンプトで指示て書いてもらいます。
コードの分からない部分はBing Chatへ質問すると丁寧に答えてくれました。

 プログラムが完成したので、実行するとエラーがでました。エラーはエラーコードをコピーしてBing Chatに質問。エラーの原因、対処方法が一発で分かるのでGoogle で検索するより便利です。
 動作を確認しての感想は、エラーの対処が思っていたより大変でしたが、日本語の指示でプログラムが書けてしまうのには新しい時代になったという実感がわきました。
Bing Chatに聞けばなんとかなるという自信も付きました。

 ただ、私はある程度プログラミングの経験があるからであって、全くの初心者は大変なのかも知れません。極力やさしく説明しますので、一緒にBing Chatによるプログラミングを学んでいけたら嬉しいです。
 今回はこれで終わります。

長い記事を最後まで読んでいただきありがとうございます。