본문 바로가기

수업정리

FriendFit 기술구현 부문

1. 유즈케이스 다이어그램

https://app.diagrams.net/#Hrimgosu%2Fproject%2Fmaster%2Fdocument%2FER%20DIAGRAM.drawio

 

Flowchart Maker & Online Diagram Software

Flowchart Maker and Online Diagram Software draw.io is free online diagram software. You can use it as a flowchart maker, network diagram software, to create UML online, as an ER diagram tool, to design database schema, to build BPMN online, as a circuit d

app.diagrams.net

https://app.diagrams.net/#Hrimgosu%2Fproject%2Fmaster%2Fdocument%2F%EC%A0%9C%EB%AA%A9%20%EC%97%86%EB%8A%94%20%EB%8B%A4%EC%9D%B4%EC%96%B4%EA%B7%B8%EB%9E%A8.drawio

 

Flowchart Maker & Online Diagram Software

Flowchart Maker and Online Diagram Software draw.io is free online diagram software. You can use it as a flowchart maker, network diagram software, to create UML online, as an ER diagram tool, to design database schema, to build BPMN online, as a circuit d

app.diagrams.net

 

2. 도로명 주소 -> (x,y) 좌표 변환

- 처음엔 https://www.vworld.kr/dev/v4dv_geocoderguide2_s001.do 에서 geocoderapi를 이용하려고 했으나, 지번 주소는 (x,y)좌표로 변환 가능하나 도로명 주소는 제대로 안바뀌는 문제 발생

- 네이버 geocoder api 이용, 도로명 주소도 제대로 x,y좌료로 변환 가능 (10m 오차이내)

- python pandas, csv 라이브러리를 이용해 csv에 있는 주소 정보를 x,y좌표로 변환하여 저장

import pandas as pd
import numpy as np
import requests
import json

# Load the JSON file
with open('C:/keys.json', 'r') as f:
    data = json.load(f)

# Extract the needed values
naverMapID = None
naverMapPassword = None
keys = data.get('keys')

for key in keys:
    if 'naverMapID' in key:
        naverMapID = key['naverMapID']
    if 'naverMapPassword' in key:
        naverMapPassword = key['naverMapPassword']

def get_coordinates(address):
    url = "https://naveropenapi.apigw.ntruss.com/map-geocode/v2/geocode"
    headers = {
        "X-NCP-APIGW-API-KEY-ID": naverMapID,
        "X-NCP-APIGW-API-KEY": naverMapPassword
    }
    params = {"query": address}
    
    response = requests.get(url, headers=headers, params=params)
    
    if response.status_code == 200:
        items = response.json()["addresses"]
        if items:
            x = items[0]["x"]
            y = items[0]["y"]
            return x, y
        else:
            return None, None
    else:
        raise Exception(f"Error occurred: {response.status_code}")

def add_coordinates_and_save(input_csv, output_csv):
    # Load the CSV file
    data = pd.read_csv(input_csv)

    # Get coordinates for each address
    coordinates = data['주소'].apply(get_coordinates)
    data['y좌표'], data['x좌표'] = zip(*coordinates)

    # Save the modified dataframe to a new CSV file
    data.to_csv(output_csv, index=False)
    print(f"Saved data to {output_csv}")

# Test the function
add_coordinates_and_save('./test02map/test.csv', './test02map/testresult.csv')

test.csv (변환 전)
testresult.csv (변환 후)

 

3. "지도"에 들어가는 기술

- https://apis.map.kakao.com/web/ 카카오 map api를 이용해 마커 hover와 click 조건 추가

실제 DB에 추가된 광주 체육시설 정보들 표시
마커 클릭 시 상세 시설정보 조회 가능

- 현재 "접속"한 사용자의 위치정보 표시 : geolocation api 사용

<script src="//dapi.kakao.com/v2/maps/sdk.js?appkey=79769e254f2328cac41473351ff2b861"></script>
<script>
navigator.geolocation.getCurrentPosition(function(position) {
	console.log("Latitude is :", position.coords.latitude);
	console.log("Longitude is :", position.coords.longitude); }
</script>

현재 정확한 위치 정보를 받아오는 모습

 

 

4. ocr 기능 구현

- 원래 api 호출 비용이 없는 node.js의 Tesseract 라이브러리를 이용하려고 했으나, 찌그러진 글씨 및 한글 인식 성능이 안 좋아서 포기함.

- 네이버 clova ocr api를 이용하면 1회 호출 당 3원의 비용이 들지만, 찌그러진 글자 및 한글에 대한 정확한 api 호출이 가능.

다음은 영수증 이미지에 글씨 추출 결과이다.

다음 영수증에 대한 네이버 OCR API의 호출 결과는?

HTTP/1.1 200 OK

세계 1등 편의점 (주)코리아세븐 www7 eleven kr 세븐일레븐 문정수정점#18308 (02-400-6307) 2158544631 송파구 동남로 8길 12 (문정동) 현금(자진발급) 그 객 용 [판 매] 2020-06-09 (화) 20: 59: 47 상품명 수량 금 액 라라스윗)바닐라피인트474 행사 8809599360081 1 6,900 라라스윗)초코피인트474ml 행사 8809599360104 1 6,900 비닐봉투 보증금 20원 *1171798100209 1 20 과세물품가액 12,545 부 가 세 1,255 봉투보증금액 20 합계 ₩13,820 20

 

- gpt 3.5 turbo api 활용, 각 값을 주소, 총금액, 상호명에 맞춰 DB에 집어넣는 알고리즘 구현

prompt = ocrdao.callOcrApi();
prompt += "'주소 : ?"
+ "총금액 : ?"
+ "상호명 : ?'"
+ "물음표에 각각 값을 넣어 줘"
+ "그 외 다른 어떤 말도 덧붙이지마.";
gpt3DAO gptdao = new gpt3DAO(API_KEY, prompt);

GPT를 이용해서 각 컬럼을 잘 추출한 것을 볼 수 있다.

- 문자열을 추출해 TB_OCR에 정보 담기

다음과 같이 테이블에 잘 들어가는 것을 볼 수 있다.

 

 

5. 리뷰페이지, 컬럼페이지 최적화 작업 (5.64초 -> 0.34초)

- for문에 의해 db가 연결 접속이 반복적으로 해제되는 문제로, 글 보여주는 게 다소 시간이 걸렸다.(5.64초)

- db 연결과 끊기를 반복문에서 빼내 성능 향상을 이루었다.(0.34초)

 

 

 

 

'수업정리' 카테고리의 다른 글

오라클 DB 외부 연결  (0) 2023.08.01