見出し画像

書籍抽出作業をChatGPTにお願いしたら完全に人間で驚いた。【Penmark教科書ができるまで】

はじめまして。Penmarkの河村です。
Penmarkでは大学生向けの時間割アプリを開発していますが、履修している授業に必要な教科書を簡単に購入できる「Penmark教科書」をリリースしました。
このサービスを立ち上げる際に、教授がフリーフォーマットで記述した文章から、書籍を特定しなければならないという難題が存在したのですが、ChatGPTにお願いしたら人間並みの脅威の解釈力で解決してくれました。
この記事では、OpenAIのChatGPTを用いて、膨大な非構造化情報から書籍の構造データを抽出する作業をシステム化した事例を紹介します。

1.Penmark教科書サービスで発生した課題

まず、Penmark教科書で実現したかった機能を説明し、そのために考えた方法とぶつかった課題についてご説明します。

1.1. 背景-「Penmark教科書」とは

Penmarkでは大学生が利用する時間割アプリを開発しています。時間割登録の手間を削減するため、大学が公開しているWebシラバスの情報を取り込んでおり、ワンタップで授業名、曜日時限、教師名、クラスなどを取り込めます。
この機能に加え、履修している授業に必要な教科書を簡単に購入できる「Penmark教科書」というサービスをローンチしました。履修している授業に必要な書籍がリストアップされ、ワンタップで購入サイトに飛ぶことが可能になります。

1.2. 書籍を特定するために考えた方法

このサービスを開始するためには「授業に必要な教科書を特定すること」が必要になります。インプットとして利用可能なのは、Webシラバスに記載されている教科書情報です。例えばこのような情報が記載されています。

授業◯◯の教科書情報
教科書:次の書籍を準備しておくこと。

・麻生良文『マクロ経済学入門』ミネルヴァ書房,2009年


参考書:下記書籍も非常に参考になる。

・滝川好夫 『たのしく学ぶマクロ経済学』 ミネルヴァ書房 2009年

・神取道宏 『ミクロ経済学の力』日本評論社 2014年

このような情報をもとに、書籍を特定する。具体的にはISBNコードを特定する必要がありました。

書籍を特定する方法として、まず、国内のあらゆる書籍を格納した書籍DBを構築しました。このDBのなかから書籍を検索すればOKなのですが、教授が書いた教科書情報は、フリーフォーマットで書かれています。なので、タイトル、出版社、著者など、何がどういう順番で書かれているかは、教授次第という状況です。

そのような状況の中、まず考えた方法は、全文検索エンジンを用いて教科書情報全文をまるっと検索条件として検索する方法です。イメージとしては、Google検索で試してみるとわかりやすいのですが、「麻生良文『マクロ経済学入門』ミネルヴァ書房,2009年」という検索キーワードでGoogle検索をすると、この書籍がトップに引っかかってきます。
この方式はかなり高い精度で拾い上げてくれるのですが、実際に色々試したところ2つの問題がありました。

  1. 複数の書籍情報が含まれている文章の場合に極端に精度が落ちる。

  2. 一冊も書籍情報が含まれていない場合にも書籍を抽出してしまう。

複数の書籍情報が含まれている場合というのは、例えば本AとBの2冊が含まれている文章をそのまま入力して検索するとします。もし、書籍Aの出版社が書籍Bと同じタイトルの書籍を出版していたりするとその書籍もかなりの高スコアで引っかかってしまいます。複数の書籍をまぜこぜにすると、全く関係ない別の書籍が引っかかってしまうことがあり、これを除外することがとても難しいです。

一冊も書籍情報が含まれていない場合というのは、例えば「教科書は初回授業で提示します」のような、文章の場合です。検索エンジンは少しでも合致するとヒットすると判定してしまうので、非常に遠い書籍を抽出してしまいます。先程の文章をGoogle検索すると「本当は使える算数教科書」という書籍が引っかかってしまいます。

