💡

日本語プロシーディングス対応!GPT-4o-miniによるプロシーディングスの自動要約コードの実装

2024/12/29に公開

私たちの研究室(NISLab)

https://nisk.doshisha.ac.jp/

アドベントカレンダー 28日目~

https://nislab-advent-calendar-2024-12.vercel.app/

参考にしたコード

こちらのGitHubを日本語の論文に適用しました.
https://github.com/ShotaImamura/Proceedings-summarizer

この記事で作成したコード

https://github.com/ShunKuroiwa0000/proceedings_summarizer_jp/tree/main

概要

こんにちは.M2の黒岩です.
みなさん,論文を読むとき,探すとき,どうやって探していますか.現状AIを用いた論文探索サイトPerplexityや論文検索ツールとしてよく利用されるGoogle scholarなど,多くの論文検索サイトがあります.
しかし,プロシーディングスをすべて読むという論文の探し方をしたことはありますか.多分ほとんどの人はないと思います.
学会のプロシーディングスは読むには時間がかかりすぎるのがデメリットだと思います.
このブログではGPT4oを用いた論文誌を効率よく読むコードを紹介します.

このコードを読むことでできること

  1. 英語のみに対応していたコードを日本語の論文誌でも利用可能にする方法が分かります。
  2. 日本語プロシーディングスから効率的に要約を生成する方法が理解できます。

このコードは、もともと英語のプロシーディングスを対象に要約を生成する以下のリポジトリに基づいています:
https://github.com/ShotaImamura/Proceedings-summarizer

このコードを利用すると,論文ごとにスライドが一枚出力されます.
これをプロシーディングスに利用することで一つの学会や論文誌を短時間で効率よく見ることができます.
今回私は,このコードを日本語のプロシーディングスでも効率的に要約を生成できるように改良しました。

主な変更点

1. 日本語解析ライブラリの導入

  • 変更点: parse.py内で英語テキスト解析に使用されていたNLTKライブラリを、日本語対応の形態素解析エンジン(例:MeCab)に置き換えました。
  • 理由: 英語向けのツールでは日本語の文法構造に対応できないため、適切な形態素解析ツールを導入しました。
  • コード例:
    import MeCab
    mecab = MeCab.Tagger("-Owakati")
    tokens = mecab.parse(text).split()
    

2. 日本語フォント対応のPDF生成

  • 変更点: make_pdf_jp.pyを新規作成し、日本語フォントが正しく表示されるPDFを生成する機能を追加しました。
  • 理由: 英語用のPDF生成では日本語フォントがサポートされないため、matplotlibreportlabを日本語フォント対応に設定しました。
  • コード例:
    from reportlab.pdfbase import pdfmetrics
    from reportlab.pdfbase.ttfonts import TTFont
    pdfmetrics.registerFont(TTFont('HeiseiMin-W3', 'HeiseiMin-W3.ttf'))
    

3. 日本語特化の要約アルゴリズム

  • 変更点: 要約アルゴリズムを、英語ではなく日本語特有の文章構造に最適化しました。
  • 理由: 日本語は主語と述語が離れた位置に配置されることが多く、文脈を正確に捉える必要があります。
  • コード例:
    def summarize_jp(text):
        sentences = text.split("\u3002")  # 日本語文を分割
        summary = "\u3002".join(sentences[:3])  # 先頭3文を要約として返す
        return summary
    

4. 論文ごとの切り分けを変更

  • 変更点: 日本語プロシーディングスを論文ごとにファイルを分ける際に必要があったためです。
  • 理由: 今回のプロシーディングスでは、論文ごとに「概要:」が付いており、このキーワードを基準にファイルを切り分ける仕様としました。
  • コード例:
    if any(keyword in text.lower() for keyword in ["概要:", "keyword", "abstract"]) or i == pdf.page_count - 1:
      # ABSTRACTまたは最後のページを抽出
      abstract_text = extract_abstract(text)
    

5. データベースのUTF-8対応

  • 変更点: SQL.py内のデータベース設定で、日本語文字列を正しく扱うためにUTF-8エンコーディングを設定しました。
  • 理由: デフォルト設定では日本語データの保存・検索に失敗する可能性があるためです。
  • コード例:
    conn = sqlite3.connect('database.db', isolation_level=None)
    conn.text_factory = str  # 文字列をUTF-8で扱う
    

コードの実装

今村さんのgithubと同じです.

結果

以下の図は、改良後のコードによって生成された日本語プロシーディングスの要約結果を示しています。

まとめ

今村さん、このコードの公開ありがとうございます。おかげで
このコードを使えば,自分が検索した場合には見つけられない論文を見つけることができるかも!?
ぜひ,効率よく良質な論文をどんどん読みましょう!

NISLab 小板研究室

Discussion