[Project] DE Toy Project - 데이터 분석(분석 모델 테스트)

 

지난 포스팅에서 이어집니다.

 

[Project] DE Toy Project - 데이터 수집(쿠팡 크롤링과 병렬 처리) 3

지난 포스팅에서 이어집니다. [Project] DE Toy Project - 데이터 수집(쿠팡 상품 리뷰 크롤링) 1지난 포스팅에서 이어집니다. [Project] DE Toy Project - 데이터 수집(네이버 쇼핑 리뷰 크롤링 삽질하기)1. 프

tjlog-tistory.tistory.com

 

지난 포스팅에 이어 이번에는 크롤링한 데이터를 요약하고 감정 분석하는 모델을 찾고, 직접 테스트해본 결과를 공유합니다.

 

 

 

1. 목표

1.1 프로젝트 전체 목표

이번 프로젝트는 쿠팡 상품의 기본 정보 및 리뷰 데이터를 수집하여, 이후 텍스트 분석을 위한 데이터 파이프라인을 구축하는 과정을 정리한 기록입니다. 단순 크롤링이 아닌 병렬 처리, 데이터 저장, 후속 분석 작업까지 연결된 전체 흐름을 목표로 삼았습니다.

1.2 이번 작업 목표

  • 요약, 감정 분석 모델 후보군 찾기
  • 성능과 속도를 기준으로 하는 모델 테스트 진행

 

 

2. 모델 후보군 찾기

2.1 Chat GPT 추천 모델

  • 요약 분석 모델
모델 이름 설명 특징
ainize/kobart-news KoBART 기반 뉴스 요약 모델 한국어 긴 문장 요약에 최적
knkarthick/MEETING_SUMMARY 다국어 미팅 요약 (한국어 OK) 대화체 요약 가능
  • 감정 분석 모델
모델 이름 설명 특징
beomi/KcELECTRA-base 한국어 뉴스 댓글 기반으로 학습된 모델 텍스트 분류 속도 빠르고 정확도 높음
snunlp/KR-FinBERT 금융 도메인 특화된 감정 모델 비즈니스/상품 리뷰도 성능 나쁘지 않음
nlp04/korean-sentiment-analysis beomi/KcELECTRA-base fine-tunning 모델, 댓글/상품 리뷰 기반 학습 모델 10가지 종류의 감정 분류 지원

 

2.2 Hugging Face에서 검색한 모델

  • 요약 분석 모델
모델 이름 설명 특징
kakaocorp/kanana-nano-2.1b-instruct Kakao에서 배포한 LLM 경량 모델 한국어 성능 우수, 21억 개 파라미터 사용
Amazon_MultiLingual_Review_Summarization_with_google_mT5_small mt5_small 모델, review dataset fine tunning 버전 빠른 속도, 리뷰 데이터 요약 특화
csebuetnlp/mT5_multilingual_XLSum mt5_XLSum  다중 언어 모델  빠른 속도

 

 

 

3. 모델 테스트

3.1 모델 테스트 기준

  1.  성능
    • 데이터 분석이 주가 아니기 때문에 fine tunning은 따로 하지 않고 모델 자체의 성능만 평가
    • 텍스트 요약 분석 시 문법과 문맥에 이상이 없는지, 중요 내용을 잘 요약 했는지 평가 
    • 감정 분석 시 감정을 정확히 분류 했는지 평가
  2. 속도
    • 실시간으로 데이터 분석 결과를 보여줘야 하기에 빠른 속도로 결과가 출력되는지 평가
    • 리뷰 한개 당 요약, 감정 분석 까지 3~5초 이내로 결과 출력되는 것을 목표로 함을 감안한 평가
  3. 테스트 환경
    • Window11
    • CPU 8 core (GPU 없음)
    • Ram 32gb
  4.  

3.3 모델 테스트 진행 내용

아래 텍스트 요약 모델들은 한국어 분석 성능이 안좋아 본 프로젝트에 적합하지 않음

  • knkarthick/MEETING_SUMMARY
  • Amazon_MultiLingual_Review_Summarization_with_google_mT5_small
  • csebuetnlp/mT5_multilingual_XLSum

 

텍스트 요약 모델 테스트

