Slide 1

Slide 1 text

1 ⾺嶋海⽃ ⽇本経済新聞社 2023年10⽉28⽇(PyCon APAC 2023) Pythonだけでクロスワードパズルを⾃動⽣成 〜⾃然⾔語処理‧組合せ探索‧Webアプリ開発〜

Slide 2

Slide 2 text

2 ⾃⼰紹介 n 名前 p ⾺嶋海⽃(まじま かいと) n 所属 p ⽇本経済新聞社(2023/4新卒⼊社) Ø ⽇経電⼦版の開発 Ø 2022/6~ インターンとして⾃然⾔語処理の研究 n Pythonと私 p 5年前の⼤学の授業で出会う p 研究‧インターン‧業務などで使⽤

Slide 3

Slide 3 text

3 発表⽬的 n PythonだけでのWebアプリ開発の体験を共有 p Pythonの応⽤領域の広さ p Pythonの使いやすさ n 想定する聞き⼿ p Pythonのライブラリについて広く浅く知りたい⼈ p Pythonでのフロントエンドも含めたアプリ開発に興味がある⼈ p ⾃然⾔語処理、最適化に興味がある⼈

Slide 4

Slide 4 text

4 ⽬次 第1部 アプリケーションの概要 n どんなアプリ? n 作成背景 n 実装上の課題 第2部 アプリケーションの処理 n 全体像 n ⾃然⾔語処理 n パズル⽣成 n Webアプリ表⽰ 第3部 開発者体験 n 環境 n Pythonだけでの開発

Slide 5

Slide 5 text

5 ⽬次 第1部 アプリケーションの概要 n どんなアプリ? n 作成背景 n 実装上の課題 第2部 アプリケーションの処理 n 全体像 n ⾃然⾔語処理 n パズル⽣成 n Webアプリ表⽰ 第3部 開発者体験 n 環境 n Pythonだけでの開発

Slide 6

Slide 6 text

6 どんなアプリ?w/ デモ ニュース⽤語でクロスワードを⾃動⽣成するアプリ 設定を⼊⼒ ニュース⽤語を含むヒント付きクロスワードパズルを⽣成

Slide 7

Slide 7 text

7 作成背景 ニュースメディアとパズルの親和性の⾼さ n ニューヨークタイムズ p クロスワードを毎⽇掲載 p パズルの購読者数が100万⼈を突破(全体の10%) p 2022年に⼈気パズル「Wordle」を買収 n ⽇経新聞 p 毎週⽇曜⽇にクロスワードを掲載 Ø https://vdata.nikkei.com/nikkeithestyle/crossword/ p 2021年にスマホアプリ「⽇経脳活クイズ」をリリース https://vdata.nikkei.com/nikkeithestyl e/crossword/mondai.html?id=0338

Slide 8

Slide 8 text

8 作成背景 ニュースメディアとパズルの親和性の⾼さ n 教育ツールとしての側⾯ p ニュース:「教育に新聞を」プロジェクト p クロスワード:教育効果について多くの研究がある n ⽇経の所有するデータ p ⽇経電⼦版の記事データ p ⽇経電⼦版ユーザーの閲覧履歴

Slide 9

Slide 9 text

9 作成背景 ⽇経電⼦版データ ⽇経電⼦版のデータを⽤いてクロスワードを⾃動⽣成 n クロスワードの特徴 p ニュース⽤語を多く含む p ユーザーや⽤途に合わせてテーマを変更可能 縦のカギ 1: ------ 2: ------ 横のカギ 1: ------ 2: ------ 内部処理 表⽰ Pythonのみでアプリケーション全体を実装

Slide 10

Slide 10 text

10 実装上の課題 n クロスワード⾃動⽣成の難しさ n ⽇本語としての難しさ n ニュースメディア特有の問題

Slide 11

Slide 11 text

