NLP와 OCR, 머신 러닝으로 더욱 편리하고 특별한 LINE 가계부 만들기

LINE DEVELOPER DAY 2020에서 김길도 님이 발표하신 Technical Initiatives for Convenient Use of LINE Kakeibo 세션 내용을 옮긴 글입니다.

안녕하세요. F Server Dev2 팀에 김길도입니다. 이번 글에서는 LINE OA(Official Account) 메시지로 영수증 이미지를 보내면 가계부에 지출 항목이 등록되고 맞춤형 쿠폰까지 발급되는 LINE 가계부(일본어)의 흐름을 따라가면서, LINE 가계부에서만 경험할 수 있는 UX와 사용자가 좀 더 편리하게 이용할 수 있도록 도와주는 숨겨진 기술들을 소개하겠습니다.

참고. LINE 가계부는 현재 일본에서만 서비스하고 있습니다.

 

LINE 가계부 소개

먼저 LINE 가계부에 대해 소개하겠습니다. LINE 가계부는 수입과 지출 항목을 입력하고 일간과 주간, 월간 수입 지출 내역을 캘린더 형식이나 목록 형식으로 확인할 수 있게 제공하고 있습니다. 소비 형태를 확인하기 위한 카테고리 화면과 리포트 기능도 주간과 월간으로 제공하며, 예산 설정과 반복 입력, LINE Pay나 은행과의 연동 기능도 제공합니다.

LINE 가계부에는 이런 기본적인 기능 외에도 다른 가계부 앱과는 다른 특별한 점이 많은데요. LINE 가계부가 사용자에게 어필하는 여러 장점들을 한 번 알아보겠습니다.

 

LINE 가계부의 UX를 더욱 편리하고 특별하게

LINE 가계부는 LINE에서 서비스하기 때문에 LINE 사용자라면 동의 절차만 한 번 거치면 쉽게 사용할 수 있습니다. 앱을 별도로 설치하지 않아도 LINE에서 바로 사용할 수 있으며, 필요하다면 별도의 앱을 설치해서 사용할 수도 있습니다. 이렇게 접근하기 쉽고 편리하게 서비스를 제공하고 있지만 아직 저희가 원하는 정도의 특별함은 아닙니다. 가계부 앱을 켜지 않아도, 웹앱을 실행하지 않아도 가계부를 등록하고 사용할 수는 없을까요? 

가계부 등록을 LINE OA 메시지로

저희는 좀 더 쉽고 편하면서도 특별한 서비스를 제공하기 위해 고민하다가 LINE에서 이벤트 발송에 사용하는 OA 메시지에 주목했습니다. LINE OA 친구에게 메시지를 보내듯 가계부를 등록한다면, 쉽고 편하면서 LINE 가계부만의 독특함도 확보할 수 있다고 생각했습니다. 아래는 OA 메시지를 이용해 가계부를 등록하는 영상(일본어)입니다.

영상과 같이 OA 친구에게 메시지를 보내면 가계부에 등록되는데요. LINE OA 메시지 서비스를 입력 수단으로 활용하기 위해서는 OA 메시지를 서비스 서버에서 송수신하기 위한 LINE Messaging API 연동 절차를 거쳐야 합니다. 이를 위해 LINE 개발자 사이트에서 공식 계정을 생성하고 메시지를 전달받을 웹훅 URL을 등록했고 본격적으로 개발할 때는 LINE 개발자 사이트에서 제공하는 SDK를 사용했습니다.

LINE 개발자 사이트에서는 다양한 언어로 SDK를 제공하고 있어서 각자의 개발 환경에 맞춰 사용할 수 있습니다. 덕분에 몇 줄 안 되는 코드로 쉽게 메시지를 받아볼 수 있습니다. 메시지를 받은 뒤엔 메시지의 종류에 따라 필요한 처리를 하고 응답을 보내면 됩니다.

