[Sansanインターン]名刺データ化の裏側を学んできた!
はじめに
営業DXで有名なSansanに興味があっため、先日1dayインターンに参加してきました!結論から言うと、非常に楽しかったです!短い時間であったものの内容の濃いワークを通じて、自身の力量を客観的に再確認することができました。メンターの方々や他大学の学生との交流も非常に楽しく、参加して本当に良かったです。
インターンの概要
- テーマ :【26卒】1Dayで学ぶデータ化の裏側 Pythonで開発するワークフローシステム
- 部署 : Digitization部 (名刺や請求書などのデータ化を主に担当する部署)
- 期間 : 1day (2024/06/08)
- 場所 : 東京都渋谷区神宮前5-52-2 青山オーバルビル 13F
- オシャレなオフィスでテンションが上がりました。来年からは渋谷に移転するそうなので、最後に行けて良かったです!
- 参加人数
- 学生 : 15名
- 社員の方々 : 8名
ビルの下のモニターがジャックされていたので、記念写真を撮っておきました!
当日の進行
13:00 受付
13:00-13:45 ワーク内容の説明
13:45-17:45 ハンズオン->個人ワーク
17:45-18:30 振り返り
18:30-20:00 交流会
ハンズオン
データの正規化(Normalize)と検知(Inspector)の基本について例を交えながら全員で学習しました。
内容
- 全角英語の半角化
-
c0m
という文字列の検知
個人ワーク
OCRによるデータ化の結果が正しくないテストデータを正しく処理してデータ化するというワークを行いました。
内容
以下のような流れで進行しました
- メンターの方に実装計画を提案し、意見を伺う
- 実装をある程度進めたあと、進捗状況をメンターの方に報告する
達成度指標
タスクの進行度は以下の二つの指標で定量的に評価されました。
- 精度: 誤ったデータ化の結果を検知・正規化して、正しいデータ化ができているかどうかを評価される。誤りを検知して手入力対象にしても、正しいデータ化結果とみなし精度のスコアは向上する。
- 自動化(正規化): 適切な正規化を行い、誤ったデータを機械的に正しいデータに置き換えられた度合い。手入力対象を増やすほどスコアが低下する。
達成度
個人ワークを終えて自身のスコアは以下の通りでした。
- 精度: 92.8%
- 自動化(正規化): 54.0%
誤りの傾向を掴み、怪しい入力をInspectorに入れることで精度面では良いスコアを獲得することができた一方で、正規化処理の実装が間に合わず自動化のスコアが伸び悩んでしまいました。お手本コードを参考にして、正規化のためのコードの書き方を学びたいと思います!
インターンで得られた学び
自動化すべき部分とそうでない部分
c0m
のようにルールベースでは対応できない誤りも多く存在するため、全て機械的に正規化するというのは現実的ではないということを予め伝えられていました。また、ルールベースで対応することが可能であっても、自分の力量や与えられた時間では実現不可能なものもあるということもワークを通じて知ることができました。そのような中で、どのようなデータを正規化の対象するかを適切に判断することが重要であると感じました。
優先順位付けの重要性
今回与えられた課題は与えられた時間に対して難易度が非常に高い課題だっため、達成度指標を可能な限り向上させるというBest Effortな方針を立てることが重要でした。
そのために、以下の2点が重要であると学びました。
- データの観察
- 実装予定の機能を実現した時に起こる結果の正確な予測
まずデータをよく観察し、どのような種類の誤りが多いかを分析することが非常に重要だと感じました。その中でも、よくある間違いを優先的に解決していくことで効率的に達成度指標を大きく改善することができるため、そのようなデータ群の抽出が作業の効率化のために重要でした。また、正規化に必要な処理を計画した際に実際に文字列がどのように変更されるか正確に予測する必要がありました。例えば、以下のようなトラップに引っかかってしまい自分は時間を浪費してしまいました。
# 丁目,番地,号を-に変換する処理を実装した際
2丁目2番地 OOパレス-> 2-2- OOパレス # 最後の-は不要
# 漢数字をアラビア数字に変換する処理を実装した際
六本木一丁目 -> 6本木1丁目 # 六本木の六をアラビア数字に変換してはいけない
上に示すように、号が住所に存在しない場合、番地の後ろが-
になってしまい不正な住所となってしまうという不具合を発生させてしまいました。また、漢数字をアラビア数字に変える際に範囲を適切に設定しないと、固有名詞に含まれる漢数字まで変換してしまうというミスもしました。このようなことを防ぐために、実装に移る前に処理結果を具体的にイメージすることが非常に重要であると感じました。
共通処理の切り出し
全ての正規化処理で用いられるような処理、例えば括弧の削除などはbase modelを作成し、それらを継承させることで今後の保守性を向上させるといった工夫が必要だと感じました。お手本ではそれがうまく実装されていたため、実装から考え方を抽象化し自身の開発に活かしていこうと思いました。
参加して良かったと感じたこと3つ
- 自分の能力を客観的に評価し、実務ではどのような力が求められるのかイメージを持つことができたこと。特に、お手本コードを見ることができたので、自身のコードや考え方に足りない部分を学ぶことができたことが嬉しかったです。
- 他大学の学生や社員さんと交流することができ、普段得られないような知見を得ることができたこと。特に、社員さんからはDigitization部について詳しいお話を聞くことができたことが楽しかったです。
- 実際に社員の方と交流することで、Sansanで働くということについて具体的にイメージすることができたこと。
まとめ
今回のインターンでは、データ化処理の裏側に隠された泥臭い努力や様々な難しさを知り、一口にDXといってもその内情は様々だということを学ぶことができました!特に、正規化処理については勉強が足りない部分が多く、知識不足によって手が止まってしまったことが反省ポイントです。お手本コードをよく読んで正規化処理についてしっかり学ぼうと思います!Sansanの就業型インターンにも参加する予定なので、そちらも非常に楽しみにしています!
おまけ: お手本コードを見ながら復習
お手本コードを公開するのは良くないと思うので、得られた学びだけ箇条書きしておきます。
- 定数値リストを活用して、特殊な文字列処理をまとめる
-
\d
は[0-9]
-
\s
はスペース -
(?<=\d)
は直前に[0-9]
が存在するか確認する - 変換処理に巻き込まれそうな文字列は、事前にmaskをかける
- 共通の処理はbase modelにまとめる
- 言語判定など、入力データに密接関わるものはそもそも入力データに加えてしまう(この発想は本当になかったので参考になった)
- 処理の意味はコメントではなく、メソッド名に込める。特に、Inspectorではif文が連立してしまうのでそれを徹底する。
- 丁目、番地、号などはそれ自体が数字に囲まれているかどうか、という視点で正規化を行うとミスをなくせる
- 郵便番号など、桁数に特徴があるものはそれを利用して正規化が可能。郵便番号を狙ってトリムするなんて不可能だと考えていたため、参考になった。
Discussion