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

v1Bot_v0.2

y-wat
March 17, 2020
33

 v1Bot_v0.2

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

y-wat

March 17, 2020
Tweet

Transcript

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

    View Slide

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

    View Slide

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

    View Slide

  4. 今日の目的
    ● 3ヶ月開発のまとめ(2020/01 - 2020/03)
    ● 個人開発中の検索botを紹介する
    ● 違和感のある設計・実装を見かけたら指摘してください
    ● 面白そうな追加機能ネタは歓迎

    Garbage in, garbage out

    View Slide

  5. Why 検索bot?
    →日次情報収集は面倒。
    →周辺情報も欲しい。
    →Unknown unknowns

    View Slide

  6. 検索botの目指すところ
    ● 定期web検索
    ● 自律追加検索
    ● 記事推薦
    気になるネタのウォッチ

    知らないサイトへの到達

    View Slide

  7. モジュール配置
    検索bot (稼働中)
    View (稼働中)
    検索辞書作成(稼働中)
    Storages
    (稼働中)
    Cloud Run
    GCS Cloud Tasks
    BigQuery Firebase
    Functions PG
    GCE
    記事仕分け (稼働中)
    GKE

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

  11. 記事仕分け
    ● やりたいこと
    ○ 追加検索結果から絞り込みを行う
    ○ ベース検索(n * 5記事) * 追加検索(tfidf(3ワード) * 5記事) = 75n記事(最大)
    →多すぎるので選別が必要
    ● 実装方法
    ○ 文書のベクトル作成
    i. bert as service (GKE + GCE)
    ○ 記事推薦
    i. Cosine類似度 (Bigquery)
    ここまでの実装と評価を 3月中に

    View Slide

  12. Bert as service
    記事仕分け①: 文書のベクトル化(稼働中)
    Bert Server
    日次環境構築
    日次環境破棄 文書ベクトル
    Bert Client
    Job Initiator
    Parameter
    Queue
    後続処理起動

    View Slide

  13. 記事仕分け②: 類似記事の抽出(稼働中)
    Cosine Similarity計算(SQL) 日次類似記事テーブル
    起動

    View Slide

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

    View Slide

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

    View Slide

  16. 今後の計画 - bot2号機
    ● 英語を優先対応 - 日本語対応は作業コストに見合わない
    ○ 前処理のテンプレ化したい
    ○ 「分かち書き」処理の廃止による辞書問題からの解放
    ○ bert モデル更新への追従を容易に
    ● 取得元を絞る
    ○ 特定ソースに絞る方がデータの品質は揃いそう
    ○ 候補①: News APIなどニュース記事
    ○ 候補②: 特定サイトの巡回
    ● 文書ベクトルのデータベース
    ○ 現在: 各バッチ処理内での類似文書検索
    ○ これから: 文書テータベース +レコメンド的なものを目指したい
    ● 発信方法の改良
    ○ リンクを飛び回りたくない
    ○ サマリを音声配信する的なことは可能なのか ??

    View Slide