平成最後のみんなのPython勉強会で得た知見 〜 正規表現/機械学習/Pyramid/環境構築/Falcon/そして 〜

はじめに

先日開催された、みんなのPython勉強会で得られた知見についてまとめます。

startpython.connpass.com

毎月開催されている、この「みんなのPython勉強会」。

2019年4月開催の今回は平成最後ということもあり、司会進行と計6人の登壇者全員が平成生まれ縛りとなっていました。

本ブログ記事は全体としては少し長文なので、概要だけをさっと知りたい方は1.1〜1.6までを参照ください。

その後2.1から各登壇内容の詳細レポートが改めて続きます。

1. 各登壇内容からの知見抜粋

1.1. 正規表現

  • Pythonの正規表現における\wがマッチするのは、[a-zA-Z0-9_](半角英数字とアンダースコア)だけではない

  • それ以外にも、かな漢字、ヘブライ文字、アラビア文字などの非常に多くの(20,000種以上の)Unicode文字にマッチする

1.2. 機械学習

  • 機械学習におけるデータクレンジングでは、実際の状況(今回であればタイタニック号沈没)を想像しながら特徴量として活用できるものを探す

1.3. Pyramid

  • 過去に自身で開発したDjango製アプリを、情報の少ないPyramidで作ることに挑戦

  • 苦戦はしたが、Djangoの良さ、Pyramidの良さ、それぞれ発見があった

1.4. 環境構築

  • 初学者は、Pythonやパッケージのインストール方法をどれか1つだけにするのがおすすめ
    • Pythonのインストール
      • python.orgからのインストールとAnaconda利用の両方などは避ける
    • パッケージのインストール
      • Anaconda利用者であれば、pip installconda installに読み替える
  • 次のステップとして仮想環境を利用すると良い

1.5. Falcon

  • 同じ軽量フレームワークであるFlaskと比較して10倍以上高速

  • RESTfulな機能を持ち、バックエンドAPI開発に適している

1.6. 持っていないものを見つける話

  • Pythonを含めたオープンソースと、それにまつわるコミュニティは持っていない者の味方

  • 自分の持っていない物が分かれば、自分がどこで活躍すべきかが分かる

目次

2.各登壇内容の詳細レポート

2.1. Pythonにおける正規表現の話 \wとUnicodeの意外な関係

\wは、半角英数字とアンダースコア以外の多くのUnicode文字ともマッチする

  • Pythonの正規表現における\wはany word characterと呼ばれる

  • \wは、[a-zA-Z0-9_](半角英数字とアンダースコア)と同義と説明されている場合があるが、それ以外の非常に多くのUnicode文字にもマッチする

    • 例えば、日本語のかな漢字にもマッチする

    • Python3の公式ドキュメントによれば「unicodedataモジュールで提供されているUnicode データベースでlettersとしてマークされている全ての文字とマッチする」とある

Unicodeにおいては各文字はLetter, Numberなどにカテゴリ分けされている

  • カテゴリはLetter, Number, Punctuationなど
  • それぞれLx, Nx, Pxと表現される

    • Lettersもさらに以下に分類される

      • Lu(Uppercase:大文字)
      • Ll(Lowercase:小文字)
      • Lo(Other:その他)
    • このLoに分類されるのが、かな漢字、ヘブライ文字、アラビア文字などであり、非常に文字数が多い

    • Numberも以下に分けられる

      • Nd(Decimal Digit:10進数)
      • Nl(Letter:ローマ数字などの数を表す文字)
      • No(Other:分数などのその他の文字)

\wは全てのLetter, Numberにマッチするわけではなく、一部例外がある

  • \wは20,000種以上の文字にマッチするが全てのLetter, Numberにマッチするわけではなく一部例外がある

漢字だけマッチさせたい場合は、Unicode文字ブロパティを使うと良い

  • 漢字プラス「々」といった記号だけをマッチさせたい場合は、regexモジュールで漢字のUnicodeエイリアスp{Han}を指定すると良い
