아직 구체적으로 흐름을 계획한 단계는 아닙니다.
💡 서비스 흐름
- 필터링 결과만 보여줄지 (진짜 리뷰만 보여주기)
- 모두 다 보여주는 대신에 이 글이 광고인지 아닌지를 보여줄지
둘 중 하나를 선택해야만 했습니다. 우선, 미리 조금 구현해본 결과 100%의 정확도는 아닌 것 같아서 우선 2번으로 하고 따로 검색 및 필터링 옵션으로 추가하면 될 듯 하지만, 회의를 해보아야 할 듯!
우선 필터링 과정은 필수죠. 대략적으로 생각해본 과정은
✏️ 분석 과정
- 포스트 URL에서 HTML 추출
- 광고를 나타내는 어휘가 들어가면 광고로 판정
- 아니면 마지막 이미지를 OCR 진행
- 광고를 나타내는 어휘가 발견되면 광고로 판정
이런 흐름을 생각했습니다. 왜냐하면 30개 이상의 광고 리뷰를 보았는데, 모든 리뷰에서 광고를 나타내는 문구나 사진은 맨 마지막에 등장합니다. 예외인 경우는 단 하나도 없었죠.
우선, HTML을 추출해야 합니다. 자바에서 가장 대중적으로 사용하는 jsoup
라이브러리를 사용했습니다.
💡 블로그 자료
병렬처리로 5~700ms 대의 응답시간까지 도달했습니다. 아직도 꽤나 느리지만, 도저히 사용하지 못할 정도의 속도는 아닙니다. 일단 그대로 사용하되, 찾아본 자료들을 토대로 다른 언어, 다른 라이브러리들을 사용해볼 예정입니다.
💡 참고 자료
HTML을 분석해서 광고성 문구가 나타나지 않으면, 마지막 사진을 OCR 진행하여 결과를 분석해야 합니다. OCR을 로컬 컴퓨터에서 하기에는 너무 과한 작업같아서 일단은 외부 API를 사용하고난 후에 추후 바꾸는 것이 좋을 것 같다고 생각했습니다.
현재 OCR 서비스는 구글, 아마존, MS, 네이버 등에서 꽤나 많이 지원하고 있습니다. 이 중에서 아마존을 제외한 3곳의 OCR을 사용해보았습니다. 아마존은 추후 진행해볼 예정입니다.
💡 3개의 API 사용 결과
네이버 CLOVA OCR 사용해보기
네이버 CLOVA vs Google Vision OCR 비교
MS Azure OCR 사용해보기
사용해본 결과, 구글의 OCR이 사용하기 진짜 편했습니다. 라이브러리로 쉽게 접근 가능하고 요청-응답 생성과 파싱에도 수월했습니다. 단점이라면 OCR API는 모두 5~10초의 긴 대기시간을 필요로 했는데, 이는 이미지 인코딩으로 해결하였습니다.
💡 OCR 응답속도 개선하기
5개의 글을 분석하는데, 1.5초 정도가 소요되었습니다. 10개의 글을 분석한다고 하면 2초 정도의 시간이 소요됩니다. 나쁘지 않은 시간이지만, 보다 빠른 처리를 해야할 필요가 있습니다.
사전 조사를 할 때, 광고 문구를 담은 사진을 보면 대부분이 네이버 스티커 혹은 광고 업체에서 지정한 사진이었습니다.
네이버 스티커의 경우에는 너무 많아서 데이터를 쌓으려면 꽤나 시간이 걸리겠지만, 광고 업체에서 지정한 사진의 경우에는 대부분 사진 리소스 주소가 동일했습니다. (대부분 광고업체 홈페이지에 안내된 사진을 복사-붙여넣기 과정을 통해 포스트에 추가하기 때문에 이런 특징이 나타난 것 같습니다.)
따라서,
✏️ 수정된 분석 흐름
- 최초에 OCR 분석 후
- 이 이미지가 광고 사진인지 아닌지를 데이터베이스에 저장하고
- 다음 OCR 요청을 보내기 전에 데이터베이스를 조회하여
- 이전에 분석한 결과가 있는지 확인하고
- 있다면 바로 응답 전송
- 없다면 OCR 분석 요청
의 흐름을 이용하면 가장 긴 시간이 소요되는 OCR을 최대한 피할 수 있을 것이라 생각했습니다. 그리고 HTML 파싱도 긴 시간이 소요되기 때문에 처음으로 돌아가서 포스트의 분석이 완료되면 이 결과 또한 데이터베이스에 저장하고, 다음에 동일한 분석 요청이 들어오면 HTML 파싱까지도 가지 않고 바로 응답을 내어주면 더 좋을 것 같다고 생각했습니다.
결국 최종적으로 드는 생각은
🔍 검색 요청
- 네이버 검색 진행
- 블로그 분석 요청
- 이전에 분석한 내용이 있는지 조회
- 없으면 분석 요청
- 있으면 조회 결과를 바로 응답
✏️ 분석 요청
- 요청으로 들어온 URL을 HTML 파싱 진행
- 광고성 문구 확인
- 없을 경우 포스트의 맨 마지막 사진의 리소스 주소 확인
- 이전에 진행한 OCR 분석 결과가 있는지 조회
- 있으면 해당 결과를 바로 전송
- 없으면 OCR 분석 진행
이런 구조를 생각해 보았습니다. 당연히 데이터베이스에 데이터가 많아지면 조회에 시간이 많이 걸릴 것이기 때문에 이 점은 나중에 생각해볼 지점이라고 생각됩니다.
좀 더 빠른 응답을 위한 로직을 생각해볼 것!