멋사 부트캠프

[Project - Howru] (3) 채팅 NLP 기반 사용자 추천 시스템 설계

sagecode 2025. 8. 17. 22:25

채팅 기반 단어장을 바탕으로 사용자 태그 생성 – NLP 기반 사용자 추천 시스템 설계

채팅 기록에서 자동으로 단어장을 생성하고, 이를 주제별 태그로 변환해 사용자 추천까지 이어지는 과정을 설계해본다.

 

아직 실행은 최종 확정이 아니고, 다양한 접근을 시도한 뒤 최적안을 선택할 계획이다.

 

1. 채팅 메시지 수집

  • MongoDB에 채팅 메시지를 저장 - kafka를 이용해 redis 캐싱과 비동기로 처리할 예정
  • 메시지 필드 예시:
{
  "_id": {
    "$oid": "689587cc8e228a315fec3ed6"
  },
  "chatRoomId": "chat_user1_user2",
  "senderId": "user1",
  "receiverId": "user2",
  "message": "Dessert is a must!",
  "timestamp": "2025-08-08T12:08:00Z",
  "read": false
}

2. 단어장 생성

  • NLP 분석기(nlpClient.analyze)를 이용해 메시지를 형태소 분석
  • 불필요한 품사(관사, 조사 등) 제거
  • 결과를 MongoDB에 단어장 저장
  • 현재 'en' 단어장 기반으로만 사용자 태그 생성, 추후 확정 예정
  • 단어장 필드 예시:
{
  "userId": 101,
  "text": "steak",
  "pos": "noun",
  "lang": "en"
}

3. 단어 태그화

  • 단어장을 기반으로 사용자의 관심사를 주제별 태그로 자동 분류
  • 처리 과정:
    • 사전 정의 태그 & 설명
      • 각 태그에 해당하는 설명 문장을 작성하고, 해당 설명을 벡터화(임베딩)하여 의미 공간에 저장
    • 직접 매칭(Exact Match)
      • 단어가 사전에 정의된 키워드와 일치하면 해당 태그에 점수 1.0 즉시 부여
    • 유사도 매칭(Semantic Match)
      • 직접 매칭이 없을 경우, SentenceTransformer를 사용해 단어와 태그 설명 간 코사인 유사도를 계산
      • 상위 3개 태그만 선택하여 순위별 가중치(1.0, 0.5, 0.25)를 곱해 점수 부여
      • 유사도가 임계치(기본 0.2) 미만이면 제외
    • 점수 누적
      • 모든 단어 처리 후 태그별 점수를 합산하여 사용자별 관심사 점수 프로필 생성
{
  "userId": 101,
  "tags": [
    { "name": "디저트 & 음료", "score": 1.25 },
    { "name": "음식 & 요리", "score": 0.75 },
    { "name": "여행 & 관광", "score": 0.50 }
  ]
}