>>>import regex
>>>regex.findall(r'p{Han}', '堂々')
['堂', '々']

2.2. Pythonと挑んだtitanic 〜 101回目のsubmit 〜

Kaggleは予測モデリングおよび分析手法関連プラットホーム

  • 企業等がデータを投稿し、世界中の統計家やデータ分析家がその最適モデルを競い合う場

titanicはKaggle内のコンペ

  • 沈没したタイタニック号からの生存者を予測する課題

機械学習モデルの作成では最初にデータのクレンジングを行う

  • 欠損値補完
  • 特徴量作成
  • 不使用の特徴量の削除

データのクレンジングにあたっては、実際の状況(タイタニック号の沈没)を想像しながら特徴量として活用できるものを探す

  • 欠損値の補完の一例

    • 年齢の場合

      • Miss, Mrs, Mrなどの敬称ごとの平均年齢を算出し補完
  • 特徴量の作成の一例

    • まず家族の人数を算出し、そこから更に脱出船に乗れる確率を仮定

      • 父、母、幼い子2人であれば、子どもから優先して脱出船に乗れると想定

今回の予測モデル作成の詳細記事

2.3. DjangoとPyramidで同じアプリを作った話

既存のDjango製アプリを、情報の少ないPyramidで作ることに挑戦した

  • 過去に自身で開発したDjango製アプリを、他のフレームワークで開発するとどうなるのか疑問に思った

  • 他のフレームワークには、資料の少ないPyramidを選定

Pyramidによる開発で苦戦した点

  • フルスタックフレームワークであるDjangoと比較すると、Pyramidでは他のパッケージを利用する必要があり、それらの学習コストを要する

    • 今回は以下パッケージを使用した
      • ORMにOrator
      • テストにPytest
  • Djangoは比較的「こうあるべき」という指針が明示されているが、Pyramidにはそうしたものが無いので実装時に判断に迷うことがあった

Pyramidで好きな点

  • add_request_method
    • リクエストオブジェクトにメソッドまたはプロパティを加える
  • 簡易な計算結果をモジュールひとつでWebブラウザに表示できる
  • 疎結合なアプリケーションを作りやすい
  • viewのテスト実行が早い

Django以外のフレームワークでWeb開発する場合のアドバイス

  • 「Djangoでは◯◯ができるのに」という考えは捨てた方が良い

    • 比較するにはDjangoは用意された機能があまりにも手厚すぎる
  • Django経験者にとっては「車輪の再発明」に思えるような開発をすることもあるかもしれないが、それ自体も楽しもう

2.4. P(ython)&I 最初の落とし穴を避け、成功体験を積むために

自身のPython成功体験を支えたのは環境構築

  • 最初に手に取った本は「退屈なことはPythonにやらせよう」

退屈なことはPythonにやらせよう ―ノンプログラマーにもできる自動化処理プログラミング

退屈なことはPythonにやらせよう ―ノンプログラマーにもできる自動化処理プログラミング

  • 最初の環境構築が上手くいったので、Pythonでの成功体験を積むことができた

Pythonを始めた直後の人は環境構築でつまずきやすい

  • その後、自身がPythonを初学者に教えるようになって、環境構築でつまずく人が多いことに気付いた

  • よく見られるのが、Pythonを重複してインストールしているケース

    • python.orgからのインストールとAnaconda利用の両方など

Pythonのインストール方法はどれか1つだけにしよう

  • 各種チュートリアルの記載の通りに進める姿勢は素晴らしいが、Pythonのインストール方法が自分とは異なる場合は、その部分を読み替えよう

パッケージのインストールはpip installconda installのどちらかに統一しよう

  • 例えば、python.orgからPythonをインストール済みであるところ、Anacondaを利用した機械学習の解説記事を実践してみたくなったら?

    • この場合、Anacondaを導入することはおすすめしない
    • Anacondaに最初から入っているパッケージ(numpy, scikit-learnなど)は、個別にpip installしよう
  • 逆に、AnacondaでPythonをインストール済みであるところ、python.orgからPythonをダウンロードして環境構築している記事を実践する場合は?

    • 記事中でパッケージをpip installしている箇所は、conda installに読み替えよう