가계부에서는 텍스트와 이미지 형태의 메시지를 처리하고 있는데요. 서비스에서 응답을 보낼 때의 메시지는 어떤 모습일까요? 확인하기 어렵지 않을까요? 그래서 LINE 개발자 사이트에서는 Flex Message 시뮬레이터를 제공하고 있습니다.

시뮬레이터를 활용하면 쉽게 메시지를 구성하고 확인할 수 있습니다. 제공하는 샘플을 참고하면 사용하는 게 어렵지 않고, 시뮬레이터에서 보이는 화면을 JSON으로 변환하거나 JSON을 메시지 화면으로 전환할 수도 있습니다. 이제 OA 메시지를 받고 다시 원하는 형태로 메시지를 보낼 수 있게 되었고 메시지를 가계부 서버에도 전달할 수 있습니다.

 

전달받은 메시지는 NLP로 분석하고 처리

이제 전달받은 메시지를 어떻게 분석하고 처리해서 가계부에 등록하는지 이야기하겠습니다. 가계부에 등록하는 형식과 OA 메시지로 입력되는 형식은 다릅니다. 또한 가계부 등록 형식에는 메모와 날짜, 금액 등 채워야 하는 필드값이 많습니다. 따라서 메시지로 받은 입력에서 각 값들을 잘 구분해야 하는데요. 구분하는 방법에는 입력 형식을 강제하는 방법이나 띄어쓰기로 구분하는 방법 혹은 정규 표현식을 활용하는 방법 등 여러 방법이 있습니다. 그중 어떤 방법을 사용하는 게 좋을까요?

LINE은 이 물음에 대한 답을 갖고 있었습니다. 바로 NLP(Natural Language Processing) 기술입니다. 가계부에서는 NLP 기술을 사용한 ‘Linguist2’라는 시스템을 활용합니다. 형태소 분석과 색인어 검색 등 NLP 기술에 대해서 잘 몰라도 괜찮고 입력되는 언어가 무엇이든 상관없습니다. 다국어 검색기가 탑재돼 있어 18개 언어에 대해서 형태소 분석과 색인어 추출이 가능합니다. 입력 영상에 나왔던 ‘ランチ700’을 Linguist2를 이용해 분석하면 아래 왼쪽과 같이 형태소 분석 결과가 나오고 오른쪽과 같이 색인어 추출 결과가 나옵니다. 가계부에서는 오른쪽에 보이는 일본어 색인어 추출을 사용하고 있습니다.

 

영수증 이미지는 OCR과 머신 러닝으로 분석

이제 가계부 입력에 사용할 적당한 말과 금액을 얻었으니 지출 항목으로 등록하면 됩니다. 이번에는 영수증 이미지를 OA 메시지로 보내 보겠습니다.

이미지를 전송하니 지출 항목으로 잘 등록됐는데요. 어떻게 가능했을까요? 바로 OCR 기술 덕분입니다. OA 영수증 입력의 핵심은 OCR을 이용한 영수증 분석입니다. OCR 기술을 잘 몰라도 괜찮습니다. LINE은 이미 관련 기술에 대해 지원할 준비가 돼있습니다. 전문가와 상담하시면 됩니다. LINE에 OCR과 관련한 서비스는 CLOVA OCR과 PicCell 등이 있습니다. 먼저 아래는 CLOVA OCR 사이트입니다. 일반적인 OCR부터 영수증과 신용 카드, ID 카드 등 여러 CLOVA OCR 기술을 체험해 볼 수 있습니다.

다음으로 PicCell의 기술을 체험할 수 있는 사이트입니다. OCR 외에도 이미지 필터링과 오브젝트 감지 등 비전 관련 AI 기술이 많이 있습니다.

