見出し画像

Nounsの提案を簡単に要約する方法(Python編)

先日、Nounsの提案を要約する方法を説明しました。
「ChatGPTを使うと要約は簡単にできるよね」という内容だったのですが、問題点がないわけではありません。

問題は、2点あります。

①超長文だと、ChatGPTが拒否してくる。
②ひとつひとつの作業が、意外と面倒くさい。

超長文だと、ChatGPTが拒否してきます。長過ぎると言われるので、半分ずつ要約したり、いらない文章をチェックして人為的に削る作業が発生して面倒くさいです。

また、意外とひとつひとつの作業が面倒です。提案文章をスクロールしながら全文コピーして、ChatGPTに貼り付けて、命令文をコピーして…など、いくつかの手順を踏まないといけなくて、何件も行おうと思うと、ちょっと億劫になります。

ということで、面倒なことが大嫌いなわたしは、ChatGPTに聞きながら、Pythonで自動化することにしました!

Pythonなど触ったことのなかった(少し勉強したけど挫折した)初心者でもChatGPTに教えてもらいながらだと、3日くらいかければなんとか作り上げることができます。AIすごすぎる…

Nounsの提案を1件要約するやつのご紹介

ということで、早速コードを公開します。
あくまでも初心者が作ったコードなので改善の余地があるかと思います。こうしたほうがいいよとか、そうゆうのは優しい言葉でコメントいただけるとすぐに反映しますので、ぜひコメントをお願いします。(どうか叩かないで)

1.必要なライブラリをインストールする

ライブラリをインストールします。多分、csvとかpandasとかmathは使いませんが、試行錯誤してるなかで一旦使ったやつが紛れてます。面倒なのでちょっとこのまま載せます。すみません(叩かないで)

from selenium import webdriver
from time import sleep
import csv
from webdriver_manager.chrome import ChromeDriverManager
import openai
import os
import pandas as pd
import math
from summa import summarizer

2.Seleniumでスクレイピングする

まずは、SeleniumでNounsのvoteページをスクレイピングして本文を取得します。変数 i には、取得したい提案番号(3桁の数字)を入れます。
本文と、本文の最後尾にある予算(ETH)の情報を取得するようにしています。

※<>のところは修正してください。

# enable headless mode
options = webdriver.ChromeOptions()
options.add_argument('--headless')

# start Chrome in headless mode
browser = webdriver.Chrome(ChromeDriverManager().install(), options=options)

i = '<提案番号の数字三桁を入れる>'

url = f'https://nouns.wtf/vote/{i}'
browser.get(url)
sleep(3)
proptext = browser.find_elements_by_class_name("ProposalContent_markdown__3dCs8")
bgt = browser.find_elements_by_xpath("/html/body/div[3]/div/div[1]/div/div/div[2]/div[4]/div/ol/li/span/span")
if proptext:
    
    # combine proptext and bgt
    if bgt:
        combined_text = proptext[0].text + '\n' + 'このProposalの予算:' + bgt[0].text
    else:
        combined_text = proptext[0].text + '\n' + 'このProposalの予算が取得できませんでした。本文を確認してください。'
    # write combined text to file

with open(f"<ここにこのコードを保存するフォルダパスを指定する>/{i}.txt", "w") as f:
 f.write(combined_text)

# close browser
browser.close()

3.OpenAIのAPIキーを指定する

OpenAIのAPIキーを取得して、入れてください。やり方がわからない人はChatGPTに聞いてください。

# APIキーを設定
openai.api_key = <ここにAPIキーを入れる>

# 要約したいファイルが格納されているフォルダのパス
text_page = f'<ここにこのコードを保存するフォルダパスを指定する>/{i}.txt'

4.なんか、テキストを開いて読み込ませる

p = open(f'{i}.txt', 'r')
data = p.read()

5.5,000文字超えるなら軽く要約する

変数dataに入ってる文字が5000超えるなら、summarizerで一旦要約する。これは英語でないとだめなやつ。ratio=0.4となっているのは、本文の40%は残すよっていう設定みたいな。たぶんそう。

if len(data) > 5000:
    summary = summarizer.summarize(data, language='english', ratio=0.4)
else:
    summary =data

6.変数dataに反映

data = summary

7.GPT3で要約&成形

ここでついにGPT3で要約&文章の成形処理を行います。
promptに入っている命令文は、先のnoteで紹介した命令文の前のバージョンです。深津先生のyoutube見る前だったけど、なんとなく似たような命令文にできててよかったなと思ってます。

プロンプトは用途に合わせてカスタマイズしていただけると良いかと思います。

prompt = (f"あなたは日本の中学校の優秀な先生です。生徒に対して難しい単語や難しい英語を使わずに、以下の提案内容を説明してください。例示したフォーマットでそれぞれの項目を150文字以内で簡潔に説明してください。それぞれ重複する説明は排除してください。センテンスは短く切って、箇条書きとしてください。<フォーマット>提案の目的:\n提案の特徴:\n提案の概要:\n propの予算:{data}")
response = openai.Completion.create(model="text-davinci-003", prompt=prompt , temperature=0.5, max_tokens=600)
# 生成されたテキストを新しいリストに追加
response["choices"][0]["text"]

まとめ

ということで、pythonを使ってNounsの提案を要約するプログラムを作った話でした。Nounsに限らず、お好きなサイトの要約などにも活用頂ける内容ではないかなと思います。

サイトによっては、スクレイピングを禁止しているところもあるので、調べてからにしててください。

3日かけて作ったプログラムは、Nounsの全提案を要約してcsvに落とすというやつだったのですが、その派生で今回ご紹介したプログラムを作りました。初心者でもプログラム書けるようになった!ChatGPTすごい!

noteでいただいたサポートは、開業資金として活用させていただきます。ありがとうございます。