본문 바로가기
개발툴

OpenAI를 이용하여 비정형 데이터 분석하기

by 탁구치는 개발자 2024. 12. 11.

요즘 생활체육 대회를 스크래핑 하는 사이트를 만들고 있습니다.

대부분의 사이트는 정형화된 형식으로 대회 일자를 제공하고 있지만 특정 사이트는 아래와 같이 비정형화된 형식으로 대회 일자를 제공하고 있습니다.

전국 직장 근로자들에게 생활탁구의 참여도를 높이고 건전한 여가활동은 물론 공동체 의식의 함양으로 동료 간의 화합과 건강한 직장문화를 만들어 가는데 이바지 하고 관광 단양을 전국에 홍보하여 지역발전에 기여 하는데 그 목적이 있다.
 

2. 행 사 개 요
- 대회명 : 제1회 단양 직장대항 전국오픈탁구대회
- 일 시 : 2024년 12월 14일(토) ~ 15일(일) 9시 30분
- 장 소 : 단양국민체육센터
- 주 최 : 단양군탁구협회
- 주 관 : 단양군탁구협회
- 후 원 : 단양군청, 단양군의회, 단양군체육회,

 

일시 부분에 기록되어 있는 대회 일정이 2024년 12월 14일과 같은 규칙으로 작성되어진다면 좋겠지만 대회마다 '대회 일정' 이 표시되는 문장이 다릅니다. (데이터에 규칙이 없고, 대회를 등록하는 사용자에 따라서 달라짐을 알 수 있었습니다.)

처음에는 정규표현식을 이용하여 파싱이 되면 해당 대회를 스크래핑 하도록 처리하였습니다.

10개의 대회가 있으면 6~7개 정도는 스크래핑이 정상적으로 완료되지만 나머지 대회들은 대회 날짜를 추출하지 못해 실패하였습니다.

모든 대회를 사이트에 노출 할 수 없는 아쉬움이 남았습니다.

 

그러던 와중에 https://platform.openai.com/ 라면 이 문제를 해결해 줄 수 있지 않을까 싶었습니다.

우선 chatgpt 에게 위의 비정형 데이터에서 대회 일정을 뽑아달라고 질문을 했습니다.

여러 번의 테스트를 과정을 거쳐 실제 oepnai 를 이용하여 처리해도 되겠다라는 결론에 도달했습니다.

 

https://platform.openai.com/ 에서 바로 10달러 유료 결제 하였습니다.

API 연동하는 방법은 굉장히 쉬웠습니다. api key 를 발급받고 연동 규격에 맞게 연동을 하면 되었습니다.

private final String MODEL = "gpt-3.5-turbo";
    private final String KEY = "발급키";
    private final String URL = "https://api.openai.com/v1/chat/completions";

    public String getMatchInfo(String text, String selector) {
        try {
            RestTemplate restTemplate = new RestTemplate();
            ObjectMapper objectMapper = new ObjectMapper();

            Message messageContent = new Message("user", String.format("아래 문장에서 %s \n\n %s", selector, text));
            List<Message> messages = Collections.singletonList(messageContent);
            ChatGPTRequest requestBody = new ChatGPTRequest(MODEL, messages, 100);
            String jsonBody = objectMapper.writeValueAsString(requestBody);

            HttpHeaders headers = new HttpHeaders();
            headers.setContentType(MediaType.APPLICATION_JSON);
            headers.setBearerAuth(KEY);

            HttpEntity<String> entity = new HttpEntity<>(jsonBody, headers);
            ResponseEntity<ChatGPTResponse> response = restTemplate.exchange(URL, HttpMethod.POST, entity, ChatGPTResponse.class);
            ChatGPTResponse body = response.getBody();

            return Optional.ofNullable(body).stream()
                    .flatMap(api -> api.getChoices().stream())
                    .map(Choice::getMessage)
                    .map(Message::getContent)
                    .findFirst()
                    .orElse(StringUtils.EMPTY);

        } catch (Exception e) {
            throw new RuntimeException(e);
        }
    }

 

 API 연동 시 비정형 데이터와 함께 아래와 같은 질문을 하였습니다.

시합 시작일과 접수 마감일을 json 형태로 뽑아줘
시합 시작일은 competition_date 이고, 접수 마감일은 deadline 이다.
{ "competition_date": "2024-12-14", "deadline": "2024-11-30" } 와 같이 결과물을 뽑아줘
날짜 포멧은 무조건 yyyy-MM-dd 형태이다. 월과 일이 항상 두 자리여야 한다.

 

스크래핑에서 대회일, 마감일자를 추출하는 화면

 

테스트를 진행해 보면 다음과 같이 추출됩니다.

{
    "competition_date": "2024-12-14",
    "deadline": "2024-11-30"
}

 

오~ 잘 동작하네요.

이제 비정형 데이터도 openai를 통해 원하는 데이터를 추출 할 수 있게 되었습니다.

 

비용은 얼마나 들까요?

제가 만든 스크래핑 시스템은 오전에 배치 형태로 동작하기 때문에 하루에 20~30회 정도를 질의 합니다.  

 

비용을 확인해 보면 하루에 사용하는 비용이 0.01 달러도 안됩니다.

현재 한 달 동안 사용한 비용이 0.2달러 이니 이런 추세라면 1년 이용 시 2달러 정도를 사용하게 되겠네요. 

 

AI의 활용 가치가 무긍무진해 보입니다.