11 課題① クロスワード⾃動⽣成の難しさ n 考慮すべき事項が多い:⼈⼿での作成は職⼈芸 p 単語の配置 p 黒マス配置 p 各単語のカギ(ヒント) n 数学的にも複雑な問題である(NP困難)ことが知られている n 先⾏研究をそのまま使って今回の⽬的を達成できない p 「パズル⽣成」と「ヒント⽣成」を同時に⾏いたい p ニュース⽤語を多く含めたい

Slide 12

Slide 12 text

12 課題① クロスワード⾃動⽣成の難しさ n ChatGPTに聞いてみた パ ケ ツ ト イ シ ツ ソ ン タ ク ン キ リ 想定解答 以下の単語を含む4×4マスの クロスワードパズルを作ってください • パイソン • トツクリ • パケツト • ソンタク • ケシン • イシ • タキ • キリ

Slide 13

Slide 13 text

13 課題① クロスワード⾃動⽣成の難しさ n ChatGPTに聞いてみた パ ケ ツ ト イ シ ツ ソ ン タ ク ン キ リ 想定解答 了解しました。以下に、提供していただいた単語を 含む4x4マスのクロスワードパズルを作成しました。

Slide 14

Slide 14 text

14 課題① クロスワード⾃動⽣成の難しさ n ChatGPTに聞いてみた パ ケ ツ ト イ シ ツ ソ ン タ ク ン キ リ 想定解答 このパズルは黒マスを⼆つ含みます 黒マスを含むクロスワードパズルを以下に⽰します。

Slide 15

Slide 15 text

15 課題② ⽇本語の難しさ n ⽂字の種類が多い n ひらがなへの変換が難しい p 東京株式市場の⽇経平均株価は続伸した p 駅前の市場で取材を⾏ったところ 26⽂字 → 46⽂字 しじょう いちば

Slide 16

Slide 16 text

16 課題③ ニュースメディア特有の問題 n 「ニュース⽤語」の定義が難しい p 固有名詞を全て抜き出せば良い? p ニュースの理解度の確認になる単語は? n 適切な記事の抽出が難しい p 全ての記事がニュース⽤語とその説明を含むわけではない Ø ヒントの質に関連 p 記事にも鮮度がある

Slide 17

Slide 17 text

17 実装上の課題:解決策 n クロスワード⾃動⽣成の難しさ → パズル⽣成は先⾏研究の⼿法を今回の設定に合わせて実装 → ヒント⽣成はルールベース(+⾔語モデル) n ⽇本語としての難しさ → ⾃然⾔語処理でどうにかする n ニュースメディア特有の問題 →⾃然⾔語処理でどうにかする+⾃社APIを使⽤ :Python :Python :Python :Python やはりPython…!! Pythonは全てを解決する…!!

Slide 18

Slide 18 text

18 どんなアプリ? ニュース⽤語でクロスワードを⾃動⽣成するアプリ n ニュース⽤語は⽇経電⼦版から抽出 p カスタムが可能 Ø 朝刊記事、スポーツ記事、読んだ記事など n クロスワードとそれぞれの単語のヒントを⽣成 p アルゴリズムを⾃前で実装 p 詳細は論⽂参照:https://arxiv.org/abs/2308.04688 n 実装は全てPython

Slide 19

Slide 19 text

19 ⽬次 第1部 アプリケーションの概要 n どんなアプリ? n 作成背景 n 実装上の課題 第2部 アプリケーションの処理 n 全体像 n ⾃然⾔語処理 n パズル⽣成 n Webアプリ表⽰ 第3部 開発者体験 n 環境 n Pythonだけでの開発

Slide 20

Slide 20 text

20 アプリケーションの全体像 ⽇経電⼦版データ 外部データ ①⾃然⾔語処理 単語&ヒント キシダフミオ: ⽇本の第100代⾸相は? ソゴウ: セブン&アイは9⽉1⽇に ○○○‧⻄武の売却を発表した セイセイエーアイ: ⼈間の指⽰に基づき⽂章や 画像を⾃動で⽣成する⼈⼯知能 ‧‧‧ 縦のカギ 横のカギ 1: ------ 1: ------ 2: ------ 2: ------ ヒントつきクロスワード ②パズル⽣成 (⓪外部データ⽤意)

