![見出し画像](https://assets.st-note.com/production/uploads/images/147307268/rectangle_large_type_2_7d8d8cb9de553fbc92807ab285231c37.png?width=800)
vol46. 会計士、 調査報告書を要約するコードを書き、 その出力を考えてみる
はじめに
第三者委員会ドットコムというサイトを見ていると、多くの会社で様々な不正が起きていることがわかります。
同サイトには調査報告書のPDFリンクもあり、非常に便利ですが、近年の報告書はボリュームが多く、全て読むのは容易ではありません。
そこで、日付を指定すると、自動で同サイトにアップされている調査報告書をダウンロードし、PDFからテキスト抽出の上、原因や再発防止策を要約するコードをPythonでドラフトしてみました。
サンプルコード
以下、筆者のGoogle Colaboratory環境で動くことは確認済です。なお、要約の部分はOpen AIの大規模言語モデル (サンプルコード上はgpt-3.5turboだが、gpt-4o等の変更可能) を使っており、 使用するには有料のOpenAIのAPIキーが必要となります。
# 必要なパッケージをインストール
!pip install requests beautifulsoup4 pymupdf openai==0.28 nest_asyncio
# 必要なパッケージをインポート
import os
import requests
from datetime import datetime
from bs4 import BeautifulSoup
import pandas as pd
import fitz
import openai
import nest_asyncio
# OpenAI APIキーを設定
openai.api_key = 'OpenAIのAPIキー'
# 現在の日付と指定された日付を取得
start_date = datetime(YYYY, MM, DD)
# PDFをダウンロードするディレクトリを作成
os.makedirs('pdf_reports', exist_ok=True)
# 対象のURLを設定
url = 'http://www.daisanshaiinkai.com/'
# HTTPリクエストを送信
response = requests.get(url)
response.raise_for_status()
# BeautifulSoupオブジェクトを作成
soup = BeautifulSoup(response.content, 'html.parser')
# データフレームの準備
columns = ['証券コード', '日付', '会社名', '会計監査人', 'PDFリンク']
data = []
# データを抽出
for element in soup.find_all('div', class_='list_data'):
security_code = element.find('td', class_='w_cord').text.strip().split('\r\n')[0]
company_name = element.find('td', class_='w_company').text.strip()
auditor = element.find('td', class_='w_kansa').text.strip()
ir_date_str = element.find_all('td', class_='w_data')[0].text.strip().split()[0]
report_date_str = element.find_all('td', class_='w_data')[1].text.strip()
if report_date_str == "未公表":
continue
try:
ir_date = datetime.strptime(ir_date_str, '%Y/%m/%d')
except ValueError:
print(f"日付の形式エラー: {ir_date_str}")
continue
if ir_date < start_date:
continue
pdf_link = element.find('a', href=True)['href']
data.append([security_code, ir_date_str, company_name, auditor, pdf_link])
df = pd.DataFrame(data, columns=columns)
# PDFの内容を抽出
def extract_text_from_pdf(url):
response = requests.get(url)
response.raise_for_status()
pdf_document = fitz.open(stream=response.content, filetype="pdf")
return ''.join(page.get_text("text") for page in pdf_document)
# 内容列を新たに追加し、PDFリンクからテキストを抽出
df['内容'] = df['PDFリンク'].apply(extract_text_from_pdf)
# 'PDFリンク'列を削除
df.drop(columns=['PDFリンク'], inplace=True)
# OpenAIを使って質問に回答する関数を定義
def ask_gpt(content, question):
response = openai.ChatCompletion.create(
model="gpt-3.5-turbo",
messages=[
{"role": "system", "content": "あなたは不正調査の専門家です。"},
{"role": "user", "content": f"内容: {content}\n質問: {question}\n回答:"}
],
max_tokens=1000,
temperature=0.5,
)
return response['choices'][0]['message']['content'].strip()
# 質問を定義
questions = {
"不正の原因": "今回の不正が起きた原因を100字以内でまとめてください。",
"再発防止策": "今回の不正の再発防止策を100字以内でまとめてください。"
}
# 各行に対して質問を実行する関数
def process_rows(df):
df['不正の原因'] = df['内容'].apply(lambda x: ask_gpt(x, questions['不正の原因']))
df['再発防止策'] = df['内容'].apply(lambda x: ask_gpt(x, questions['再発防止策']))
# データフレームの処理
process_rows(df)
# 内容列を削除
df.drop(columns=['内容'], inplace=True)
# データフレームをCSVファイルにエクスポート
df.to_csv('調査報告書まとめ.csv', index=False, encoding='utf-8-sig')
サンプルコードの利用は自己責任で行って頂きますようお願いします。本記事の内容や提供するコードにより生じた一切の損害について、筆者は責任を負いかねます。
出力イメージ
以下は2024年4月1日を指定してコードを実行し、エクスポートされたCSV
ファイルのイメージです。
![](https://assets.st-note.com/img/1720920952964-oCvhSDWUZa.png?width=800)
出力を考えてみる
これら出力された内容を見ると、各社で以下のような言葉が並んでおり、企業を構成する各社員の道徳や組織の雰囲気が不正の原因となっていることが気になりました。
企業文化
組織風土
営業偏重
共謀
倫理観
職場風土
コンプライアンスなど
まとめ
ちょうど先日「倫理資本主義の時代」という書籍を読む機会がありました。
倫理資本主義とは、資本主義の枠組みの中で倫理や道徳を重視し、企業活動を通じて社会全体の利益を追求する経済モデルです。この概念は、ドイツの哲学者マルクス ガブリエルによって提唱されました。ガブリエルは、資本主義が単なる利益追求のシステムではなく、道徳的進歩を経済の推進力とするべきだと主張しています。
優れた事業活動(あるべき事業活動)」は道徳的善に役立つこと、すなわち道徳律に完全に従うことになる。ならば利益とは主に株主価値の増大ではなく、問題解決への重要な貢献を意味すると考えられる。そうすれば道徳的に正しい事業が豊かさを増大させ、必然的に利益を生むことが容易にわかるはずだ。
道徳的に正しいことは時代と共に変わる難しいテーマですが、各自が道徳について考え、意見を発信し、議論することが重要です。短期的な会計上の数値や見せかけの利益ではなく、持続可能な成長やステークホルダー全体の利益を重視する「真の利益」を追求することで、不正の減少にもつながるでしょう。
おわりに
この記事が少しでもみなさまのお役に立てれば幸いです。ご意見や感想は、noteのコメント欄やX(@tadashiyano3)までお寄せください。
この記事に記載されている内容は、私の個人的な経験と見解に基づくものであり、過去に所属していた組織とは関係ございません。
この記事が気に入ったらサポートをしてみませんか?