
[Day 9] 일본어 감성 AI(BERT)가 LINE 채팅 기록 8년을 분석하며 드러난 기복
요약
8년 치 LINE 채팅 기록을 로컬 AI 환경에서 분석하여 대화의 흐름과 감정 변화를 시각화한 실험 사례입니다. BERT 기반의 일본어 감성 모델과 Qwen2.5 72B 모델을 활용해 메시지 양과 톤의 추이를 파악했습니다.
핵심 포인트
- BERT 모델을 활용한 일본어 메시지 감성 분석
- Qwen2.5 72B 로컬 모델을 통한 대화 전환점 추론
- DGX Spark를 이용한 데이터 보안 중심의 로컬 분석
- 메시지 양과 어조 변화를 통한 대화 주기 시각화
서론
Day 9입니다. 오늘은 모델 내부 구조에 대한 내용이라기보다는 개인적인 실험에 가깝습니다. 즉, 로컬 AI에게 한 LINE 친구와의 전체 채팅 기록을 분석하게 하는 것입니다. (LINE은 일본의 지배적인 메신저 앱입니다.)
제가 내용을 내보내 보니, 8년이라는 시간이 거기에 있었습니다. 가장 첫 메시지부터 오늘까지 말이죠. 시작했고, 많이 이야기했고, 잠시 조용해졌다가, 다시 활기를 띠었습니다. 그 전체 흐름이 모두 담겨 있습니다.
콘텐츠가 워낙 그렇다 보니, 아무것도 제 컴퓨터를 벗어나지 않았습니다. 모든 것이 제 DGX Spark에서 로컬로 실행되었습니다.
사용한 것: 저희 집 AI 박스 (DGX Spark) + 일본어 감성 모델(톤 분석용) + 더 큰 로컬 모델(숫자만으로 사건 추측용).
오늘 설정
하고 싶었던 것
8년 치 메시지를 하나하나 다시 읽는 것은 현실적이지 않습니다. 그래서 내용을 읽기보다는, 대화의 '형태'에만 집중했습니다. 즉, 언제, 얼마나 많이, 어떤 톤으로 이야기했는지 말입니다.
구체적으로는 다음과 같습니다:
- 월별 메시지 양
- 톤의 추이 (긍정적 / 부정적)
- 그리고 AI에게 '언제 큰 일이 있었는지'를 찾아달라고 요청하는 것입니다.
미리 알려드립니다 (결과)
메시지 수와 톤만으로도, 8년 동안의 흐름이 차트 위에서 명확하게 나타났습니다. 시작하고, 조용해지고, 다시 돌아오는 그 흐름이 제가 아무것도 다시 읽지 않았음에도 눈에 보였습니다.
🔧 파이프라인
LINE 채팅 내보내기 (텍스트)
│
▼
...
채팅 화면에서 '채팅 기록 보내기'를 통해 LINE 채팅을 텍스트로 내보낼 수 있습니다.
데이터 크기:
| 항목 | 값 |
|---|---|
| 기간 | 약 8년 2개월 |
| ... | |
| 15,605개의 스티커... 정말 많습니다. |
두 가지 AI
| 단계 | 모델 | 역할 | 보는 것 |
|---|---|---|---|
| 3. 톤 | 일본어 감성 모델 (koheiduck/bert-japanese-finetuned-sentiment) | 각 메시지의 긍정/중립/부정 점수 산출 | 66k개의 메시지 텍스트 (월별 평균 점수) |
| 4. 전환점 파악 | 더 큰 로컬 모델 (Qwen2.5 72B) |
메시지 양과 어조의 8년 주기
이 차트가 이번 분석의 핵심입니다. 상단은 월별 메시지 수이며, 하단은 어조 (위로 향하면 긍정, 아래로 향하면 부정)를 나타냅니다. x축은 대화가 시작된 이후의 개월 수입니다. (축 레이블은 일본어로 되어 있습니다.)
그래프를 그려보면, 이는 꾸준한 상승이나 평탄한 직선이 아니라 명확하게 "장(chapters)"으로 나뉩니다: 급증(ramp-up) → 8개월간의 침묵 → 두 번째 정점 → 안정적인 고원(plateau). 한눈에 봐도 네 가지 단계로 구분됩니다.
어조(Tone)는 대화 시작 시점과 대화가 재개된 시점 부근에서 약 +0.6의 두 개의 정점을 보입니다 (전체 평균 ≈ 0, 후반부 몇 년간은 약간 부정적). 흥미로운 부분은, 침묵이 찾아오기
직전 달에 어조가 이미 −0.1로 떨어졌다는 점입니다. 메시지 양이 줄어들기 전에 분위기가 먼저 어두워졌습니다.
부정적인 어조로 떨어지는 구간은 두 번 있습니다. 침묵 전의 하락은 하나의 "징조(omen)"였습니다. 다른 하나는 최근 몇 년간의 하락인데, 이는 징조라기보다는 물류/일정 관련 메시지("몇 시에 집에 와?")가 쌓이면서 나타난 결과입니다.
💡 미니 노트: "어조"를 어떻게 숫자로 변환하나요?
점수 산출은 일본어 감성 모델 (sentiment model)을 통해 이루어집니다. 대략적인 과정은 다음과 같습니다:
- 긍정/부정으로 라벨링된 방대한 일본어 텍스트로 사전 학습 (pre-trained)
- 단순히 키워드를 찾는 것이 아니라 문맥 (context)을 통해 판단
- 메시지당 "긍정성" / "부정성"의 확률을 반환
- 저는 그 차이를 메시지당 점수로 사용했습니다
어떤 종류의 메시지가 어떤 점수를 받았나?
실제 판단 사례 몇 가지 (이름과 장소를 제외한 짧은 한 문장들):
| 메시지 | 판결 |
|---|---|
| 「楽しかったね!」 (즐거웠어!) | 긍정 (Positive) |
| ... |
단순히 즐거운 문구는 긍정 점수를 받고, 일정 관련 메시지("좋은 아침", "벌써 집에 왔어?")는 중립(neutral) 점수를 받으며, 피로나 짜증은 부정(negative) 점수를 받습니다. 길고 사무적인 계획 메시지조차 중립 쪽으로 기웁니다.
대화는 주로 아침에 이루어진다
요일 × 시간대별 메시지 밀도 (밝을수록 많음).
오전 7~9시 사이에 뚜렷한 집중 현상이 나타납니다!
AI가 전환점을 맞출 수 있을까?
먼저, 간단한 방법부터 시도했습니다. 메시지 양이 급증하거나 급감한 지점을 기계적으로 추출한 뒤, 실제 타임라인과 대조해 보았습니다.
| 실제 사건 | 자동 감지된 시점 |
|---|---|
| 시작된 시점 | 정확히 일치 |
| ... |
급격한 양적 변화는 정확히 잡아냈습니다. 하지만 "인생의 큰 이정표(milestone)"는 놓쳤습니다. 그래서 _동일한 수치_를 더 큰 로컬 모델 (local model)에 보여주며 "무슨 일이 있었나요?"라고 물었더니 다음과 같은 답변을 받았습니다.
- "시작될 무렵" → 대략적으로 일치
- "침묵이 이어지는 구간" → 조용했던 시기와 일치
- "인생의 큰 변화" → 실제 이정표 직전과 거의 정확히 일치
단일 스파이크(spike)를 찾아내는 대신, 전체 수치 시퀀스를 하나의 "흐름(flow)"으로 읽어내기 때문에, 수치 변화가 거의 없는 사건조차 포착할 수 있었습니다.
💡 시사점 (Takeaways)
1. 양(Volume)과 어조(Tone)만으로도 흐름을 드러낼 수 있다
메시지 양과 어조만으로도 8년간의 형태를 파악하기에 충분했습니다. 침묵은 조용한 구간을 나타내고, 급증은 다시 대화가 재개됨을 나타냅니다. 차트에서 바로 확인이 가능합니다.
2. 로컬 모델은 숫자에서 이야기를 읽어낸다
월별 수치만 제공되었음에도 불구하고, 모델은 거의 보이지 않는 사건("이 근처에 큰 일이 있었음")까지 추론해냈으며, 이는 실제 상황과 일치했습니다. 모델은 흩어진 점들을 하나의 흐름으로 연결합니다.
3. "부정적인" 어조가 반드시 관계의 악화를 의미하지는 않는다
후반부에 나타난 약간의 부정적인 편향은 사이가 나빠졌음을 의미하는 것이 아닙니다. 일정 관련 메시지("몇 시에 집에 와?")는 점수가 높게 나오지 않습니다. 낮은 점수 ≠ 갈등이 아닙니다. 감성 분석 (sentiment analysis)이 부족한 것이 아니라, 점수를 맥락 (context)과 함께 읽어야 합니다.
🛠️ 기술적 세부 사항 (Technical details)
파싱 및 집계 (Parsing & aggregation)
- LINE 내보내기 형식(export format)은 날짜 헤더와
시간<TAB>이름<TAB>텍스트로 구성됩니다. 여러 줄로 된 메시지(4,987개)는 이전 메시지로 다시 병합되었습니다. - 화자는 메시지 수에 따라 "A / B"로 정규화되었습니다(공개된 자료에는 실제 이름을 사용하지 않음). 임시 그룹 멤버와 시스템 메시지는 제외되었습니다.
- 메시지는 유형(텍스트 / 스티커 / 사진 / 통화 / 전송 취소 등)별로 태그가 지정되었습니다. 어조(Tone) 분석에는 텍스트만 사용하였고, 메시지 양(volume) 계산에는 모든 유형을 포함했습니다.
- 집계 및 시각화는 Python(pandas / matplotlib)을 사용했습니다.
어조 (Tone/sentiment)
- 3개 클래스(긍정 / 중립 / 부정)를 가진 일본어 모델인
koheiduck/bert-japanese-finetuned-sentiment를 사용했습니다. - 66,329개의 텍스트를 GPU에서 배치(batch) 단위로 점수화했습니다. 메시지당 P(긍정) − P(부정) 값을 [-1, +1] 범위로 산출한 뒤, 월별로 평균을 내었습니다.
전환점 탐지 (Turning-point detection)
- 규칙 기반(Rule-based): 수치 데이터만을 바탕으로 0에 가까운 긴 구간(침묵), 월간 급증, 어조의 정점 등을 탐지했습니다.
- 추가 사항: 월별 메시지 수 테이블과 어조 점수를 더 큰 로컬 모델(ollama를 통한 Qwen2.5-72B)에 입력하여 사건을 추측하도록 했습니다. 이때 메시지 텍스트는 제공하지 않았습니다.
- 실제 사건 날짜는 주석 달기 및 정답 확인 용도로만 로컬 노트에 보관되었습니다.
개인정보 보호 (Privacy)
- 메시지 텍스트가 포함된 모든 파일(원시 내보내기 데이터, 파싱된 데이터, 점수)은 비공개 폴더에 보관됩니다.
- 집계된 수치와 차트만 공개됩니다. 차트의 x축은 실제 날짜를 숨기기 위해 "대화 시작 후 경과 월수"로 상대화되었습니다.
- 점수 산출 예시로 보여주는 이름과 장소가 없는 짧은 한 줄 문장들을 제외하고, 기사나 차트에는 대화 내용, 실제 이름, 특정 날짜 또는 긴 텍스트가 나타나지 않습니다.
내일: Day 10
일기예보에서는 한 가지 온도를 말하지만, 사람마다 느끼는 체감은 다릅니다. 온도는 같아도 "코트를 입어야 할까?"에 대한 답은 다르죠. 그래서 다음 단계로 저만의 개인용 "기상 담당관" AI를 만들 예정입니다. 과거 날씨 데이터를 바탕으로 매일 아침 "오늘은 코트와 비니가 필요합니다"와 같은 정보를 알려줄 것입니다. 앞으로 100일 동안 이 AI에게 저만의 추위 감각을 가르칠 예정이며, 이는 더 긴 프로젝트의 시작이 될 것입니다.
100ExperimentsWithDGX #LocalLLM
AI 자동 생성 콘텐츠
본 콘텐츠는 Dev.to AI tag의 원문을 AI가 자동으로 요약·번역·분석한 것입니다. 원 저작권은 원저작자에게 있으며, 정확한 내용은 반드시 원문을 확인해 주세요.
원문 바로가기