Upgrade to Pro — share decks privately, control downloads, hide ads and more …

v1Bot_v0.2

15964b9c62aafd1e9220e61d128afb10?s=47 y-wat
March 17, 2020
30

 v1Bot_v0.2

開発終わったので振り返りの資料。
未発表。

15964b9c62aafd1e9220e61d128afb10?s=128

y-wat

March 17, 2020
Tweet

Transcript

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

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

  3. connpass: y-wat • 本社に自席がない常駐エンジニア5年目 • 昔: OracleDB担当(バッチ処理、DBA), BIツール導入&保守 • 今:

    GCPでログ基盤構築 2018冬から個人的にアプリケーション開発はじめました。 仕事では2019/04から(PLSQLは除く)。
  4. 今日の目的 • 3ヶ月開発のまとめ(2020/01 - 2020/03) • 個人開発中の検索botを紹介する • 違和感のある設計・実装を見かけたら指摘してください •

    面白そうな追加機能ネタは歓迎 • Garbage in, garbage out
  5. Why 検索bot? →日次情報収集は面倒。 →周辺情報も欲しい。 →Unknown unknowns

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

  7. モジュール配置 検索bot (稼働中) View (稼働中) 検索辞書作成(稼働中) Storages (稼働中) Cloud Run

    GCS Cloud Tasks BigQuery Firebase Functions PG GCE 記事仕分け (稼働中) GKE
  8. 検索 - 新着ページを集める Web Site 検索 task task task task

    task task 検索条件リスト
  9. Storages - メタデータ用/集計用/長期保存用 BigQuery GCS Postgres • メタデータ • 履歴データ

    • heroku • 文書データ • フルスキャン前提 • 直近3ヶ月のみ保持(予定) • 文書データ • 個別アクセス • 長期保存用 ストレージを跨いだデータ整合性管理 • Job_id: 検索ワード+検索オプション => sha256 • Exec_id: searchの起動ごとに => uuid4 • 文書id: テキストのみ抽出した文書 => sha256
  10. 検索辞書作成 - tfidf • tfIdfで特徴語を抽出 • 元の検索条件 + tfidf結果で再検索 =

    今日の深堀り検索 検索bot 再走行 task 追加検索条件リスト
  11. 記事仕分け • やりたいこと ◦ 追加検索結果から絞り込みを行う ◦ ベース検索(n * 5記事) *

    追加検索(tfidf(3ワード) * 5記事) = 75n記事(最大) →多すぎるので選別が必要 • 実装方法 ◦ 文書のベクトル作成 i. bert as service (GKE + GCE) ◦ 記事推薦 i. Cosine類似度 (Bigquery) ここまでの実装と評価を 3月中に
  12. Bert as service 記事仕分け①: 文書のベクトル化(稼働中) Bert Server 日次環境構築 日次環境破棄 文書ベクトル

    Bert Client Job Initiator Parameter Queue 後続処理起動
  13. 記事仕分け②: 類似記事の抽出(稼働中) Cosine Similarity計算(SQL) 日次類似記事テーブル 起動

  14. まとめ: 3ヶ月の振り返り - 勢いで作ったGIGO • プロダクト ◦ 簡易的な文書収集 &仕分けエンジンとして使えそう。 英語なら。

    ◦ インプットデータの品質問題 (例: ECサイト、出会い系コミュニティサイト ) • bot開発: 前処理が本番 - 無価値な単語をどうやって弾くか ? ◦ 例 - 名詞,固有名詞: EV(電気自動車),新型コロナウイルス ,12月5日,37ドル ◦ 人間にとっての「有意味な単語」と計算結果での「特徴語」は一致しない ◦ 辞書の品質維持 • アーキテクチャ: 軽量なモジュール単位実装 + 疎結合 ◦ 軽量に作る: 素pythonスクリプト、flaskでの簡易実装優先 (大きいFW/ORM使わない) ◦ 小さいAPIをタスクキューで繋げる : モノリシックを避ける + 並列実行リソースの最適化 ◦ プログラミングの学習としては微妙 (Leetcode等の方が良い)
  15. 最後に つっこみ歓迎。 • 「アーキテクチャおかしくない??」 • 「実装内容もっと良いやり方が・・・」 直近のissue • メンテナンス負荷の低い分析処理 +基盤

    • ストレージレイヤのデータ管理 • テキスト前処理の完成形 • 分かち書きに使う辞書メンテナンス • 自然言語処理なにもわからない
  16. 今後の計画 - bot2号機 • 英語を優先対応 - 日本語対応は作業コストに見合わない ◦ 前処理のテンプレ化したい ◦

    「分かち書き」処理の廃止による辞書問題からの解放 ◦ bert モデル更新への追従を容易に • 取得元を絞る ◦ 特定ソースに絞る方がデータの品質は揃いそう ◦ 候補①: News APIなどニュース記事 ◦ 候補②: 特定サイトの巡回 • 文書ベクトルのデータベース ◦ 現在: 各バッチ処理内での類似文書検索 ◦ これから: 文書テータベース +レコメンド的なものを目指したい • 発信方法の改良 ◦ リンクを飛び回りたくない ◦ サマリを音声配信する的なことは可能なのか ??