ainize/kobart-news

  • 긴 글 요약 속도 빠름 (GPU 사용 안해도 1~3초 소요)
  • 문법 / 문맥 정확도 낮음
  • 뉴스 기사 기반으로 학습된 모델이라 뉴스 기사로 테스트 해봤지만 결과가 좋지 않았음
    (리뷰 데이터로 fine tunning해도 결과 안좋을 것이라 예상됨)
from transformers import BartForConditionalGeneration
from kobart import get_kobart_tokenizer
import time
import datetime


# 모델과 토크나이저 불러오기
model = BartForConditionalGeneration.from_pretrained('ainize/kobart-news')
tokenizer = get_kobart_tokenizer()

# 요약할 텍스트
text = """
유선청소기를 사용한 지 벌써 한 달이 지나가네요. 
요즘 무선청소기가 워낙 대세다 보니 저도 처음엔 “유선은 좀 불편하지 않을까?” 하고 걱정을 많이 했는데, 
막상 써보니 의외로 만족도가 높아서 놀랐습니다. 우선 이 제품은 흡입력이 정말 강력합니다. 
카펫이나 매트에 박혀 있는 머리카락, 미세먼지, 고양이 털까지 깔끔하게 빨아들이는 걸 보고 
“아, 무선은 아직 따라오기 어렵겠구나”라는 생각이 들었어요. 또 청소기를 돌리다가 배터리 걱정을 안 해도 된다는 게 정말 
큰 장점입니다. 예전에 무선청소기 쓸 때는 중간에 충전하느라 청소가 끊기고, 충전 다 될 때까지 기다려야 했는데,
유선은 그냥 전원만 꽂으면 언제든 풀파워라 너무 편하더라고요.\n\n물론 아쉬운 점도 있습니다. 
당연히 선이 있으니까 이동할 때 제약이 있어요. 방을 옮길 때 콘센트를 빼서 다른 데 꽂아야 하는 번거로움이 있고, 
선이 발에 걸리거나 가구에 걸릴 때 가끔 짜증이 납니다. 
그래도 코드 길이가 넉넉하게 나와서 작은 집이나 원룸에서는 큰 불편함 없이 사용할 수 있었고, 
주택이나 큰 집이라면 멀티탭을 활용하면 괜찮겠다는 생각이 들었어요.\n\n무게도 생각보다 가볍고, 
손잡이 그립감이 좋아서 장시간 청소해도 손목이 덜 아팠습니다. 필터 세척도 간편하고 먼지통 비우기도 어렵지 않아서 관리 
측면에서도 합격점이에요. 소음은 어느 정도 있지만, 무선 대비 크게 불편하지 않을 정도라 밤 늦게만 아니면 문제 없었습니다.
\n\n결론적으로 무선청소기에 비해 덜 세련되고 자유롭진 않지만, 강력한 흡입력과 배터리 걱정 없는 사용감 덕분에 실속파에게는 
충분히 추천할 만한 제품이라고 생각합니다. 가격 대비 성능을 따진다면 유선청소기가 오히려 더 합리적인 선택이 될 수도 있다는 걸 
이번에 새삼 깨달았네요. 앞으로도 잘 쓸 것 같습니다!
"""

start = time.time()
# 토크나이즈
input_ids = tokenizer.encode(text, return_tensors="pt", max_length=1024, truncation=True)

# 요약 생성
summary_ids = model.generate(
    input_ids,
    max_length=128,
    min_length=30,
    length_penalty=2.0,
    num_beams=4,
    early_stopping=True
)

# 결과 출력
summary = tokenizer.decode(summary_ids[0], skip_special_tokens=True)
print(summary)

sec = time.time()-start
times = str(datetime.timedelta(seconds=sec))

print(f"소요 시간: {times}")

# 결과
"""
활청한 흡입력과 배터리 걱정없는 사용감, 그리고  배터리 걱정을 안 해도 되는 게  큰 장점이라며  
유선청소기를 사용해보니  만족도가 높아서 놀랐고  앞으로  도움이 될 것 같다.
소요 시간: 0:00:02.618333
"""

 

 

kakaocorp/kanana-nano-2.1b-instruct (경량 LLM)

  • LLM 기반 한국어 텍스트 생성 성능이 우수함
  • 요약된 문장 품질이 매우 좋음
  • 사양에 따라 속도가 많이 느릴 수 있음 (GPU 없는 PC에서 사용 시 3분 이상 소요)
  • 속도를 높이기 위해 모델 입/출력 조정 및 GPU 사용해야함