영수증을 OCR로 읽을 때는 일반적인 텍스트를 읽을 때와는 조금 다른 처리가 필요합니다. 영수증에는 가게 이름과 주소, 전화번호, 시간, 물건 금액, 할인액, 세금, 지불 방법 등 많은 정보가 담겨 있습니다. OCR로 읽은 결과가 단순 텍스트로 나열된다면 가계부에서는 어떤 데이터를 사용해야 할지 알 수 없습니다. 영수증을 가계부에 입력하기 위해서는 텍스트를 읽어내는 처리 이외에도 텍스트가 어떤 의미인지 확인하고 의미 단위로 구분할 필요가 있습니다.

CLOVA OCR과 PicCell, 두 서비스 조직과 협업하면서 이런 처리가 가능했습니다. 수만 장의 영수증을 수집해 초기 영수증에 대한 머신 러닝 모델을 생성했고, 재학습 과정을 거치며 정확도를 향상시키고 영수증 변경에도 대응하며 최종 모델을 만들어서, PicCell을 통해 서비스를 제공받고 있습니다. 아래는 영수증을 인식한 결과입니다.

의미를 잘 파악할 수 있도록 실제 영수증의 구조와 유사하게 나뉘어 있습니다. 아이템 항목에서는 어떤 항목이 있는지, 금액은 얼마인지, 할인액은 얼마인지 확인할 수 있습니다. 지불 정보에서는 어떤 지불 수단으로 언제, 얼마를 지불했는지 또한 할인액은 얼마인지 확인할 수 있습니다. 가게 정보에서는 어떤 가게를 이용했고 가게 전화번호는 무엇인지 확인할 수 있습니다. 이제 영수증을 가계부에 등록할 수 있는 형태로 정보를 가져올 수 있게 되었습니다.

 

사용자의 수작업을 줄여주는 숨겨진 기술들

NLP와 OCR 기술을 적용해 텍스트와 영수증 이미지 모두 OA 메시지를 이용해서 가계부에 등록할 수 있게 됐습니다만 이것으로 끝이 아닙니다. 사용자가 더 편하게 사용할 수 있도록 보이지 않는 곳에서 더 많은 것을 해주려고 합니다. 무엇을 해주면 좋을까요? 가계부 입력에는 여전히 채워지지 않은 입력 필드가 남아있습니다.

OA 메시지를 이용한 영수증 OCR은 강력하지만 가계부 등록에 필요한 모든 것을 제공해 주지는 않습니다. 채워지지 않은 필드를 손으로 하나하나 입력하는 것은 상당히 귀찮은 일입니다. 사용자가 입력하지 않아도 기술을 이용해 더 채워줄 수 있는 필드는 없는지 살펴봤습니다.

 

LINE 플랫폼의 지역 검색 정보 활용 

전화번호와 같은 정보는 LINE이 보유한 시스템을 활용하기에 아주 좋은 정보입니다. LINE의 지역 검색 정보와 연동해 전화번호로 해당 전화번호를 포함한 정보를 얻을 수 있는데요. 아래 화면은 지역 검색 서비스 API를 호출한 응답 결과 화면입니다.

가계부에서는 영수증의 전화번호로 지역 검색 결과를 받아 상호를 특정하는 입력값으로 사용하고 있습니다. 서비스에서 필요하다면 반대로 주소나 상호로 전화번호를 얻는 것도 가능합니다.

 

머신러닝으로 수입과 지출 카테고리 자동 분류

LINE 가계부에 숨겨져 있는 중요한 처리가 하나 더 있습니다. 바로 카테고리 자동 분류입니다. 수입, 지출 항목의 카테고리 분류는 가계부를 분석할 때 중요한 역할을 하지만 하나하나 지정해 주기는 귀찮은 부분입니다.

