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だけでの開発
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 ニュース⽤語を多く含めたい
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だけでの開発
22
⓪ 外部データの⽤意
n ニュース⽤語だけではパズルが埋まらない
p 抽出できても数万語程度
p どの組合せでもパズルを作成することができない
n 外部データを⽤いて単語‧ヒントのペアを作成
p Wikipedia:⾒出しと最初の⽂を抽出
p JAQKET:⽇本語QAデータセット
n Pythonの役割
p 前処理:読み仮名抽出、単語のフィルタリング等
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:機械学習モデルの使⽤
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等と合わせて使う
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 概ね数秒で完了
図:パズル⽣成の作成成功率と⽣成時間