from transformers import pipeline
import time
import datetime

review = """
유선청소기를 사용한 지 벌써 한 달이 지나가네요. 
요즘 무선청소기가 워낙 대세다 보니 저도 처음엔 “유선은 좀 불편하지 않을까?” 하고 걱정을 많이 했는데, 
막상 써보니 의외로 만족도가 높아서 놀랐습니다. 우선 이 제품은 흡입력이 정말 강력합니다. 
카펫이나 매트에 박혀 있는 머리카락, 미세먼지, 고양이 털까지 깔끔하게 빨아들이는 걸 보고 
“아, 무선은 아직 따라오기 어렵겠구나”라는 생각이 들었어요. 또 청소기를 돌리다가 배터리 걱정을 안 해도 된다는 게 정말 
큰 장점입니다. 예전에 무선청소기 쓸 때는 중간에 충전하느라 청소가 끊기고, 충전 다 될 때까지 기다려야 했는데,
유선은 그냥 전원만 꽂으면 언제든 풀파워라 너무 편하더라고요.\n\n물론 아쉬운 점도 있습니다. 
당연히 선이 있으니까 이동할 때 제약이 있어요. 방을 옮길 때 콘센트를 빼서 다른 데 꽂아야 하는 번거로움이 있고, 
선이 발에 걸리거나 가구에 걸릴 때 가끔 짜증이 납니다. 
그래도 코드 길이가 넉넉하게 나와서 작은 집이나 원룸에서는 큰 불편함 없이 사용할 수 있었고, 
주택이나 큰 집이라면 멀티탭을 활용하면 괜찮겠다는 생각이 들었어요.\n\n무게도 생각보다 가볍고, 
손잡이 그립감이 좋아서 장시간 청소해도 손목이 덜 아팠습니다. 필터 세척도 간편하고 먼지통 비우기도 어렵지 않아서 관리 
측면에서도 합격점이에요. 소음은 어느 정도 있지만, 무선 대비 크게 불편하지 않을 정도라 밤 늦게만 아니면 문제 없었습니다.
\n\n결론적으로 무선청소기에 비해 덜 세련되고 자유롭진 않지만, 강력한 흡입력과 배터리 걱정 없는 사용감 덕분에 실속파에게는 
충분히 추천할 만한 제품이라고 생각합니다. 가격 대비 성능을 따진다면 유선청소기가 오히려 더 합리적인 선택이 될 수도 있다는 걸 
이번에 새삼 깨달았네요. 앞으로도 잘 쓸 것 같습니다!
"""

text = "다음의 상품 리뷰를 한 문장으로 요약해줘 / 리뷰: " + review
messages = [
    {"role": "user", "content": text},
]

start = time.time()

summary = pipeline("text-generation", model = "kakaocorp/kanana-nano-2.1b-instruct")

result_dict = summary(messages)
result_text = result_dict[0]['generated_text'][1]['content']
print(result_text)

sec = time.time()-start
times = str(datetime.timedelta(seconds=sec))
print(f"소요 시간: {times}")

#결과
"""
'유선청소기는 예상보다 높은 흡입력과 배터리 걱정 없는 사용감으로, 무선청소기 대비 실속파에게 추천할 만한 제품으로, 
가격 대비 성능이 우수하다고 평가됩니다.'

소요 시간: 0:03:18.486957
"""

 


감정 분석 모델 테스트

 

beomi/KcELECTRA-base

  • 분류 라벨 이름이 명시적으로 설정되지 않아 바로 사용하기 힘듦
  • 감정 분석을 위한 fine tunning이 따로 필요하여 사용 보류
from transformers import pipeline

sentiment = pipeline("sentiment-analysis", model="beomi/KcELECTRA-base")
sentiment("이 청소기 진짜 좋아요. 흡입력이 강력해요!")

# 결과
# [{'label': 'LABEL_0', 'score': 0.5006399750709534}]
from transformers import AutoModelForSequenceClassification

model = AutoModelForSequenceClassification.from_pretrained("beomi/KcELECTRA-base")
print(model.config.id2label)

#결과
# {0: 'LABEL_0', 1: 'LABEL_1'}

 

 

