CS/NLP
실습1-2. 텍스트 분류 모델 API 생성
초코chip
2024. 3. 21. 17:04
배경
이전 연구에서 다양한 기계 학습 모델 중에서 문자 데이터를 효과적으로 다중 분류할 수 있는 모델로 랜덤 포레스트를 선택했습니다.
https://chocochip125.tistory.com/211
종설 분류 모델 보고서
보호되어 있는 글입니다. 내용을 보시려면 비밀번호를 입력하세요.
chocochip125.tistory.com
이번 단계에서는 학습된 랜덤 포레스트 모델을 로드하여, 애플리케이션에서 문자 데이터를 전송할 시 해당 데이터의 분류 클래스를 반환하는 API를 구현하는 작업을 진행하였습니다.
이를 위해 API 개발에 간편하고 효율적인 FastAPI 프레임워크를 사용했습니다.
구현 과정
모델 및 벡터라이저 로드
먼저, 학습 과정에서 생성된 랜덤 포레스트 모델과 TF-IDF 벡터라이저를 로드합니다.
# 랜덤 포레스트 모델과 TF-IDF 벡터라이저 로드
model_path = './model/random_forest_model.pkl'
vectorizer_path = './vectorizer/tfidf_vectorizer.joblib'
model = joblib.load(model_path)
vectorizer = joblib.load(vectorizer_path)
벡터라이저 적용
분류할 문자 데이터를 랜덤 포레스트 모델의 입력 형태에 맞게 벡터화합니다.
이 과정에서 TF-IDF 벡터라이저를 사용하여 텍스트를 벡터로 변환하는 작업을 수행합니다.
# 텍스트를 TF-IDF 벡터로 변환
def preprocess_text(text):
vectorized_text = vectorizer.transform([text])
return vectorized_text
인덱스 to 라벨 변환
모델이 반환하는 분류 결과는 숫자(인덱스) 형태입니다.
이 숫자를 사람이 이해할 수 있는 라벨로 변환하는 과정이 필요합니다.
index_to_label = {
0: '납부 예정',
1: '결제 거절',
2: '결제 승인',
3: '자동 이체',
4: '미납',
5: '결제 취소',
6: '계좌 개설'
}
def get_label_from_index(index):
return index_to_label.get(index, "Unknown")
FastAPI 코드 구현
문자 데이터를 입력받아 해당 데이터의 분류 클래스를 반환하는 API 함수를 구현합니다.
app = FastAPI()
class TextItem(BaseModel):
text: str
@app.post("/predict/")
async def predict(item: TextItem):
try:
preprocessed_text = preprocess_text(item.text)
prediction = model.predict(preprocessed_text)[0]
predicted_index = np.argmax(prediction)
return {"class": get_label_from_index(predicted_index)}
except Exception as e:
raise HTTPException(status_code=500, detail=str(e))
if __name__ == "__main__":
uvicorn.run(app, host="127.0.0.1", port=8000)
결과 테스트
API 구현을 마친 후, Postman을 활용하여 실제 요청을 보내고 결과를 확인했습니다.
테스트 결과, 클래스가 정상적으로 반환되는 것을 확인할 수 있었습니다.