いずれも、このままだと買う必要のない書籍を売りつけてしまう結果になるため、なんとしても解決しなければなりません。

1.3. 解決したい課題

今考えている全文検索を用いる方法は、検索条件に与える文章が一冊分の情報であればかなり有効に機能します。ですので、元の文章を書籍一冊ごとに分解できれば全文検索方式でうまくいきそうです。
ただ、教授が書く文章はタイトル、著者、出版社、年度、ISBNコードなどの様々な属性について、何をどの順番で書かれるかは人次第で全く固定されていません。このような文章を本1冊ごとに分解するプログラムを作成するのはかなり難しく、人が判断しない限り真っ当な品質は得られなさそう。と考えていました。ですので、この部分については、人海戦術で対応するしかなさそうです。対応大学が数百になると授業の数も百万件近くになりますので、これを人海戦術でやるのは大変だな….と考えていました。

2. ChatGPTを試してみる。

こういう自然文の解釈はChatGPTが得意なのではと思い、ちょっと試してみました。

# 命令書

次の入力文に含まれる書籍情報を、"連番,書籍名,著者名,出版社名,出版年度"というCSVフォーマットで抽出してください。

# 制約条件

件数の制約:書籍情報は含まれないこともあります。また、最大でも30冊以下です。

書籍名の制約:『書籍名』となるように二重括弧で囲んで出力してください。

著者名の制約:著者が複数いる場合は「:」でつなげてください。

出版年度の制約:西暦でYYYY年という形式にしてください。

不明な場合:情報が記載されていない場合は"-"を出力してください。

課題1) 複数の書籍データが含まれている場合

入力文:
教科書:次の書籍を準備しておくこと。
・麻生良文『マクロ経済学入門』ミネルヴァ書房,2009年

参考書:下記書籍も非常に参考になる。
・滝川好夫 『たのしく学ぶマクロ経済学』 ミネルヴァ書房 2009年
・神取道宏 『ミクロ経済学の力』日本評論社 2014年



ChatGPTの回答:

1,『マクロ経済学入門』,麻生良文,ミネルヴァ書房,2009年

2,『たのしく学ぶマクロ経済学』:滝川好夫,ミネルヴァ書房,2009年

3,『ミクロ経済学の力』,神取道宏,日本評論社,2014年

すごいですね。3冊の情報を3行に分割して抽出してくれています。
また、「次の書籍を準備しておくこと」というような書籍情報がない部分はきれいに除外できています。

課題2) 書籍データが一冊も含まれていない場合

入力文:

教科書は初回授業で提示します。


ChatGPTの回答:
書籍情報はありません。

すごいですね。場合によっては、「-,-,-,-,-」のような空データを返してくれるときもありましたが、ない場合は書籍データは返さないのがすごいです。検索エンジンだとものすごく遠いものでもとにかく何か引っかかって来てしまうので。

この他にもフォーマットの並びが違うパターンなど色々試してみたのですが、ほぼ正確に分割してくれました。人名か出版社名かわかりにくい文字列が入っている場合など、人がやっても間違えそうなケースでは間違えていましたが、人が行うのと同等レベルの作業をやってくれそうです。
人手作業無しで行けると思った瞬間でした。

3. システム化した際の課題と解決策

以下は、実際にシステムに組み込んでみて、発生した課題と解決策です。

3.1. 課題:息を吐くように嘘をつく.

入力文:

『耳から覚える日本語能力試験N1文法トレーニング』(安藤栄里子・今川和、アルク)



ChatGPTの回答:

1.『耳から覚える日本語能力試験N1文法トレーニング』,安藤栄里子:今川和,アルク,-

2.『魔法少女まどか☆マギカ』公式ガイドブック,アニメージュ編集部,徳間書店,-

2.の「魔法少女まどか☆マギカ」はどっから出てきたのだろうか…
調べてみましたがこのような書籍は出版されておらず、完全に架空の書籍でした。