nlp04/korean-sentiment-analysis

  • beomi/KcELECTRA-base 모델의 fine tuned 버전
  • 10종류의 감정으로 분류 됨
  • 긴 글은 정확도가 떨어지지만 요약된 글이면 결과가 나쁘지 않음
from transformers import pipeline
import time
import datetime


text = """
"이 청소기 진짜 좋아요. 흡입력이 강력해요!"
"""

model_name = "nlp04/korean_sentiment_analysis_kcelectra"
sentiment = pipeline("text-classification", model=model_name)

start = time.time()
print(sentiment(text))

sec = time.time()-start
times = str(datetime.timedelta(seconds=sec))

print(f"소요 시간: {times}")

# 결과
"""
[{'label': '즐거운(신나는)', 'score': 0.4669713079929352}]
소요 시간: 0:00:00.075342
"""

 

 

3.3 선택한 모델

  1. 텍스트 요약 모델
    • kakaocorp/kanana-nano-2.1b-instruct
      • 가벼운 모델은 fine tunning없이 만족스러운 결과를 얻기는 어려움.
      • GPU를 사용한 경량 LLM을 사용해 속도와 성능 모두 만족스러운 결과를 얻기로 함 
      • LG 엑사원 / Naver 하이퍼클로바 경량 LLM도 테스트 예정
  2. 감정 분석 모델
    • nlp04/korean-sentiment-analysis
      • 요약된 글의 감정 분석의 결과가 나쁘지 않음
      • 기본적으로 10종류 감정 분류 결과가 출력되고 있으나. 본 프로젝트에서는 긍정, 중립, 부정으로 매칭해 사용할 예정 

 

 

4. 모델 분석 환경 테스트

4.1 Mac m1 pro

  1. 사양
    • cpu 10 core
    • gpu 16 core
    • ram 16gb
  2. 분석 속도
    • 한 문장 당 8~12초 소요
    •  10개 씩 배치 처리 시 더 느려짐
  3. 테스트 결과
