PyCon APAC 2023

Pythonだけでクロスワードパズルを自動生成 〜自然言語処理・組合せ探索・Webアプリ開発〜
2023-10-28 , track 3

クロスワードパズルを自動生成するWebアプリケーションを題材に、API呼び出し・自然言語処理・組合せ探索・可視化など多様な処理を手軽に実装できるPythonの応用性の高さを報告する。アプリケーションでは、ニュース記事からクロスワードパズルの解として適切な単語とその説明を抽出する自然言語処理パートと、入力された単語から矛盾の無いクロスワードパズルを生成する探索パートを全てPythonで記述した。自然言語処理パートでは記事情報を取得するAPIを呼び出し、読み仮名付与や形態素解析などの自然言語処理ライブラリを活用する。探索パートでは、クロスワードパズルのレイアウトを設計する組合せ探索を実装した。さらに、これらの処理の可視化には、PythonのWebアプリケーションフレームワークであるStreamlitを用いている。発表では、デモを交えながらアプリケーションを紹介し、開発における知見を共有する。


本講演では、ニュース記事を入力としてヒント付きクロスワードパズルを自動生成するWebアプリケーションを紹介する。アプリケーション内ではAPIの呼び出し、自然言語処理、組合せ探索、可視化などの複数の複雑な処理が実行されるが、全てPythonで実装されている。デモを交えたアプリケーションの紹介によって、Pythonの応用可能性、実現可能な処理の多様性、手軽さについて発信する。

本アプリケーションを作成した背景として、講師が所属するニュースメディア業界におけるパズルの役割の大きさがある。特にクロスワードパズルは人気のコンテンツであり、多くのニュースメディアが掲載している。「顧客に合わせたクロスワードパズルを自動で生成できれば、より顧客の満足度を高められる」という仮説のもと、本アプリケーションを作成した。

アプリケーションは複数のニュース記事を入力として、ニュース記事内の単語を含むクロスワードパズルと各単語のヒントを自動で出力し、表示する。入力するニュース記事を、顧客が閲覧した記事、朝刊の一面の記事、特定のジャンルの記事などに限定することで、様々なコンセプトのクロスワードパズルを自動生成できる。

アプリケーションは自然言語処理パートと探索パートに分かれている。自然言語処理パートではまず、記事情報を取得するAPIを呼び出してニュース記事の文章データを取得する。APIの呼び出し、認証にはrequestsライブラリを用いている。次に、クロスワードパズルの解として適切な単語とその説明を抽出する。この処理にはre, spacy, pykakasi, jaconvなどの多くの自然言語処理ライブラリを用いている。探索パートでは、自然言語処理パートで抽出された単語に加え、wikipediaなどの外部ソースの単語も入力として、矛盾の無いクロスワードパズルを生成する。この生成には深さ優先探索の一種であるバックトラッキングをベースとしたアルゴリズムが採用されており、ニュース記事から抽出された単語を多く含むクロスワードパズルが生成される。アルゴリズムは学術論文を参考に、本アプリケーションの設定に合わせて変更したものをPythonで実装した。アプリケーション全体はPythonのWebアプリケーション作成フレームワークであるStreamlitによって実装されている。クロスワードパズルのサイズや取得するニュース記事のジャンルなどのパラメーターを簡単に変更でき、クロスワードパズルの生成過程をインタラクティブに表示できる。

開発における課題として、1. 多様な処理を実装する必要がある 2. アプリケーションの実装に割くことのできる時間が限られている という2点があった。Pythonのみでアプリケーションを実装することで、これらの課題を解決した。1点目については、Pythonの豊富なライブラリを活用して対処した。全ての処理を同一言語で記述することは、処理の集約が簡単になるというメリットもある。2点目については、Streamlitを用いることで手軽にアプリケーションを作成した。可視化までの実装期間を短くすることで、効率的にフィードバックを得て改善できた。

発表の構成は以下の通りである。導入では、発表の全体像・目的とアプリケーションを作成した背景・モチベーションについて説明した後、アプリケーションの概要をデモを交えながら紹介する。次に、アプリケーションのアーキテクチャと内部で実行されている処理について、関連するPythonライブラリを中心に解説する。そして、アプリケーション開発の開発者体験について、Pythonのみで開発した感想、振り返りを中心に紹介する。

導入(2min)
- 自己紹介
- 発表の全体像・目的
アプリケーションの概要(10min)
- デモンストレーション
- 作成した背景・モチベーション
- アプリケーションの説明
アプリケーションの詳細(9min)
- アプリケーションのアーキテクチャ
- それぞれの処理について
- API呼び出し
- 自然言語処理
- 組合せ探索
- Webアプリケーションについて
開発者体験(4min)
- Pythonのみでの開発について
- ライブラリの豊富さ
- 手軽さ
- コミュニケーションの取りやすさ
- 今後の展望
- まとめ

See also: 本発表のWebアプリケーションの詳細なアルゴリズム、内部処理についての論文