현재 데이터의 문제점
학력이든 회사이름이든 되게 정리가 안되어있다.
주식회사를 뜻하는 (주)가 앞에 있는 곳도 있고 뒤에 있는 곳도 있고, "주식회사"라는 단어가 붙은 곳도 있고..
학력은 졸업예정자 가능이라던가, 직무별 상이라던가, 저대로 검색기능을 제공한다면 너무 불친절한 사이트가 될거다..
AI를 이용한 데이터 정규화
데이터 정규화는 일관된 형식으로 데이터를 저장하고, 처리하기 위해 필수적인 작업이다.
특히 우리 프로젝트에서처럼, 크롤링한 채용공고 같은 비정형 데이터를 다룰 때 중요하다.
채용공고 데이터는 기업마다 형식이 제각각이다.
예를 들어, "경력 3년 이상" 이 "3년 이상", "최소 3년", "3년-5년" 처럼 여러 방식으로 표현될 수 있는데,
여기서 AI를 사용하면 "3년" 처럼 하나의 통일된 형식으로 정리 가능하다.
이렇게 일관화된 데이터를 사용하면 기존의 비정형 데이터를 사용할 때 보다 검색하거나 필터링하는 작업이 쉬워지고,
사용자 친화적으로 서비스를 제공할 수 있다.
AI를 사용하지 않고 데이터를 정리한다면, if-else문을 수도없이 작성해야 할 것이다.
만약 새로운 표현이 등장한다면 해당 표현을 또 if문으로 만들어야 한다.
하지만 AI를 사용하면, 자동으로 새로운 패턴을 학습하고 유지보수가 쉬워진다는 장점이 있다.
OpenAI API
object AIHelper {
private val dotenv = Dotenv.load()
private val API_KEY = dotenv["API_KEY"]
private const val API_URL = "https://api.openai.com/v1/chat/completions"
fun normalizeText(input: String, task: String): String {
val client = OkHttpClient()
val json = JSONObject()
json.put("model", "gpt-4o-mini-2024-07-18")
json.put("messages", listOf(
JSONObject().put("role", "system").put("content",
"데이터 정규화 작업을 도와줘. 'output:' 같은 단어를 절대 포함하지 마. 그냥 결과만 출력해. 다른 불필요한 설명을 붙이지 마."),
JSONObject().put("role", "user").put("content", "Task: $task. Keep it in Korean. Input: $input")
))
json.put("temperature", 0.3)
val body = json.toString().toRequestBody("application/json".toMediaTypeOrNull())
val request = Request.Builder()
.url(API_URL)
.post(body)
.addHeader("Authorization", "Bearer $API_KEY")
.addHeader("Content-Type", "application/json")
.build()
return try {
client.newCall(request).execute().use { response ->
if (!response.isSuccessful) {
return "Error: ${response.code}"
}
val responseBody = response.body?.string() ?: return "Error: Empty response"
val jsonResponse = JSONObject(responseBody)
jsonResponse.getJSONArray("choices")
.getJSONObject(0)
.getJSONObject("message")
.getString("content")
}
} catch (e: Exception) {
"Error: ${e.message}"
}
}
}
가장 익숙한 gpt의 openai api를 사용했다. 사용하긴 되게 쉽다
api key를 받아서 환경변수에 저장해두고 정해진 틀에 따라 작성해주면된다
그냥 이렇게 저장할때 명령어를 작성하면 알아서 정제해준다
처음엔 이렇게 출력: Output: 같은 쓸데없는 단어도 포함해서 나타내주길래
해당 명령어를 또 작성하니
데이터를 정형화 해서 잘 저장해주더라
그런데 아직 ai만의 기준과 나의 기준이 다른 점이 있어서 이부분은 개선사항으로 남겨놓아야겠다.
학습을 시켜야하나.. 고민이다
++처음엔 3.5터보로 하다가.. 4o mini가 성능도 좋고 더 싸길래 돌려보니까 맘에 들어서 이거 쭉 쓰면 될거같당
'팀 프로젝트 > cheerha.project' 카테고리의 다른 글
채용공고 데이터를 크롤링해오자(3) 코틀린과 함수형 프로그래밍 리팩토링 (0) | 2025.03.04 |
---|---|
채용공고 데이터를 크롤링해오자(1) 코틀린 + 스프링 크롤링 시작 (0) | 2025.03.02 |
사용자가 사이트에 요청을 보내는 과정(DNS) (0) | 2025.02.27 |