12/16, 01/04 작성 중 ...
...
Python을 이용하여 웹툰 안의 캐릭터 대사와 같은 작품 안의 텍스트 정보를 이용하여 작품 간의 유사도를 구해봤습니다.
이미지 크롤링, OCR, text mining, TF-IDF, 그리고 Cosine similarity 에 관한 개념을 아시면 어렵지 않습니다.
네이버 웹툰에서 인기 있는 20개 작품에서 각각 20개의 회차(1 ~ 20 화) 를 가지고 진행했습니다.
숫자가 높을 수록 유사도가 높은 작품입니다. 예를 들어 가비지타임(농구)과 빅맨(농구)이 0.3으로 작품들 중 가장 유사하며 현실 퀘스트와 quest(원래 제목:퀘스트지상주의)가 0.26으로 두번 째로 유사합니다. 반면 장씨세가(무협)와 뷰티풀 군바리(여성 군 생활)는 0.012 유사도가 가장 낮습니다.
웹툰 이미지 크롤링
이 부분은 어렵지 않으나 악용될 우려가 있어서 코드는 생략.
OCR 개념
Google, Kakao, Naver, Open source, ...
CLOVA OCR
Naver의 CLOVA OCR 사용(하루 100개 요청까지는 무료). 가입시 10만(?) 포인트를 제공하였던 것으로 기억함. 그때 받은 포인트로 결재하여 진행하였음.
CLOVA OCR 가입 방법과 설명은 다른 블로그를 링크에 넣어둠.
[링크]
PYTHON CODE
본인의 계정을 만들고 API key를 받았다면 메모장에 저장합니다. 저는 작업 디렉토리에 ocr_api.txt로 저장했습니다. 그리고 API 키를 불러오는 함수를 정의하였습니다.
[API KEY 불러오는 함수 정의]
def getAPIkey():
f = open("./ocr_api.txt","r")
return f.read()
key = getAPIkey()
[폴더 안에 있는 이미지를 불러오는 함수 정의]
import os
def dir_files(title):
imgs =[]
dir_path = "./imgs/{}_m/".format(title) # image directory {}안에는 작품 title
for (root, directories, files) in os.walk(dir_path):
for file in files:
if '.jpg' in file:
file_path = os.path.join(root, file)
imgs.append(file_path)
return imgs
* 위 코드는 제 PC에 저장된 이미지 경로와 폴더 이름을 가지고 만든 코드이므로 본인의 환경에 맞게 변경하여야 함. 저는 ~/imgs/천마육성_m/xxx.jpg 이런 식으로 데이터셋이 저장되어 있습니다.
[dir_files 정의된 함수 실행 예시]
위 코드를 실행시켜보면 아래와 같이 폴더 안에 있는 jpg 파일 이름을 전부 가져옵니다.
# 테스팅 코드
title = '광마회귀' # title 넣기.
paths = dir_files(title)
paths
[CLOVA OCR 함수 정의]
import json
import pandas as pd
import uuid
import time
import cv2
import requests
def ocr2(paths):
request_json = {'images': [{'format': 'jpg',
'name': 'demo'
}],
'requestId': str(uuid.uuid4()),
'version': 'V2',
'timestamp': int(round(time.time() * 1000))
}
payload = {'message': json.dumps(request_json).encode('UTF-8')}
headers = {
'X-OCR-SECRET': secret_key,
}
df = pd.DataFrame(columns=['valueType', 'inferText', 'inferConfidence', 'type', 'lineBreak','boundingPoly.vertices'])
cnt = 0
for path in paths:
cnt +=1
if cnt%150 == 0:
time.sleep(8)
try:
response = requests.request("POST", api_url, headers=headers, data=payload,files=[('file', open(path,'rb'))])
result = response.json()
result = pd.json_normalize(result['images'][0]['fields'])
df = pd.concat([df,result])
except:
print('Error in'+path)
return df
여러 블로그와 CLOVA 페이지에 있는 코드를 참고했습니다.
* 참고한 블로그
[OCR 정의된 함수 실행 예시]
test = ocr2(paths)
test
[OCR 실행 코드]
만약 3개 작품으로 OCR을 시행한다고 하면 아래와 같이 하면 됩니다. OCR 결과를 모두 ocr_results 폴더 안에 작품제목.csv 형태로 저장했습니다.
titles = ['싸움독학','입학용병','현실퀘스트']
for title in titles:
paths = dir_files(title)
df1 = ocr2(paths)
df1.to_csv('./ocr_results/{}.csv'.format(title),encoding="utf-8-sig") #index=False
print(title,'/', round(df1.inferConfidence.mean(),4), '/ len: ',len(df1), '0.9<', len(df1[df1['inferConfidence'] > 0.9]))
time.sleep(2)
TF-IDF
Similarity(Cosine)
'데이터 분석 - Python' 카테고리의 다른 글
TFT 롤토체스 데이터 분석 #3 (0) | 2022.12.12 |
---|---|
[데이터 분석] 네이버 웹툰 데이터 크롤링 with python (0) | 2022.10.17 |
TFT / 롤체 / 롤토체스 데이터 분석 #1 (0) | 2022.03.30 |
TFT 롤토체스 데이터 분석 #2 (0) | 2022.03.30 |