Slide 1

Slide 1 text

面倒な検索はpythonにやらせよう -開発記録 v0.1- y-wat

Slide 2

Slide 2 text

お願い スクレイピング・クローリングは用法・容量を守って実行しましょう

Slide 3

Slide 3 text

connpass: y-wat ● 本社に自席がない常駐エンジニア5年目 ● 昔: OracleDB担当(バッチ処理、DBA), BIツール導入&保守 ● 今: GCPでログ基盤構築 2018冬から個人的にコーディングはじめました。 仕事では2019/04から(PLSQLは除く)。

Slide 4

Slide 4 text

今日の目的 ● 3ヶ月開発の中間強制LT ● 個人開発中の検索botを紹介する(画面ありませんごめんなさい) ● デザインパターンの共有枠です ● 違和感のある設計・実装を見かけたら指摘してください ● 面白そうな追加機能ネタは歓迎

Slide 5

Slide 5 text

「気になった単語」を覚えてますか?? →無理。 →継続フォローつらい。 →周辺情報も欲しい。

Slide 6

Slide 6 text

検索botの目指すところ ● 定期web検索 ● 自律追加検索 ● 記事推薦 気になるネタのウォッチ + 知らないサイトへの到達

Slide 7

Slide 7 text

モジュール配置 検索bot (稼働中) View (稼働中) 検索辞書作成(稼働中) Storages (稼働中) Cloud Run GCS Cloud Tasks BigQuery Firebase Functions PG GCE 記事推薦 (調査中) ??

Slide 8

Slide 8 text

検索bot - 新着ページを集める Web Site 検索 task task task task task task 検索条件リスト

Slide 9

Slide 9 text

Storages - メタデータ用/集計用/長期保存用 BigQuery GCS Postgres ● メタデータ ● 履歴データ ● heroku ● 文書データ ● フルスキャン前提 ● 直近3ヶ月のみ保持(予定) ● 文書データ ● 長期保存用 ● 基本的に貯めるだけ ストレージを跨いだデータ整合性管理 ● Job_id: 検索ワード+検索オプション => sha256 ● Exec_id: searchの起動ごとに => uuid4 ● 文書id: テキストのみ抽出した文書 => sha256

Slide 10

Slide 10 text

検索辞書作成 - tfidf ● tfIdfで特徴語を抽出 ● 元の検索条件 + tfidf結果で再検索 = 今日の深堀り検索 検索bot 再走行 task 追加検索条件リスト

Slide 11

Slide 11 text

記事推薦 - 2月中の実装目標 ● やりたいこと ○ 追加検索結果から絞り込みを行う ○ ベース検索(n * 5記事) * 追加検索(tfidf(3ワード) * 5記事) = 75n記事(最大) →多すぎるので選別が必要 ● 実装方法 ○ 文書のベクトル作成: bert as service (試し中) ○ 記事推薦 i. Cosine類似度 <- とりあえず単純なコレが有力 ii. Elastic search iii. ほか調査中

Slide 12

Slide 12 text

まとめ: 前半の振り返り ● プロダクトとしての評価 ○ 新着記事の自動配信としては使えそう。 英語なら。 ○ 不要な記事への対処が悩み (例: ECサイト、出会い系コミュニティサイト ) ● bot開発: 前処理が本番 - 無価値な単語をどうやって弾くか ? ○ 名詞,固有名詞: EV(電気自動車),新型コロナウイルス ,12月5日,37ドル ○ 人間にとっての「有意味な単語」と計算結果での「特徴語」は一致しない ○ 辞書の品質維持 ● アーキテクチャ: 軽量なモジュール単位実装 + 疎結合 ○ 軽量に作る: 素pythonスクリプト、flaskでの簡易実装優先 (大きいFW/ORM使わない) ○ 小さいAPIをタスクキューで繋げる : モノリシックを避ける + 並列実行リソースの最適化 ○ プログラミングの学習としては微妙 (Leetcode等の方が良い)

Slide 13

Slide 13 text

最後に つっこみ歓迎。 ● 「アーキテクチャおかしくない??」 ● 「実装内容もっと良いやり方が・・・」 直近のissue ● メンテナンス負荷の低い分析処理 +基盤 ● ストレージレイヤのデータ管理 ● テキスト前処理の完成形 ● 分かち書きに使う辞書メンテナンス (最終手段: Natural Language API) ● 自然言語処理なにもわからない