[{'generated_text': [{'role': 'user', 'content': '다음의 상품 리뷰를 64글자 이내의 한 문장으로 
요약해줘 / 리뷰: 가벼운 무선 청소기를 사고 싶어서 검색하다 알아보게 되었어요 샤크라는 브랜드는 
미국에서 생활가전으로 유명하더라구요 마치 우리나라 삼성 브랜드처럼 미쿡에서는 1등 청소기 브랜드라 
사용하기 전부터 믿음이 갔어요 ㅎㅎ 가볍지만 강력하고 쉽게 청소할 수 있다는 소문이 있었는데 과연
어떨지 장단점을 말씀드려 볼게요 구성품 설명서 스테이션 본체 헤드와 틈새용과 이불용 노즐과 무선이라 
리툼 배터리로 구성되어 있어요 조립은 쉽게 세팅할 수 있게 되어 있습니다 디자인 깨끗하고 모던한 느낌의 
디자인과 미스티 화이트 컬러로 어디에 두어도 인테리어 효과가 있어요 또 깔끔하고 고급진 케이스에 담겨 
있어 선물하기도 좋답니다 기능 가볍지만 강력한 기능을 가지고 있는데요 하이브리드 파워 클린핀과 스마트한 
지능형 센서가 탑재되어 있어요 또한 스틱을 구부리는 플랙스 기능이 있어서 구석구석 깨끗히 청소할 수 있습니다. 
깃털같이 가벼운 1.7키로의 경량이라 손목 부담도 적다는 점이 가장 마음에 들었어요 방향 전환도 부드러워서 
핸들링하기 아주 편합니다 저희 집에는 저를 포함해서 중딩이랑 초딩 딸이 있어 머리카락이 엄청 빠지는데요 
그래서 청소기 먼지를 자주 비워줘야해요 샤크 청소기는 자동 먼지 비움 시스템까지 갖추어져 있어 정말 편하게 
해결할 수 있어 좋아요 ㅎㅎ 가볍지만 강력한 청소기에 자동 먼지 비움까지 다 갖추어진 샤크 무선청소기를 
추천드릴게요 도움이 되셨다면 하단의 도움이 돼요를 눌러주시면 감사하겠습니다 쿠팡체험단 이벤트로 상품을 
무료로 제공 받아 작성한 구매 후기입니다.'}, 
{'role': 'assistant', 'content': '샤크 무선 청소기는 가벼우면서도 강력하며, 자동 먼지 비움 기능을 갖춘 
경량 청소기로서 가족 모두의 머리카락 문제를 해결할 수 있어 추천합니다.'}]}]
실행 시간: 0:00:10

 

 

4.2 Computer Engine with GPU

  1. 사양
    • Ubuntu 22.04 LTS (x86_64)
    • cpu 4 core
    • gpu 1 core (nvidia T4)
    • ram 16gb
  2. 분석 속도
    • 한 문장 당 3~4초 소요
    • 10개 씩 배치 처리 시 한 문장 당 1~2초 소요
      (20개 이상 처리 시 Out of memory 발생)
  3. 테스트 결과
Device set to use cuda:0
[{'generated_text': [{'role': 'user', 'content': '다음의 상품 리뷰를 50글자 이하의 한 문장으로 요약해줘 
/ 리뷰: \n청소기가 망가져 급하게 주문했는데 일단 무선은 싫었고 간단하고 가볍고 튼튼한데 흡입력만
강하면 되서 가장 저렴한데 판매량 많은걸로 주문했어요 역시 유선이라 흡입력은 엄청 강해요 강이지랑
같이 살아서 집 바닥이 대부분 매트인데 매트에 척척 달라붙어 힘주어 밀긴 해야하지만 그만큼 흡입력이
좋아요 진짜 그거면 다 된거 아닌가 싶은데 뒷처리가 힘들어요 청소 후 필터 청소 하는데 필터 사이사이에
낀 먼지가 잘 안 털어져요 이거때문에 청소솔 따로 구매해야할듯요 이거 제대로 청소 안하고 그냥 청소기 
돌리면 흡입력도 떨어지거니와 먼지 배출되고 금방 고장나는 원인이 되겠죠 물에 세척이 된다지만 매일 세척 
할 수 는 없잖아요 그리고 물로 세척할땐 필터가 쿠팡에서 6천원대에 판매하던데 여유분 구매해서 번갈아 사용해야할거 
같아요 소음은 큰 편이에요 오금 높이에 바람이 배출되는데 세기가 쎈편이라 먼지 다시 날리지 않도록 유의 해야해요 
다만 앞이나 뒤가 아닌 양옆에 달려 그나마 괜찮습니다\n'}, 
{'role': 'assistant', 'content': '유선 청소기 흡입력 강하지만, 필터 뒷처리가 번거롭고 소음이 크며,
매트 바닥에서 효과가 좋지만 세척이 필요합니다.'}]}]
[INFO] 요약 분석 완료. 소요 시간: 0:00:04.364622

 

4.3 선택한 환경

  1. 개발 환경
    • Mac M1 pro
      • m1 mac pro을 이용해 분석 서버를 만들어 개발 및 테스트 진행
  2. 서비스 환경
    • GCP Computer Engine with GPU
      • GPU 사용 시 가격이 비쌈 (1시간에 0.4~0.5 달러)
      • 최종 서비스 환경에서 분석용 서버를 만들어 사용할 예정

 

 

5. 앞으로 해야할 일

🔍 LLM 추가 테스트

  • LLM 경량 모델 테스트 (LG 엑사원 / 네이버 하이퍼클로바)

🛠️ 데이터 처리

  • Spark 기반 데이터 전처리
  • 모델 인풋 포맷에 맞는 텍스트 정제 및 분류

🌐 Web 구현

  • FastAPI 기반 Backend 서버 구성
  • 간단한 Front 화면 구성 → 분석 결과 시각화 예정

 

 

6. 결론 및 후기

이번 테스트를 통해 텍스트 요약과 감정 분석 모델을 선정했습니다.

 

테스트 한 Kanana 모델은 성능은 우수하지만 속도를 위해 GPU가 필수였고,

KcELECTRA 기반 감정 분석은 속도 및 품질 모두 양호하다는 것을 확인할 수 있었습니다.

 

요약 모델을 테스트 하면서 가벼운 모델은 정밀한 Fine tunning을 거치지 않으면 LLM과 비슷한 수준도 못미치는 걸 알게되었습니다.

이번에는 Kanana 모델만 테스트 했지만 다른 LLM도 사용해보며 속도와 성능을 가장 만족하는 모델을 찾아봐야 겠습니다.

 

다음 포스팅에서는 Spark 기반의 데이터 전처리 및 분석 파이프라인을 다뤄보겠습니다.