次のステップとして仮想環境を利用しよう

  • venvなどを使う
    • 詳細はPyNyumonテキストを参照
  • Anacondaであれば、conda create, conda activateで環境を作成・切替できる
    • 詳細はpython.jpのCondaコマンドを参照

2.5. FlaskとDjango以外のAPI開発の選択肢

PythonのWebアプリケーションフレームワークの二大巨頭といえばFlaskとDjango

  • Flask
    • 軽量、学習コスト低
  • Django
    • フルスタック、学習コスト高

Flaskの機能は最低限に絞られ、パフォーマンスもさほど良くない

  • 一定の機能を作るには、サードパーティのライブラリをある程度把握する必要あり

  • 他のフレームワークと比べ、パフォーマンスはそれほど良くない

DjangoはバックエンドAPI開発には不要な機能も多い

  • フルスタック故に他のサードパーティライブラリを入れなくても一通りの開発ができるが、学習コストもそこそこあり、ちょっとしたものを開発するのには不向き

  • バックエンドAPI開発には不要な機能も多い

Falconはパフォーマンスの良いAPIを開発するのに適している

  • 最近はフロントエンドのSPA化が進み、フロントとバックエンド分離のニーズは高い

  • FalconはFlaskの10倍以上の速度

  • FalconのResourceという機能(MVCのCに相当)はRESTfulであり、API開発に適している

Falconの課題はサードパーティの少なさと、しっかりとした設計が求められること

  • 同じ軽量フレームワークであるFlaskよりもサードパーティライブラリが少ない

  • Flask同様、構成はしっかりと設計する必要がある

    • DDD(ドメイン駆動設計)のオニオンアーキテクチャ、クリーンアーキテクチャで設計すると良いかもしれない

今後のFalconはASGI対応予定

  • 今後リリース予定の3.0ではASGI対応予定

2.6. 無題(持っていないものを見つける話)

Python, Linux, 初のWebブラウザも平成初期の生まれ

  • Pythonは1991〜1992年生まれ(平成3〜4年)

  • Linuxは1991年生まれ(平成3年)

  • 初のWebブラウザ(NCSA Mosaic)は1993年生まれ(平成5年)

平成時代にPythonでWebアプリを作り続けてきた

  • 学生時代にPythonに出会い、様々なWebアプリケーションを作ってきた

  • 就職後も受託開発や自社サービス開発でWebアプリケーションを作る

  • 自分のスキル(Webアプリ開発経験)と会社の強み(Pythonに特化)を活かし、新規ビジネスとなる自社サービスのWebアプリを作ることができた

Pythonプロフェッショナルプログラミング第3版

Pythonプロフェッショナルプログラミング第3版

持っていない者にとって大切なのは自分らしい物を作ること、オープンソースはそんな持っていない者の味方

  • 大企業のような原資を持たない場合、自社サービスの運営(マーケティングやその他)では制約があるが、そんな中で大切なのは自分たちらしい物を作ること

  • Pythonを含めたオープンソースと、それにまつわるコミュニティは持っていない者の味方であった

  • 自分の持っていない物が分かれば、自分がどこで活躍すべきかが分かる

失われた時代という平成を生きたからこそ、次の令和に作れるものがある

  • 平成には失われた20年(10年とも30年とも)があるといわれ、これを耳にすると平成で生まれ育った自分は消沈してしまう

  • しかし、失われた時代に生きたからこそ、次の令和に作れるものがある

3. 最後に

勉強会終了後の私のツイートより。

本当に素晴らしい勉強会でした。

主催のStart Python Clubの方々、会場提供のリーディングエッジ社さん、登壇者の方々、また懇親会でお話しさせていただいた方々、ありがとうございました!