📌

LangchainとGPTを使ってニュースの自動要約プログラムを作成した

2023/05/02に公開

LangchainとGPTを使用したニュースの要約しました。

主な処理

  1. ニュース記事のスクレイピング(prtimes)
  2. prtimesの記事の参照元のサイトを要約し、記事を生成

1. ニュース記事のスクレイピング crawling.py

対象:prtimes

  • prtimes
    • data/prtimes_company.csvにpratimesにおけるcompany_idを一覧で保持する
    • 保持しているcompany_idの企業の記事は、RSSでtitle、url、intro、updated(更新日)を取得してデータベースのprtimesテーブルに保存する。

2. 記事の参照元の抽出 extracting.py

  • 記事のdivタグ部分をclass指定によって抽出し、divタグ内のテキストを取得

  • 記事内容のテキストをgptに投げ、参考文献を箇条書きのリストで返させる

    • promptは prompt_templates/map_reference.txt

      あなたの仕事は与えられた文章を要約することです。文章が与えられた場合、参考文献の名称を箇条書きで書き出してください。
      
  • gptから得られた箇条書きのリストと、記事部分のhtmlから抽出したaタグのリストをgptに比較させ、一致するものを箇条書きのリスト化させる

    • promptは prompt_templates/reference.txt

      あなたの仕事は参考文献リストとURLリストが与えられた場合、参考文献の名称とURLのタイトルが一致するかを比較し、一致する項目のタイトルとURLを箇条書きで項目の出力形式にしたがって、書き出してください。参考文献リストの項目とURLリストの項目は以下のフォーマットで与えられます。
      
      項目のフォーマット:
          参考文献リスト: タイトル
          URLリスト: タイトル [URL]
      
      参考文献リスト:
      {reference_list}
      
      URLリスト:
      {url_list}
      
      項目の出力形式: タイトル [URL]
      

      入力例

      あなたの仕事は参考文献リストとURLリストが与えられた場合、参考文献の名称とURLのタイトルが一致するかを比較し、一致する項目のタイトルとURLを箇条書きで項目の出力形式にしたがって、書き出してください。参考文献リストの項目とURLリストの項目は以下のフォーマットで与えられます。
      
      項目のフォーマット:
          参考文献リスト: タイトル
          URLリスト: タイトル [URL]
      
      参考文献リスト:
      - 参考文献の名前1 
      - 参考文献の名前2
      
      URLリスト:
      - a tagのテキスト1 [url]
      - a tagのテキスト2 [url]
      
      項目の出力形式: タイトル [URL]
      
  • 一致したタイトルとURLが返された、urlのサイトをスクレイピングし、サイトにおけるタイトルをhtmlのタグ(titleタグ、h1タグ)から取得する

    • このとき、「403 Forbidden」や「Just a moment…」というのが取得された場合、スクレイピングによる記事の取得はできない
  • スクレイピングによりタイトルが取得できた場合には、取得したタイトルをデータベースに保存。取得できなかった場合には、a tagで指定されていたタイトルをデータベースに保存。

  • 抽出されたタイトルとurlをreferencesテーブルに保存する。

3. サイトの要約 generate.py

  • 共通部分

    • コンテンツ部分のテキストをgptで要約する。

    • 記事の生成

      • 要約にはlangchainのload_summarize_chainのtype=map_reduceを使用した。これは長文のテキストを分割したものをそれぞれgptで要約し、gptの結果を最後にgptに結合してgptに入力して要約させる

      • 分割したテキストに適用したプロンプトは prompt_templates/map.txt

        あなたの仕事は与えられた文章から重要なエッセンスを抽出することです。文章が与えられた場合、重要なエッセンスを箇条書きにして、日本語で書き出してください。
        
        文章:{text}
        
      • 結合したテキストに適用したプロンプトは prompt_templates/combine.txt

        あなたの仕事はニュース記事を書くことです。専門知識がない方が読んでも、わかりやすい記事を段階的に考えて論理的に書くことを心がけてください。メモ、言語、文字数が与えられた場合、決められた言語と文字数で、メモを元にニュースの特徴についての記事を敬語で書いてください。
        
        メモ:{text}
        言語:日本語
        文字数:300字以上350字以下
        
    • タイトルの生成

      • 生成された記事内容からgptでタイトルを生成する

      • プロンプトは prompt_templates/title.txt

        あなたの仕事はニュース記事のタイトルを考えることです。ニュース記事が与えられた場合、内容にあった分かりやすいタイトルを段階的に考えて論理的に簡潔に書いてください。
        
        ニュース記事:
        {article}
        タイトル:
        
    • キーワードの生成

      • 生成された記事内容からgptでキーワードを生成する

      • プロンプトは prompt_templates/keywords.txt

        あなたの仕事はニュース記事からキーワードを見つけることです。ニュース記事と出力形式が与えられた場合、固有名称のキーワードを5つ出力形式に合わせて抽出してください。
        
        ニュース記事:
        {article}
        出力形式:キーワードとキーワードの間の区切り文字は「,」
        
  • prtimes

    • class=rich-text のdivタグのテキストを要約する

Discussion