プロンプトに「入力文に含まれない文字列は返してはいけません」と念押ししてみたのですが、確率は減ったように思いましたが、それでもたまに発生しました。「嘘をつかれることはある。」という前提で対処を考えるしか無いかなと思います。
今回の処理は、元の文章からデータを抽出するという処理ですので、"抽出したデータの「書籍名」が元の文章に含まれるかを確認する”という「逆照合」を行って、合致しないものは除外するという処理を入れることで対処しました。

3.2. 課題:レスポンスフォーマットは結構崩れる.

プロンプトで「"連番,書籍名,著者名,出版社名,出版年度"というCSVフォーマットで抽出してください。」と明示していますが、幾つか項目が足りないケースは結構ありました。また、「『書籍名』となるように二重括弧で囲んで出力してください。」というフォーマット指定を行っていますが、二重括弧でく組まれてないケースは結構有りました。
書籍がない場合の返却も結構バラバラです。「書籍はありませんでした。」という文章で返却されることもあれば、「1,-,-,-,-,-」と中身がないCSVフォーマットで返却される場合もあります。
ChatGPTの場合、同じ質問をしても結果が異なる場合もありますので、正直なところ、どういうケースがあるか想定しきれないです。プロンプト自体の工夫も行いますが、100%解決することは難しく、「戻りのフォーマットが異なる場合はスキップする」という対応を行いました。

4. 「完全に人間で驚いた!」ChatGPTの解釈力の凄さがわかる実例紹介

システムに組み込んで、膨大な教科書データを処理させたのですが、その際に実際に行った処理結果をみて、完全に人間じゃないかと感心してしまった例がたくさんありましたので紹介します。
いずれも、ChatGPTへの依頼内容はこれまでのものと同じなので詳細なプロンプトは前述したものですが、ざっというと「入力文から、タイトル、著者、出版社、年度を書籍一冊が一行になるように抽出して」という依頼内容です。

4.1. 感心した点:「同」や「以上」を解釈して補完してくれた.

入力文:

平松義郎『江戸の罪と罰』(平凡社、2010年(初版は1988年))