Slide 21

Slide 21 text

21 アプリケーションの全体像 ⽇経電⼦版データ 外部データ ①⾃然⾔語処理 単語&ヒント キシダフミオ: ⽇本の第100代⾸相は? ソゴウ: セブン&アイは9⽉1⽇に ○○○‧⻄武の売却を発表した セイセイエーアイ: ⼈間の指⽰に基づき⽂章や 画像を⾃動で⽣成する⼈⼯知能 ‧‧‧ 縦のカギ 横のカギ 1: ------ 1: ------ 2: ------ 2: ------ ヒントつきクロスワード ②パズル⽣成 (⓪外部データ⽤意) • requests • re • pykakasi • jaconv • alphabet2kana • alkana • spacy • pytorch • transformers • MeCab • numpy • line-profiler • pandas • streamlit

Slide 22

Slide 22 text

22 ⓪ 外部データの⽤意 n ニュース⽤語だけではパズルが埋まらない p 抽出できても数万語程度 p どの組合せでもパズルを作成することができない n 外部データを⽤いて単語‧ヒントのペアを作成 p Wikipedia:⾒出しと最初の⽂を抽出 p JAQKET:⽇本語QAデータセット n Pythonの役割 p 前処理:読み仮名抽出、単語のフィルタリング等

Slide 23

Slide 23 text

23 ① ⾃然⾔語処理 ⼤別すると3つの処理が⾏われている ⽇経電⼦版データ 対象記事データ 出⼒ 単語 ヒント 1: 記事選定 閲覧履歴や記事に付与されている情報 から記事をフィルタリング 2: 単語抽出 ニュース⽤語を記事内から抽出 3: ヒント⽣成 ニュース⽤語と記事本⽂を⼊⼒としてヒントを⽣成 ex) キシダフミオ ex) ⽇本の100代⾸相は?

Slide 24

Slide 24 text

24 ① ⾃然⾔語処理:記事選定 n ニュース⽤語を抽出する記事のフィルタリング p クローズドな社内APIを使⽤ Ø 記事に付与されているデータで記事検索 Ø 閲覧ログの抽出 p 抽出例 Ø 特定のジャンルの記事(例:スポーツ、経済) Ø 直近1週間の朝刊の記事 Ø 特定のユーザーが閲覧した記事 n 使⽤ライブラリ p requests:API呼び出し

Slide 25

Slide 25 text

25 ① ⾃然⾔語処理:単語抽出 n ニュース⽤語を記事内から抽出‧カタカナに変換 p 抽出⼿法(⼀例) Ø 社内APIで記事に紐づくキーワードを取得 Ø 品詞、本⽂との関連性によるフィルタリング Ø 固有表現抽出(NER) n 使⽤ライブラリ p spacy:品詞の判定 p pykakasi, alphabet2kana, alkana, jaconv, MeCab:カタカナへの変換

Slide 26

Slide 26 text

26 ① ⾃然⾔語処理:ヒント⽣成 n ニュース⽤語と記事本⽂を⼊⼒としてヒントを⽣成 p クロスワードのヒントの要件 Ø 解が⼀意に定まる Ø ⽂章が短い⽅が⾒栄えが良い p ⽣成⼿法(⼀例) Ø 記事の該当部分を抽出して⽳埋め問題に Ø 機械学習モデルを使⽤:T5, GPT4など n 使⽤ライブラリ p pytorch, transformers:機械学習モデルの使⽤

Slide 27

Slide 27 text

27 ② パズル⽣成 n 前提 p ⼊出⼒ Ø ⼊⼒:空のパズル盤⾯‧ニュース⽤語‧外部データの単語 Ø 出⼒:⽭盾なく⽂字が⼊ったパズル盤⾯ p パズル盤⾯の⼤きさ、黒マスの位置は固定 p ニュース⽤語を最低𝑁個含むパズルを⽣成 キシダフミオ ソゴウ セイセイエーアイ ストライキ クラウド ニーサ … リンゴ ゴリラ ランドセル ルールブツク クリスマス スミレ … ス ト ラ イ キ ー ス ミ レ プ リ ン ト ク ラ ウ ド イ ス ミ キ 空のパズル盤⾯ ニュース⽤語 外部データ クロスワード