이런 점을 보완하기 위해서 카테고리 자동 분류를 적용했습니다. 카테고리를 자동으로 분류하기 위해서 가장 먼저 떠올린 것은 머신 러닝이었는데요. 과연 머신 러닝을 어떻게 적용했을까요? LINE에는 이미 훌륭한 머신 러닝 전문가들이 있었습니다. 머신 러닝 팀에 의뢰해서 카테고리를 자동으로 분류할 수 있도록 라이브 페이즈와 XGBoost 알고리즘이 적용된 기본 시스템을 이전 받았고, 이 시스템을 통해 실제 가계부에 누적된 사용자의 데이터를 바탕으로 재학습 과정을 거쳐 정확도를 높였습니다.

여기서 끝이 아닙니다. 추가로 지역 검색에서 얻은 가게 정보를 사용했고 사용자의 카테고리 입력 데이터를 활용해 정확도를 더욱 높였습니다. 아래는 카테고리 자동 분류의 간략한 흐름입니다.

사용자의 OCR 입력을 분석해 전화번호를 얻고, 얻은 전화번호를 바탕으로 지역 검색을 이용해 가게 정보를 얻어옵니다. 가게 정보와 Elasticsearch에 저장된 기존 사용자 입력 데이터를 활용해 1차로 카테고리 정보를 얻어온 뒤 최종적으로 가게 정보와 시간, 금액 등의 정보를 이용해 머신 러닝이 적용된 카테고리 검색 시스템으로 카테고리를 분류합니다.

 

영수증을 활용한 맞춤형 쿠폰 제공

지금까지 OA 메시지를 이용해 가계부의 수입과 지출 항목이 등록되는 과정과 그 과정에서 사용한 기술들을 살펴봤는데요. 이제 사용자에게 줄 수 있는 혜택을 생각해 보려고 합니다.

가계부를 사용하는 사용자에게 소비 습관을 확인하고 불필요한 소비를 억제하는 등의 무형의 장점 외에 실제로 제공할 수 있는 다른 혜택은 없을까요? 암호 화폐 자산이나 포인트, 스티커, 쿠폰 등 LINE에서 제공할 수 있는 많은 혜택들을 검토해 봤는데요. 그중에서 가계부 기능과의 연관성을 고려했을 때 영수증으로 입력한 가게의 쿠폰을 제공하는 것이 서비스 사용자와 제공자 모두에게 의미 있는 혜택이라고 생각했습니다. 그런데 쿠폰은 어떻게 적용해야 할까요? 이 문제 역시 LINE에 답이 있었습니다. 이미 LINE Wallet에서 머신 러닝을 이용한 맞춤형 쿠폰을 제공하고 있었기 때문입니다.

LINE 가계부에서는 LINE Wallet에서 제공하는 개인화된 추천에 더해 사용자가 직접 입력하는 영수증의 데이터를 활용해서 사용자가 이용했던 가게의 쿠폰을 제공합니다. 실제 사용자가 이용하는 곳의 쿠폰을 제공함으로써 사용자의 만족도를 높이는 것입니다. 이제 영수증을 OA 친구에게 메시지로 보내면 가계부에 등록되고 쿠폰까지 받아볼 수 있게 되었습니다.

마치며

지금까지의 과정을 정리하면 다음과 같습니다.

LINE OA 메시지를 통해 텍스트와 영수증 이미지를 입력받습니다. 텍스트는 NLP 기술로, 영수증은 영수증 OCR 기술로 분석해서 입력 정보를 얻은 뒤, 지역 검색으로 가게 정보를 얻고 카테고리까지 자동으로 분류합니다. 마지막으로 쿠폰을 발급해서 사용자에게 OA 메시지로 전송합니다.

지금까지 LINE 가계부에 적용한 기술에 대해서 알아보았습니다. 이번 글에서 살펴본 기술 외에도 LINE에서는 사용자에게 혜택을 제공할 수 있는 수많은 기술을 보유하고 있었는데요. 모든 것을 혼자 만들 필요는 없다는 것을 다시 한번 깨닫게 되었습니다. 아래에서 발표 영상도 확인하실 수 있습니다. 긴 글 읽어주셔서 감사합니다.