8주차: 문장 임베딩과 텍스트 유사도
문장 임베딩과 텍스트 유사도.
□ 이번 주에 하는 일
- 문장과 문서를 벡터로 바꾸는 두 방법, TF-IDF와 문장 임베딩 모델을 본다
- 관광 안내 문서로 검색기를 만들고, 같은 질문을 다르게 물었을 때 결과가 갈리는 이유를 찾는다
- 내가 만든 “같은 뜻 다른 표현” 문장쌍으로 단어 단위 유사도와 문장 단위 유사도의 차이를 확인한다
안내소에 질문 카드가 놓이면 가장 알맞은 안내 책자부터 꺼내 앞에 놓는다. 검색기가 하는 일이 이것이다. 이번 주는 컴퓨터가 “가장 알맞은”을 어떻게 재는지 본다.
□ 7주차에서 이어지는 자리
6주차와 7주차에는 단어를 벡터로 바꿨다. 이번 주에는 문장과 문서를 벡터로 바꾼다. 비교하는 방법은 같다. 6주차의 코사인 유사도로 두 벡터가 같은 방향을 보는지 잰다.
| 6~7주차 | 8주차 | |
|---|---|---|
| 벡터로 바꾸는 것 | 단어 | 문장, 문서 |
| 비교 | 코사인 유사도 | 코사인 유사도 |
| 쓰임 | 비슷한 단어 찾기 | 질문에 맞는 문서 찾기(검색), 두 문장의 유사도 |
□ 이 문서를 읽는 법
- 수식은 한 개도 나오지 않는다
- 관광 안내 문서 12개와 질문은 설명용 예시다. 실제 운영 정보는 공식 안내를 확인한다
- 표와 그림의 점수는 노트북과 같은 문서, 같은 설정에서 계산한 값이다. 소수 둘째 자리로 반올림했다
- 문장 임베딩은 공개 다국어 모델 paraphrase-multilingual-MiniLM-L12-v2(Apache-2.0)로 계산했다
- 계산을 손으로 하지 않는다. 이번 주에 요구하는 것은 검색 결과를 읽고 어디서 왜 틀렸는지 설명하는 능력이다
온라인 (2시수)
Section titled “온라인 (2시수)”강의 1: 문서를 벡터로 바꾸고 검색하기
Section titled “강의 1: 문서를 벡터로 바꾸고 검색하기”□ 검색기는 무엇을 하나
검색기가 하는 일은 세 단계다.
- 문서마다 벡터로 바꿔 둔다
- 질문이 들어오면 질문도 같은 방식으로 벡터로 바꾼다
- 질문 벡터와 문서 벡터마다 코사인 유사도를 재서, 높은 순서로 보여 준다
어려운 것은 1번과 2번, 즉 “문장을 어떤 벡터로 바꾸느냐”다. 이번 주는 두 가지 방법을 비교한다.
□ 출발점: 단어 가방
가장 쉬운 방법은 5주차의 단어 가방이다. 문서를 단어 칸의 숫자로 바꾸고, 칸에는 그 단어가 나온 횟수를 쓴다. 그런데 횟수만 쓰면 문제가 있다. 수, 있다 처럼 여러 문서에 나오는 말이 문서의 특징처럼 대접받는다. 2주차에 본 불용어 문제와 같은 뿌리다.
□ 흔한 단어를 깎는 TF-IDF
해변의 자갈은 수천 개지만 어느 자갈도 이 해변을 다른 해변과 구별해 주지 않는다. 불가사리 한 마리가 이 자리를 알려 준다. 문서도 같다. 어디에나 나오는 말보다 이 문서에만 나오는 말이 문서의 특징이다.
TF-IDF는 이 생각을 점수로 만든다. 두 값을 곱한다.
- TF: 이 문서에 그 단어가 몇 번 나왔나. 많이 나올수록 크다
- IDF: 그 단어가 문서 몇 개에 나오나. 여러 문서에 흔하게 나올수록 작다
노트북의 2번 문서 “성산일출봉은 해가 뜨기 전에 올라가면 정상에서 일출을 볼 수 있다”를 보자. 횟수로 세면 열 단어가 모두 1번이다. TF-IDF로 바꾸면 달라진다.
| 단어 | 나오는 문서 수(12개 중) | IDF | 2번 문서의 TF-IDF |
|---|---|---|---|
수, 있다 | 5개 | 1.77 | 0.21 |
성산일출봉은, 일출을 등 | 1개 | 2.87 | 0.34 |
흔한 수 와 있다 는 깎이고, 이 문서에만 나오는 말이 남는다. 불용어 목록을 따로 만들지 않아도 흔한 말의 상대적 가중치가 약해진다. 다만 이번 구현의 IDF는 모든 문서에 있는 말도 0으로 지우지는 않는다. 마지막에 벡터 길이를 맞추므로 단순히 반복 횟수만 늘린다고 점수가 커지지 않지만, 새 낱말을 추가하면 방향과 검색 순위는 달라질 수 있다.
□ 검색해 보기, 그리고 띄어쓰기의 함정
노트북 1-3은 TF-IDF로 검색기를 만들고 두 질문을 넣는다.
| 질문 | 1위 문서 | 점수 |
|---|---|---|
| 우도에 가는 배를 타려면 | 3번 “우도에 가려면 성산포항에서 배를 타고 들어가야 한다” | 0.53 |
| 우도 가는 배 | 없음. 모든 문서가 0점 | 0.00 |
두 질문은 뜻이 같다. 그런데 두 번째 질문은 아무것도 찾지 못했다. 문서에는 우도에, 배를 처럼 조사가 붙어 있고, 질문은 우도, 배 다. 띄어쓰기 단위로 자르면 겹치는 단어가 하나도 없다. 2주차부터 따라온 조사 문제가 검색에서는 “아예 못 찾음”으로 나타난다.
□ 고치기 1: 글자 조각으로 자르기
노트북 1-4는 단어를 두세 글자 조각으로 잘라 TF-IDF를 다시 만든다. 우도에 는 우도, 도에, 우도에 같은 조각으로 나뉘어 질문의 우도 와 조각을 나눠 가진다.
우도 가는 배를 다시 검색하면 3번 문서가 0.27로 1위다- 조사가 달라도 앞쪽 조각이 겹치므로 한국어에 잘 맞는 손쉬운 처방이다
- 대신 엉뚱한 조각이 겹치기도 한다. “제주 전통 음식”을 넣으면
제주가 겹치는 11번(해녀박물관)을 고른다
4주차의 형태소 분석으로 조사를 떼어 내는 것도 같은 문제를 푸는 방법이다. 글자 조각은 분석기 없이 바로 쓸 수 있다는 것이 장점이다.
□ 강의 1에서 꼭 가져갈 것
- 검색기는 질문과 문서를 같은 방식으로 벡터로 바꾸고 코사인 유사도로 순서를 매긴다
- TF-IDF는 이 문서에 자주 나오면서 다른 문서에는 드문 단어에 높은 점수를 준다. 흔한 말은 저절로 약해진다
- 띄어쓰기 단위 TF-IDF는 조사가 다르면 겹치는 단어가 없어 같은 뜻의 질문도 놓친다
- 글자 조각으로 자르면 조사 문제가 크게 줄지만, 엉뚱한 조각이 겹치기도 한다
강의 2: 문장 임베딩과 같은 뜻 다른 표현
Section titled “강의 2: 문장 임베딩과 같은 뜻 다른 표현”□ 단어 단위 유사도와 문장 단위 유사도
TF-IDF는 단어나 글자 조각이 겹쳐야 비슷하다고 본다. 이것을 표면형 겹침 유사도라고 하자. 이 문서의 단어 단위는 단어 벡터끼리의 유사도가 아니라, 문서 속 낱말이 겹치는 정도를 뜻한다. 겹치는 낱말이 없으면, 뜻이 같아도 0이다.
사람은 다르게 판단한다. “우도 가는 배는 어디서 타요”와 “우도행 배편 타는 곳”은 겹치는 낱말이 거의 없지만 같은 것을 묻는다. 문장 전체의 뜻을 비교하는 것을 문장 단위 유사도라고 하자. 이번 주의 목표는 두 유사도가 어디서 갈리는지 보는 것이다.
□ 단어 벡터를 모으면 문장 벡터가 될까
7주차의 단어 벡터를 쓰면 쉬운 방법이 하나 있다. 문장에 든 단어 벡터들을 평균하는 것이다. 낱말이 달라도 비슷한 단어끼리는 벡터가 가까우므로, 단어 단위보다는 낫다.
그러나 평균은 순서를 잊는다. “안 먹고 잤다”와 “먹고 안 잤다”는 똑같은 단어 세 개로 이루어져 평균이 완전히 같지만, 하나는 굶고 잔 것이고 하나는 먹고 깨어 있던 것이다. 5주차 단어 가방이 순서를 버린 것과 같은 한계다. 그래서 문장을 통째로 보고 벡터를 만드는 모델이 따로 있다.
□ 문장 임베딩 모델
문장 임베딩 모델은 문장 전체를 벡터 하나로 바꾼다. 노트북이 쓰는 공개 다국어 모델은 문장마다 384칸짜리 벡터를 만든다. 이 모델은 같은 뜻의 문장쌍은 가깝게, 다른 문장은 멀게 두도록 미리 학습되었다. 모델 안에서는 9주차에 배울 트랜스포머가 문장의 단어들을 서로 견주며 읽는다.
노트북 1-5에서 우도 가는 배 를 넣으면 3번 문서가 0.75로 1위다. 낱말이 겹치지 않아도 뜻으로 찾는다.
□ 같은 질문을 다르게 물으면
여행자는 같은 것을 여러 방식으로 묻는다. 노트북 1-6은 질문 다섯 개를 세 방법으로 검색한다. 앞의 우도 가는 배 까지 질문 여섯 개를 나란히 놓으면 이렇다.
| 질문 | 정답 문서 | 단어 TF-IDF | 글자 조각 | 문장 임베딩 |
|---|---|---|---|---|
| 우도 가는 배 | 3번 | 찾지 못함 | 3번 (0.27) | 3번 (0.75) |
| 공항에서 시내까지 어떻게 가나요 | 1번 | 찾지 못함 | 1번 (0.41) | 12번 (0.74) |
| 제주시로 가는 교통편 | 1번 | 찾지 못함 | 12번 (0.29) | 12번 (0.84) |
| 비 올 때 갈 만한 곳 | 5번 | 찾지 못함 | 5번 (0.11) | 5번 (0.87) |
| 아이랑 놀기 좋은 바다 | 10번 | 찾지 못함 | 10번 (0.31) | 10번 (0.82) |
| 제주 전통 음식 | 7번 | 11번 (0.34) | 11번 (0.20) | 7번 (0.77) |
정답 수는 단어 TF-IDF 0개, 글자 조각 4개, 문장 임베딩 4개다. 굵은 글씨가 틀린 1위다. 표에서 세 가지를 읽을 수 있다.
- 단어 TF-IDF는 거의 다 놓친다. 조사와 어미가 다르거나(
비 올 때/비가 오는) 낱말 자체가 달라(바다/해수욕장은) 질문과 문서에 똑같은 모양의 낱말이 없다 - 글자 조각과 문장 임베딩은 같은 수를 맞혔지만 틀린 질문이 하나만 겹친다. 둘 다 “제주시로 가는 교통편”을 틀렸다. 나머지는 서로 다르다. 글자 조각은 “제주 전통 음식”에서
제주가 겹치는 엉뚱한 문서를 고르고, 문장 임베딩은 그 질문에서 고기국수 문서를 찾는다 - 문장 임베딩도 틀린다. “공항에서 시내까지”에는 공항과 가까운 숙소를 말하는 12번을 0.74로 고르고, 정답 1번은 0.73으로 아깝게 2위다. 주제가 비슷한 문서끼리는 점수 차이가 아주 작다
□ 같은 뜻 다른 표현 문장쌍
검색 대신 두 문장을 직접 견주어 보자. 노트북의 TODO 셀이 하는 일이다.
| 문장쌍 | 사람이 보기에 | 단어 TF-IDF | 글자 조각 | 문장 임베딩 |
|---|---|---|---|---|
| 우도 가는 배는 어디서 타요 / 우도행 배편 타는 곳 | 같은 뜻 | 0.00 | 0.17 | 0.91 |
| 공항에서 시내까지 어떻게 가나요 / 제주시로 가는 교통편을 알려 주세요 | 같은 뜻(제주공항 출발 상정) | 0.00 | 0.04 | 0.42 |
| 한라산에 오르고 싶다 / 한라산 등반 예약 방법 | 관련 있음 | 0.00 | 0.16 | 0.69 |
| 고기국수 맛집 추천 / 고기국수 맛있는 식당 | 같은 뜻 | 0.27 | 0.37 | 0.43 |
| 오늘 날씨가 좋다 / 오늘 날씨가 좋지 않다 | 반대 뜻 | 0.55 | 0.66 | 0.52 |
- 첫 쌍에서 단어 TF-IDF(0.00)와 문장 임베딩(0.91)의 수치 차이가 가장 크다. 이 차이는 해석할 관찰값이며, 서로 다른 방식의 점수 차이를 정확도 향상량으로 읽지는 않는다. 낱말을 바꿔 말한 같은 뜻을 문장 임베딩이 잡아낸다
- 마지막 쌍은 뜻이 반대인데 세 점수가 모두 높다. 낱말이 거의 같기 때문이다. 문장 임베딩도 0.52로, 같은 뜻으로 상정한 둘째 쌍(0.42)보다 높다. “않다” 하나로 뒤집히는 뜻은 문장 임베딩에도 어렵다
- 문장 임베딩의 점수는 “같은 뜻일 확률”이 아니다. 주제와 표현이 얼마나 비슷한가에 가깝다. 0.5가 넘어도 같은 뜻이 아닐 수 있다
○ 사람이 매긴 점수로 확인하기
문장 유사도 모델이 잘 맞히는지 확인하려면 사람이 점수를 매긴 문장쌍이 필요하다. 한국어로는 KLUE-STS가 대표적이다. 문장쌍마다 사람이 0점(전혀 다름)부터 5점(같은 뜻)까지 매겨 둔 공개 자료다(CC BY-SA 4.0). 이번 주 노트북에서 쓰지는 않지만, 모델의 점수가 사람의 점수와 얼마나 함께 움직이는지 재는 데 쓴다.
둘째 쌍에서 출발지는 첫 문장에만 있다. 두 문장을 같은 뜻으로 보는 것은 제주공항에서 출발한다는 수업용 상황의 상정이며 문장 자체의 완전한 동의 관계는 아니다. 같은 주제인지, 같은 요구인지, 조건까지 같은지 나누어 읽어야 한다.
□ 검색 결과가 기대와 다를 때 고칠 수 있는 것
같은 집에 이르는 길은 여럿이다. 같은 뜻에 이르는 표현도 여럿이다. 검색기가 한 길만 알면 다른 길로 온 질문을 놓친다. 원인에 따라 고칠 곳이 다르다.
| 틀린 원인 | 고치는 방법 |
|---|---|
| 조사와 어미가 달라 낱말이 겹치지 않는다 | 형태소 분석으로 조사 떼기(4주차), 글자 조각으로 자르기 |
| 낱말 자체가 다르다(배 / 배편, 교통편 / 버스) | 같은 뜻 낱말 목록 만들기, 문장 임베딩 쓰기 |
| 질문을 이해하려면 지역 지식이 필요하다(공항 / 제주시) | 문서에 예상 질문이나 다른 표현을 덧붙여 두기 |
| 방법마다 틀리는 곳이 일부 다르다 | 낱말 점수와 문장 임베딩 점수를 함께 쓰기 |
| 부정이나 조건처럼 한 낱말로 뜻이 뒤집힌다 | 규칙으로 보완하기, 중요한 답은 사람이 확인하기 |
표의 넷째 줄은 앞의 결과에서 바로 나온다. 글자 조각과 문장 임베딩은 각각 4개씩 맞혔고, 둘 다 틀린 질문은 “제주시로 가는 교통편” 하나다. 나머지 틀린 질문은 서로 달라서, 글자 조각이 놓친 “제주 전통 음식”은 문장 임베딩이, 문장 임베딩이 놓친 “공항에서 시내까지”는 글자 조각이 맞혔다. 이는 두 방법을 함께 시험할 근거다. 다만 점수를 단순히 더하면 정확도가 좋아진다는 증거는 아니다. 결합 방식과 별도 질문 목록으로 다시 확인해야 한다. 둘 다 놓친 질문은 문서에 예상 질문을 덧붙이는 식의 다른 처방이 필요하다.
□ 왜 지금 이것을 배우는가
- 검색은 큰 언어모델이 바깥 문서를 찾아 읽고 답하게 하는 방식의 첫 단계다. 그 방식은 후속 과목에서 다룬다
- 문장 임베딩 모델 안에서 일하는 트랜스포머를 9주차부터 본다. 7주차의 “단어 하나에 벡터 하나”와 달리, 문맥을 읽고 벡터를 만든다
- 어떤 방법을 쓰든 질문을 바꿔 물어 보고, 틀린 결과의 원인을 찾는 습관은 그대로 쓰인다
□ 강의 2에서 꼭 가져갈 것
- 단어 단위 유사도는 낱말이 겹쳐야 높고, 문장 단위 유사도는 낱말이 달라도 뜻이 비슷하면 높다
- 단어 벡터의 평균은 쉽지만 순서를 잊는다. 문장 임베딩 모델은 문장 전체를 보고 벡터를 만든다
- 질문 6개에서 단어 TF-IDF 0개, 글자 조각 4개, 문장 임베딩 4개를 맞혔다. 두 방법이 함께 틀린 질문은 하나뿐이다
- 문장 임베딩도 틀린다. 주제가 비슷한 다른 문서를 고르고, 뜻이 반대인 문장쌍(0.52)을 같은 뜻의 문장쌍(0.42)보다 가깝게 둔다
- 틀린 원인에 따라 고칠 곳이 다르다. 조사, 낱말, 지역 지식, 부정을 나눠 본다
□ 활동: 같은 뜻 다른 표현 문장쌍 세 개 만들기
제주 여행과 관련된 같은 뜻 다른 표현 문장쌍 세 개를 만들어 제출한다.
| 번호 | 문장 A | 문장 B | 어떻게 바꿨나 |
|---|---|---|---|
| 1 | |||
| 2 | |||
| 3 |
- 세 쌍을 서로 다른 방식으로 바꿔 본다. 낱말을 다른 말로 바꾸기, 조사와 어미만 바꾸기, 어순을 바꾸기, 질문을 명사구로 줄이기 등
- 만든 쌍은 대면 시간에 노트북 TODO 셀에 넣어 세 점수를 잰다
- 정답이 있는 활동이 아니다. 어떤 바꾸기에서 단어 단위와 문장 단위가 갈릴지 예상해 두면 대면 시간이 더 재미있다
대면 (1시수)
Section titled “대면 (1시수)”노트북 돌려 보기
Section titled “노트북 돌려 보기”□ 노트북에서 하는 일
관광 안내 문서 12개로 TF-IDF 검색기를 만들고, 글자 조각과 문장 임베딩으로 고쳐 본 뒤, 내 문장쌍의 유사도를 잰다. 손대지 않아도 끝까지 돌아가고, TODO는 문장쌍을 바꾸는 한 곳뿐이다.
- 문서 12개를 본다 (1-1)
- TF-IDF로 문서를 벡터로 바꾼다. 87칸이다.
수,있다의 IDF가 낮은지 본다 (1-2) - 검색기를 만들고
우도에 가는 배를 타려면과우도 가는 배를 검색한다 (1-3) - 글자 조각 TF-IDF로 다시 검색한다. 491칸이다 (1-4)
- 문장 임베딩 모델을 내려받아 검색한다. 처음에는 모델 다운로드 시간이 필요하며 네트워크에 따라 수 분 이상 걸릴 수 있다 (1-5)
- 질문 다섯 개를 세 방법으로 검색해 표로 본다 (1-6)
- TODO에서 내 문장쌍의 세 점수를 잰다 (2)
□ 출력 읽는 법
- 1-2. 2번 문서의 단어별 점수에서
수와있다가 0.21로 맨 아래에 있는지 확인한다 - 1-3. 두 번째 질문은 “모든 문서가 0점”이라고 나온다. 고장이 아니라 겹치는 단어가 없다는 뜻이다
- 1-6. 단어 TF-IDF 칸은 “제주 전통 음식”만 빼고 모두 “찾지 못함”이다. 문장 임베딩 칸에서 “공항에서 시내까지”가 12번을 고른 것을 찾는다
- TODO. 기본값 문장쌍은 단어 TF-IDF 0.00, 글자 조각 0.17, 문장 임베딩 0.91이 나온다
□ 자주 막히는 지점
| 증상 | 원인 | 조치 |
|---|---|---|
ModuleNotFoundError: No module named 'sentence_transformers' | 설치 셀을 건너뛰었거나 런타임이 끊겼다 | 설치 셀부터 다시 실행한다 |
| 1-5에서 “모델을 불러오지 못했습니다” | 인터넷 연결이 끊겼거나 내려받기가 막혔다 | 잠시 뒤 1-5를 다시 실행한다. 그동안 TF-IDF 결과는 그대로 볼 수 있다 |
| 1-5가 오래 걸린다 | 처음 실행이라 모델을 내려받고 있다 | 기다린다. 두 번째부터는 빠르다 |
NameError: name 'docs' is not defined | 런타임이 다시 시작되어 위 셀의 결과가 사라졌다 | 메뉴에서 모두 실행을 누르거나 위에서부터 다시 실행한다 |
SyntaxError | 문장을 바꾸다 따옴표를 지웠다 | sentence_a = "..." 처럼 따옴표 한 쌍 안에 문장을 넣는다 |
중간 프로젝트 안내
Section titled “중간 프로젝트 안내”중간 프로젝트는 프롬프트 엔지니어링 미니 프로젝트다. 보고서와 발표로 평가하고 성적의 20%다. 10주차에 진행을 점검하고 12주차에 수행 결과를 발표한다. 구체적인 주제와 진행 방식은 대면 시간에 안내한다.
- 기본: 기본 질문과 문장쌍에서 세 방법의 결과 차이 한 건 설명
- 심화: 같은 TODO 한 곳에서 부정·조건이 달라진 문장쌍을 비교하고, 비슷한 주제와 같은 요구의 차이 설명
[이론] 단어 단위 유사도와 문장 단위 유사도의 차이를 학생이 만든 문장쌍으로 확인
- 온라인 학습활동에서 만든 문장쌍 세 개의 세 점수를 표로 정리한다
- 단어 단위(단어 TF-IDF)와 문장 단위(문장 임베딩) 점수가 가장 크게 갈린 쌍을 고르고, 어떻게 바꿨기 때문인지 설명한다
- 점수를 맞히는 것이 아니라, 두 유사도가 갈린 이유를 바꾸기 방식으로 설명했는지로 채점한다
[구현] 간단한 문서 검색기를 데모 따라 구축하고 자신이 만든 문장쌍으로 검증
- 노트북을 처음부터 끝까지 실행하고 1-6의 표를 옮긴다
- TODO 셀에 내 문장쌍 세 개를 하나씩 넣고 세 점수를 기록한다
- 코드가 돌지 않아도 무엇을 확인하려 했는지 쓰면 부분 점수를 받는다
[실무] 검색 결과가 기대와 다를 때 무엇을 고칠 수 있는지 정리. 관광 정보 검색에서 같은 질문을 다르게 물었을 때 결과가 갈리는 사례로 확인. 중간 프로젝트 주제 안내
- 1-6의 표에서 틀린 결과 하나를 골라, 강의 2의 “고칠 수 있는 것” 표에서 어느 원인에 해당하는지 고른다
- 관광 안내 검색을 운영한다면 어떤 질문을 미리 모아 두어야 할지 세 개 적는다
- 고친 결과가 아니라 원인을 맞게 짚었는지로 채점한다
자주 하는 오해 Q&A
Section titled “자주 하는 오해 Q&A”Q1. 문장 임베딩이 있으면 TF-IDF는 쓸모없는가?
아니다. TF-IDF는 빠르고, 왜 그 문서를 골랐는지 겹친 낱말로 설명할 수 있다. 상품 번호나 지명처럼 정확히 그 낱말이 들어간 문서를 찾을 때는 오히려 더 믿을 만하다. 이번 주 표에서도 두 방법은 틀리는 곳이 달랐다. 실제 검색 서비스는 두 점수를 함께 쓰는 경우가 많다.
Q2. 문장 임베딩 점수가 높으면 같은 뜻인가?
꼭 그렇지 않다. 문장 임베딩의 점수는 주제와 표현이 얼마나 비슷한가에 가깝다. “날씨가 좋다”와 “날씨가 좋지 않다”는 뜻이 반대인데 0.52가 나왔고, 제주공항 출발로 상정한 “공항에서 시내까지 어떻게 가나요”와 “제주시로 가는 교통편을 알려 주세요”(0.42)보다 높다. 점수만으로 같은 뜻을 판정하지 말고, 중요한 쓰임에서는 사람이 확인하거나 규칙을 덧붙인다.
Q3. 글자 조각으로 자르면 항상 더 좋은가?
아니다. 조사 문제는 줄지만 엉뚱한 조각이 겹치는 문제가 생긴다. “제주 전통 음식”을 넣으면 제주 조각이 겹치는 해녀박물관 문서를 고른다. 조각이 많아져 벡터도 길어진다. 노트북에서 단어 칸은 87개, 글자 조각 칸은 491개다.
Q4. 문장 임베딩 모델은 어떻게 같은 뜻을 아는가?
학습 덕분이다. 같은 뜻의 문장쌍은 벡터를 가깝게, 다른 문장은 멀게 두도록 많은 문장쌍으로 미리 학습한다. 7주차 Word2Vec이 “이웃 맞히기”로 단어 벡터를 배웠다면, 문장 임베딩 모델은 “같은 뜻 문장쌍 가리기”로 문장 벡터를 배운다. 뜻을 이해한다기보다 학습한 문장쌍과 비슷한 판단을 흉내 낸다. 실제로 이번 주 표에서도 부정이나 지역 지식이 필요한 판단에서 흔들렸다.
Q5. 5주차의 문서 분류와 이번 주의 검색은 무엇이 다른가?
둘 다 문서를 벡터로 바꾼다. 분류는 정해진 클래스 중 하나(긍정, 부정)를 고르고, 이를 위해 정답이 붙은 학습 자료로 점수를 학습한다. 검색은 문서 목록 중 질문과 가까운 것을 고르고, 기본 형태는 따로 학습하지 않고 유사도만 잰다. 그래서 검색기는 문서가 새로 늘어나도 정답을 붙여 다시 학습할 필요가 없다. 문장 임베딩 검색은 새 문서의 벡터만 더하면 되고, TF-IDF는 IDF와 단어 칸 목록이 바뀌므로 문서 전체로 다시 계산한다.
Q6. 단어 벡터를 평균하면 왜 순서를 잊는가?
평균은 더한 뒤 나누는 계산이라 더하는 순서와 상관없이 결과가 같다. “안 먹고 잤다”와 “먹고 안 잤다”는 같은 단어 세 개로 이루어져 평균이 완전히 같다. 안 이 어느 단어 앞에 있는지가 뜻을 정하지만 평균에는 담기지 않는다. 한국어는 조사가 역할을 알려 주어 순서 문제가 영어보다 덜하지만, 이런 문장은 평균으로 가를 수 없다. 문장 임베딩 모델은 단어들을 서로 견주며 읽어 이 한계를 줄인다.
Q7. TF-IDF 0.7과 문장 임베딩 0.7은 같은 성능인가?
아님. 둘 다 코사인 값이지만 벡터를 만든 방식과 좌표 공간이 다름. 숫자가 같다고 같은 뜻일 확률이나 정확도가 같은 것은 아님. 검색에서는 같은 질문의 정답 문서를 찾았는지 비교하고, 문장쌍에서는 사람이 조건과 뜻을 확인. 결합 효과도 별도 질문 목록에서 검증 필요.
Q8. 질문 여섯 개에서 4개를 맞혔으면 관광 서비스에도 충분한가?
그렇게 판단할 근거 부족. 수업용 질문과 문서에 한정된 결과이며 실제 사용자·운영 환경의 성능 측정이 아님. 새 질문, 없는 답, 부정·예외 조건을 포함한 별도 확인 자료 필요. 정답 문서가 없을 때도 억지로 1위 답을 제공하는 문제 점검.
스스로 점검
Section titled “스스로 점검”- 검색기가 질문에 맞는 문서를 고르는 세 단계를 말하라.
- TF-IDF에서
수와있다의 점수가 낮은 이유는? 우도 가는 배가 단어 TF-IDF로 아무것도 찾지 못한 이유와, 글자 조각이 그것을 고친 방법은?- 단어 단위 유사도와 문장 단위 유사도가 가장 크게 갈린 문장쌍과 그 이유는?
- “오늘 날씨가 좋다”와 “오늘 날씨가 좋지 않다”의 세 점수가 모두 높은 이유는?
- 글자 조각과 문장 임베딩을 함께 쓰면 좋은 이유를 이번 주 결과로 설명하라.
정답 보기
-
문서를 벡터로 바꿔 두고, 질문도 같은 방식으로 벡터로 바꾼 뒤, 코사인 유사도를 재서 높은 순서로 보여 준다.
-
문서 12개 중 5개에 나오는 흔한 말이라 IDF가 낮다(1.77). 이 문서에만 나오는 말(2.87)보다 작아서, TF-IDF도 0.21로 깎인다.
-
문서에는
우도에,배를처럼 조사가 붙어 있어 띄어쓰기 단위로는 겹치는 단어가 없었다. 글자 조각은우도에를우도,도에같은 두세 글자로 잘라, 질문의우도와 조각을 나눠 갖게 한다. 그래서 3번 문서를 0.27로 찾는다. -
“우도 가는 배는 어디서 타요”와 “우도행 배편 타는 곳”이다. 단어 TF-IDF 0.00, 문장 임베딩 0.91이다. 낱말을 다른 말로 바꿔 겹치는 낱말이 없지만 뜻은 같기 때문이다.
-
낱말이 거의 같기 때문이다. 단어와 글자 조각은 겹치는 낱말을 세므로 높고, 문장 임베딩도 주제와 표현이 비슷한 문장을 가깝게 두므로 0.52가 나온다. “않다” 하나로 뒤집히는 뜻은 세 방법 모두 잘 가르지 못한다.
-
두 방법이 함께 틀린 질문이 하나뿐이기 때문이다. 질문 6개에서 각각 4개씩 맞혔고, 둘 다 틀린 것은 “제주시로 가는 교통편”이다. 나머지는 글자 조각이 “제주 전통 음식”을, 문장 임베딩이 “공항에서 시내까지”를 틀렸는데, 그 질문은 다른 방법이 맞혔다. 두 방법을 결합해 시험할 근거지만, 결합 후 개선은 별도의 질문에서 확인해야 한다.
이번 주 용어 정리
Section titled “이번 주 용어 정리”| 용어 | 한 줄 뜻 |
|---|---|
| 문서 벡터 | 문서 하나를 숫자 목록으로 바꾼 것 |
| TF | 이 문서에 그 단어가 나온 횟수 |
| IDF | 그 단어가 여러 문서에 흔할수록 작아지는 값 |
| TF-IDF | TF와 IDF를 곱한 점수. 이 문서에 자주 나오면서 다른 문서에는 드문 단어가 높다 |
| 검색 | 질문과 문서를 같은 방식의 벡터로 바꾸고 유사도로 순서를 매기는 일 |
| 글자 조각 (문자 n-그램) | 단어를 두세 글자씩 잘라 만든 조각. 조사가 달라도 겹친다 |
| 단어 단위 유사도 | 낱말이나 글자 조각이 겹치는 만큼 높아지는 유사도 |
| 문장 단위 유사도 | 낱말이 달라도 문장 전체의 뜻이 비슷하면 높아지는 유사도 |
| 문장 임베딩 | 문장 전체를 벡터 하나로 바꾼 것 |
| 문장 임베딩 모델 | 같은 뜻의 문장쌍을 가깝게 두도록 학습해 문장 임베딩을 만드는 모델 |
| KLUE-STS | 사람이 문장쌍마다 0~5점의 유사도를 매긴 한국어 공개 자료 |
이번 주 읽기
Section titled “이번 주 읽기”주교재 5장 Embeddings에 이어 11장의 Information Retrieval(11.1)과 Dense Vectors(11.3). 자세한 서지 정보는 강의계획서를 참고한다.
- 이 장들은 수식이 많다. 수식이 나오는 부분은 넘어간다. 이 과목의 시험 범위가 아니다
- 11.1에서는 TF-IDF로 문서를 벡터로 바꾸고 질문과 견주는 부분을, 11.3에서는 문장이나 문서를 밀집 벡터로 바꿔 검색하는 부분을 찾아 읽는다
- scikit-learn TF-IDF 공식 설명: 흔한 단어의 가중치와 벡터 길이 정규화 확인. 공식 계산은 제외
- 교재의 예시는 영어다. 영어는 띄어쓰기가 단어와 거의 맞아 TF-IDF가 잘 통하지만, 한국어는 조사 때문에 글자 조각이나 형태소 분석이 필요했다는 점을 비교해 본다
실습 노트북
Section titled “실습 노트북”관광 안내 문서 12개로 TF-IDF 검색기를 만들고, 글자 조각과 문장 임베딩 모델로 고쳐 본다. TODO는 내가 만든 문장쌍을 넣는 한 곳이다.