Slide 28

Slide 28 text

28 ② パズル⽣成 n 処理(概要) p 先述の前提を満たすパズル⽣成を最適化問題として定式化 p 先⾏研究の⼿法を問題設定に適⽤できる形に変形 Ø 先⾏研究: https://ojs.aaai.org/index.php/SOCS/article/view/18547 Ø アルゴリズムの詳細: https://arxiv.org/abs/2308.04688 Ø バックトラッキングと呼ばれる⼿法の⼀種 n 使⽤ライブラリ p numpy:⼀部の計算の⾼速化 p line-profiler:計算のボトルネックの特定

Slide 29

Slide 29 text

29 ②パズル⽣成:Webアプリ表⽰ n StreamlitでWebアプリを作成 p PythonでWebアプリを作成するフレームワーク p Pythonの⽂法で⼿軽にWebアプリが作れる n 作った画⾯ p サイドバー p ⽣成画⾯ サイドバー ⽣成画⾯

Slide 30

Slide 30 text

30 ②パズル⽣成:Webアプリ表⽰ サイドバー n ⾃動⽣成のパラメーターを⼊⼒ p 黒マス配置 p 記事の取得⽅法 p ヒント⽣成⽅法etc.. n ラジオボタン、スライダーなど多様なボタン p 1⾏で実装できる

Slide 31

Slide 31 text

31 ②パズル⽣成:Webアプリ表⽰ ⽣成画⾯ n 現在の進⾏状況を表⽰ p 外部データ→⽇経データ→パズル作成→ヒント作成 n パズル⽣成の様⼦をインタラクティブに表⽰ p 実際の盤⾯に⽂字表⽰ p プログレスバー n ⽣成後はパズル盤⾯とヒントを表⽰

Slide 32

Slide 32 text

32 ②パズル⽣成:Webアプリ表⽰ ⽣成画⾯ n 現在の進⾏状況を表⽰ p 外部データ→⽇経データ→パズル作成→ヒント作成 n パズル⽣成の様⼦をインタラクティブに表⽰ p 実際の盤⾯に⽂字表⽰ p プログレスバー n ⽣成後はパズル盤⾯とヒントを表⽰

Slide 33

Slide 33 text

33 ②パズル⽣成:Webアプリ表⽰ ⽣成画⾯ n 現在の進⾏状況を表⽰ p 外部データ→⽇経データ→パズル作成→ヒント作成 n パズル⽣成の様⼦をインタラクティブに表⽰ p 実際の盤⾯に⽂字表⽰ p プログレスバー n ⽣成後はパズル盤⾯とヒントを表⽰

Slide 34

Slide 34 text

34 ②パズル⽣成:Webアプリ表⽰ ⽣成画⾯ n 現在の進⾏状況を表⽰ p 外部データ→⽇経データ→パズル作成→ヒント作成 n パズル⽣成の様⼦をインタラクティブに表⽰ p 実際の盤⾯に⽂字表⽰ p プログレスバー n ⽣成後はパズル盤⾯とヒントを表⽰

Slide 35

Slide 35 text

35 ②パズル⽣成:Webアプリ表⽰ n ⾊々なコンポーネントがある p 基本的に1⾏で実装 p パズル盤⾯はpandas.DataFrame.styleで着⾊したもの Ø HTML, CSSを⽤いたレイアウトが可能 https://streamlit.io/

Slide 36

Slide 36 text

36 ②パズル⽣成:Webアプリ表⽰ n Streamlitの特徴 p ⻑所 Ø HTML‧CSSの知識が不要 Ø ⼿軽に動くものが作成できる p 短所 Ø 凝ったデザインは難しい Ø 複雑な挙動の実装が難しい n 他のフレームワーク p Gradio:Streamlitと似た使い⽅ができる(機械学習特化) p Django, Flask, Fast API:HTML等と合わせて使う