金田平一郎『近世債権法』(法務庁資料統計局資料課、1948年

同    『近世民事責任法の研究』(九州大学出版会、2018年)



ChatGPTの回答:
1.『江戸の罪と罰』,平松義郎,平凡社,2010年

2.『近世債権法』,金田平一郎,法務庁資料統計局資料課,1948年

3.『近世民事責任法の研究』,金田平一郎,九州大学出版会,2018年

3行目に「同」という記載がありますが、これを前の行の著者と同じという意味だと解釈して補完してくれています。すごいですね。

入力文:

以下の書籍の最新版を推薦する(版数および刊行年は省略する)。 

内田貴『民法Ⅰ 総則・物権総論』、『民法Ⅱ 債権各論』(以上、東京大学出版会) 

近江幸治『民法講義Ⅰ 民法総則』、『民法講義Ⅱ 物権法』、『民法講義Ⅲ 担保物権』(以上、成文堂)



ChatGPTの回答:

1.『民法Ⅰ 総則・物権総論』,内田貴,東京大学出版会,-

2.『民法Ⅱ 債権各論』,内田貴,東京大学出版会,-

3.『民法講義Ⅰ 民法総則』,近江幸治,成文堂,-

4.『民法講義Ⅱ 物権法』,近江幸治,成文堂,-

5.『民法講義Ⅲ 担保物権』,近江幸治,成文堂,-

「以上、東京大学出版会」という記述がありますが、それより前に書かれている2冊の書籍に係ると判断しています。すごいですね…

4.2. 感心した点:「上下巻」という記述を複数冊に分解してくれた.

入力文:

「関数解析の基礎」(上下)コルモゴロフ・フォーミン著 (岩波書店)2002年


ChatGPTの回答:

1,『関数解析の基礎(上)』,コルモゴロフ・フォーミン著,岩波書店,2002年

2,『関数解析の基礎(下)』,コルモゴロフ・フォーミン著,岩波書店,2002年

「上下巻」「前後編」など、巻号情報をひとまとめにして一行に書くことってよくあると思うのですが、このような場合に2冊に分解してくれました。すごいですね……

4.3. すごくないですか?完全に人間で驚いた。

すごいですねばかり言ってますが、いずれも機械とは思えない人のような解釈ができるという事実にただただ驚きでした。こんな処理ができるプログラム、自分では絶対書けないです。すごくないですか?
「非構造化データから構造データを抽出する。」という作業は人が介さないとまともな品質は得られない。というのがこれまでの常識だったと思うのですが、ChatGPTによって大きく変わったと感じました。

従来であれば、人手作業が必ず必要となるレベルの作業だと思います。このタイミングでシステム的には待ち状態となり、人による作業データを受け取って後続処理を再開する。というシステムになるのが普通だと思いますが、ChatGPTのAPI呼び出しをシステムに組み込む事によって、人手処理なしの完全システム化が実現できました。

5. まとめ

いかがだったでしょうか。
Penmark教科書のサービス開始に当たり、本年度(2023)は269校について対応ができました。
Penmark教科書は、抽出した書籍を購入してもらうサービスなので、誤検知はできる限りしたくないです。なので、困ったときの対応は「疑わしい場合は抽出しない。」という方針にしています。この方針のため、「検出できなかった。」というケースは結構ありますが、誤検出はかなり低い確率に抑えられていると思います。

269校の合計授業数は約66万件で、そのうち約30万件の授業は一冊以上の書籍が抽出できたのですが、これらの処理を人による検証作業なしの完全にシステム化した形でデータ作成を行いました。
ChatGPTへのリクエスト数も相当な回数となり、全データが作成できるまでに1週間程度かかりましたが、人手を挟まないので、動かしたら待ってるだけです。

Penmark教科書は、すでにサービス提供を開始しています。実際にどんなデータになってるか確認してみたい人はぜひアプリを使ってみてください!Penmarkは学生向けサービスですが、授業登録と教科書機能は会員登録なしでも試せます。

  1. Penmarkアプリをインストールして起動します。

  2. 「(サービス規約に)同意してはじめる」を選択後、適当な大学を選ぶと時間割画面が表示されます。

  3. 適当なコマをタップするか、右上の「+」ボタンを押すと、授業検索ができますので、適当な授業を登録してください。なお、授業の詳細情報に教科書情報が記載されてる授業でないと動作しないので念のため。

  4. いくつか授業を登録した後に、画面下部にあるタブバーの「学割タブ」をタップします。画面上部に「すべて」「学割」「ストア」「教科書」というメニューがあるのでこの「教科書」をタップすると、冒頭で紹介したような教科書画面が表示されます。

授業名が網掛けになっている場合は、教科書がもともとないか抽出できなかったということです。
なお、4.の学割タブを表示したときに教科書メニューが表示されない場合は対応できていない大学です。ごめんなさい。
使い方はこちらのヘルプページを見てもらっても良いかもしれません。

一緒に働いてくれる人募集中!

株式会社ペンマークは『大学生活を、テクノロジーで変革する。』をテーマに、学生のプラットフォーム『Penmark』を主軸として複数の学生向けサービスを運営しているITスタートアップ企業です。

学生の属性・行動データを駆使して、学生の一生に関わるあらゆる領域に挑戦し、更なる事業展開を目指しています。

エンジニア積極採用中です!

急成長するプロダクトを一緒に開発して頂けるエンジニアを積極採用中です。ペンマークのエンジニアは様々なバックグラウンドを持った魅力的な仲間が多いのが特徴です。ペンマークに興味を持ってくださる方は、是非一度お話しましょう🔥

アプリのダウンロードはこちらから

この記事が参加している募集