[NLP 3일차-1] – SentenceBERT, Word2Vec, 감성분석

이번 글에서는

자연어처리에서 텍스트의 의미를 수치적으로 표현하고 비교하는 방법을 정리해보겠습니다.
내용이 길기 때문에 먼저

문장 유사도, 단어 임베딩(Word2Vec), 의미공간, 그리고 임베딩의 대표 활용인 감성분석까지를 다룹니다.


단어 유사도 (Similarity)

두 텍스트(단어, 문장, 문서)가 의미적으로 얼마나 비슷한지를 수치로 나타낸 값


자연어처리에서는 텍스트를 벡터로 변환한 뒤, 벡터 간 거리나 각도를 통해 유사도를 계산합니다.

대표적으로 많이 쓰는 방식이 **코사인 유사도(cosine similarity)**입니다.
코사인 유사도는 벡터의 길이(크기)가 아니라 방향의 유사함에 초점을 맞춥니다.

(같은 방향으로 갈수록 의미가 비슷하다~)

 

🍀 즉 두 문장이 “같은 말을 하고 있는지”를 컴퓨터가 판단하도록, 비슷함을 숫자로 바꾸는 방법입니다.

 

두 사람의 성격을 비교할 때, 키나 몸무게 같은 크기보다 성향의 방향이 비슷한지 보는 것과 같습니다.
코사인 유사도는 이런 “방향이 비슷한 정도”를 보는 방식입니다.

 

예시를 들어보자면

  • 문장 A: “이 약을 계속 복용해야 하나요?”
  • 문장 B: “이 약을 끊어도 되나요?”

두 문장은 모두 “복용 지속 여부”를 묻고 있으므로 의미가 가깝습니다.
단어가 완전히 같지 않아도, 의미적으로는 유사도가 높게 나와야 합니다.


단어 기반 비교의 한계

전통적인 방법(N-gram, TF, TF-IDF 등)은 텍스트를 단어의 존재 여부나 등장 빈도로 비교합니다.
이 방법은 계산이 쉽지만 의미를 충분히 반영하지 못합니다. 🙁

 

문장에 들어있는 단어가 겹치면 비슷하다고 보고,
겹치지 않으면 다르다고 보기 때문입니다.

  • “머리가 너무 아파요.”
  • “두통이 심합니다.”

두 문장은 같은 의미에 가깝지만,

단어가 겹치지 않기 때문에 단순 비교에서는 유사도가 낮게 나올 수도 있습니다.


SentenceBERT

문장을 **고정 길이 벡터(문장 임베딩)**로 변환


문장 임베딩이 있으면 문장 간 유사도를 다음처럼 계산할 수 있습니다.

  • 문장 1 벡터로 변환
  • 문장 2 벡터로 변환
  • 두 벡터 간 코사인 유사도 계산

SentenceBERT의 핵심은 문장을 각각 독립적으로 임베딩할 수 있다는 점입니다.
따라서 문장 후보가 많아도, 임베딩을 미리 만들어두면 비교는 매우 빠르게 수행됩니다.

 

🍀문장을 지도 위의 핀으로 찍어둔다고 보면 됩니다.
의미가 비슷한 문장은 지도에서 가까운 곳에 핀이 찍히고,
비슷하지 않은 문장은 멀리 떨어져 찍힙니다.

 

예제를 들어보자면 질문이 하나 있고 답변 후보가 여러 개일 때 다음이 가능합니다.

  • 질문: “이 증상은 병원에 가야 하나요?”
  • 답변 후보 1: “지속되면 내원하여 진료를 받는 것이 좋습니다.”
  • 답변 후보 2: “운동을 하면 근육이 커집니다.”
  • 답변 후보 3: “물 많이 드세요.”

문장 임베딩 기반 유사도는 후보 1이 가장 가까운 답변으로 높은 점수를 갖도록 만드는 방향입니다.


Word2Vec

단어를 벡터로 표현하는 대표적인 방법


'비슷한 문맥에서 등장하는 단어는 비슷한 의미를 가진다' 라고 정리할 수 있습니다.

 

