채팅 기반 단어장을 바탕으로 사용자 태그 생성 – 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 }
]
}
'멋사 부트캠프' 카테고리의 다른 글
[Project - Howru] (2) ChatRoom Domain 구현 (2) | 2025.08.11 |
---|---|
[Project - Howru] (1) 프로젝트 기획 (2) | 2025.08.03 |
[멋사 부트캠프] 프로젝트 시작 (1) | 2025.07.09 |
[멋사 부트캠프] Day10 - ThreadLocal (0) | 2025.06.30 |
[멋사 부트캠프] Day09 - 예외처리 및 로그분석(ELK) (0) | 2025.06.28 |