Slide 37

Slide 37 text

37 全体像(再掲) ⽇経電⼦版データ 外部データ ①⾃然⾔語処理 単語&ヒント キシダフミオ: ⽇本の第100代⾸相は? ソゴウ: セブン&アイは9⽉1⽇に ○○○‧⻄武の売却を発表した セイセイエーアイ: ⼈間の指⽰に基づき⽂章や 画像を⾃動で⽣成する⼈⼯知能 ‧‧‧ 縦のカギ 横のカギ 1: ------ 1: ------ 2: ------ 2: ------ ヒントつきクロスワード ②パズル⽣成 (⓪外部データ⽤意)

Slide 38

Slide 38 text

38 ⽬次 第1部 アプリケーションの概要 n どんなアプリ? n 作成背景 n 実装上の課題 第2部 アプリケーションの処理 n 全体像 n ⾃然⾔語処理 n パズル⽣成 n Webアプリ表⽰ 第3部 開発者体験 n 環境 n Pythonだけでの開発

Slide 39

Slide 39 text

39 当時の環境 n ⽴場 p 学⽣インターン p 稼働:週2,3回 ‧5時間程度 p スケジュール感:⼆ヶ⽉後提出のワークショップに間に合わせたい… n スキル p Python:研究で触る程度 p それ以外の⾔語:未経験

Slide 40

Slide 40 text

40 Pythonで良かった点 ライブラリの豊富さ n 今回の処理(再掲) p API呼び出し p ⾃然⾔語処理 p 組合せ探索 p インタラクティブに画⾯表⽰ n 上記の処理を全てPythonで実装 p 学習コストが低く済む p 各処理の連携が楽(importするだけ)

Slide 41

Slide 41 text

41 Pythonで良かった点 ⼿軽さ、コミュニケーションコストの低さ n アプリケーションの実装までスピーディーにできる p 「動くもの」を直接共有できる Ø イメージが湧きやすい n コミュニケーションコストが低い p 特にデータサイエンス領域での利⽤⼈⼝が多い p 修正‧環境構築が簡単に⾏える

Slide 42

Slide 42 text

42 今後の展望 n ⾃然⾔語処理 p まだまだニュース⽤語、ヒントの品質に改善の余地あり Ø ヒントの短⽂化、解の⼀意性の担保、不適切な表現の排除など Ø ⼤規模⾔語モデルの活⽤ n パズル⽣成 p 黒マスの配置も含めた最適化 Ø ニュース⽤語の割合を増やせる p ⾼速化 p 表⽰の改善 Ø ダークモード対応やパズルの保存など Ø streamlitだと厳しい部分も…

Slide 43

Slide 43 text

43 まとめ n Pythonだけでクロスワード⾃動⽣成アプリを作成 p ⽇経電⼦版のデータを⼊⼒ p ニュース⽤語を含むヒントつきクロスワードパズルを出⼒ n 多様な処理をPythonで実装 p API呼び出し、⾃然⾔語処理、組合せ探索、Webアプリ n 開発者体験は良かった p ライブラリの豊富さ p ⼿軽さ‧コミュニケーションコストの低さ

Slide 44

Slide 44 text

44 We’re Hiring! 募集要項全般 https://herp.careers/v1/nikkei HACK THE NIKKEI(デジタル⼈材採⽤) https://hack.nikkei.com/

Slide 45

Slide 45 text

45 Appendix: パズルの⽣成速度 n ⾃然⾔語処理 p 現在の実装だと外部データ読み込みがボトルネック(~10秒) p 機械学習モデルを⽤いる場合も時間がかかる n パズル⽣成 p 横軸 Ø ニュース⽤語が占める割合(%) p 縦軸 Ø 左:作成成功率 Ø 右:⽣成時間の中央値‧平均値 p 概ね数秒で完了 図:パズル⽣成の作成成功率と⽣成時間