Word2Vec은 단어의 의미를 [사전 정의]로 넣는 것이 아니라,
주변 단어(문맥) 관계를 학습하면서 의미를 벡터로 만든다는 특징이 있습니다.

 

단어 뜻을 사람이 직접 입력하는 게 아닌
단어가 어떤 단어들과 같이 자주 등장하는지를 보고 의미를 배웁니다.

 

“감기”라는 단어 주변에 자주 등장하는 단어가
“기침, 발열, 콧물, 진료, 약”이라면,
Word2Vec은 “감기”를 그런 단어들과 가까운 벡터로 학습하게 됩니다.


CBOW와 Skip-gram의 차이

Word2Vec에는 대표적으로 두 가지 학습 방식이 있습니다.

  • CBOW(Continuous Bag of Words): 주변 단어들 → 중심 단어를 예측합니다.
  • Skip-gram: 중심 단어 → 주변 단어들을 예측합니다.

둘 다 문맥 정보를 학습하지만 방향이 다릅니다.

  • CBOW: 주변을 보고 정답 단어를 맞히는 방식 (단서(주변 단어)를 보고 범인을 맞히는 추리)
  • Skip-gram: 정답 단어를 보고 주변 단어를 맞히는 방식 (범인이 누구인지 알고, 그 범인이 있을 만한 장소(주변 단어)를 예측)

예제를 들어볼까요?

 

문장: “나는 감기 때문에 병원에 갔습니다.”

  • CBOW: (나는, 때문에, 병원에, 갔습니다) → 감기 예측
  • Skip-gram: 감기 → (나는, 때문에, 병원에, 갔습니다) 예측

임베딩(Embedding)과 의미공간(Semantic Space)

다음 감성분석으로 넘어가기 전에 앞에서도 몇 번 언급되었던 임베딩에 대해 알아볼까요?

 

임베딩은 단어/문장 등을 고정 차원의 벡터로 바꾸는 것이며, 의미공간은 그 벡터들이 놓이는 공간입니다.

의미공간의 핵심 성질은 아래와 같습니다.

  • 의미가 비슷하면 벡터가 가깝습니다.
  • 의미가 다르면 벡터가 멉니다.

이때 “가깝다”는 것은 보통 코사인 유사도 또는 거리로 계산합니다.

 

텍스트를 숫자 좌표로 바꾸고,
좌표끼리 가까우면 의미도 비슷하다고 보는 방식입니다.

  • “의사”와 “전문의”는 가까운 위치
  • “의사”와 “초콜릿”은 먼 위치
    처럼 배치되는 것이 이상적인 의미공간입니다. 👍🏻

감성분석(Sentiment Analysis): 임베딩의 대표 활용

감성분석은 텍스트를 읽고 긍정/부정/중립을 분류하는 작업입니다.

감성분석에서 중요한 점은 텍스트를 단어 빈도만으로 표현하기보다
임베딩을 통해 의미적 특징을 담은 표현으로 바꾸면 성능이 좋아질 수 있다는 점입니다.

 

즉 리뷰나 대화가 “좋은 말인지, 나쁜 말인지”를 분류하는 작업으로 

말투가 정중한지, 불만인지, 감사인지 같은 분위기를
컴퓨터가 숫자로 구분하도록 학습시키는 것과 같습니다.

  • “정말 친절하게 설명해주셔서 감사합니다.” → 긍정
  • “효과가 없고 오히려 더 안 좋아졌습니다.” → 부정
  • “어제 OO병원에 다녀왔습니다.” → 중립 가능

🔑 요약

  • 유사도는 텍스트 의미의 비슷함을 수치로 나타내는 개념입니다.
  • 단어 기반 비교는 표현이 달라지면 의미가 같아도 유사하다고 보기 어렵습니다.
  • SentenceBERT는 문장 임베딩을 통해 문장 유사도를 효율적으로 계산합니다.
  • Word2Vec은 문맥을 기반으로 단어 의미를 벡터로 학습합니다.
  • 임베딩과 의미공간은 의미 기반 비교의 기반입니다.
  • 감성분석은 임베딩이 실제로 활용되는 대표적인 분류입니다.