1. 단어와 문장 임베딩의 차이
문장 임베딩은 단어 임베딩의 확장으로, 단어 단위가 아닌 문장 전체의 의미를 벡터 형태로 표현한다. 이는 전반적인 글의 이해, 문맥 파악, 글 생성 등 복잡한 자연어 처리 작업을 가능하게 한다.
단어 임베딩과의 주된 차이점은, 문장 임베딩이 문장 전체의 의미를 포착하여 다루는 반면, 단어 임베딩은 개별 단어의 의미와 문맥적 유사성에 중점을 둔다.
2. 문장 임베딩 방법
원핫 인코딩
원핫 인코딩 방식을 문장에 적용하면, 각 단어는 고유의 인덱스에 1을 부여받고, 나머지는 0으로 채워진 벡터로 표현된다. 예를 들어,
- "사과는 맛있다" → [1, 0, 1]
- "바나나는 맛있다" → [0, 1, 1]
단어 임베딩의 평균
단어 임베딩을 기반으로 문장의 평균 벡터를 생성하는 방법은 직관적이지만, 서로 다른 의미의 문장이 같은 임베딩 값을 갖는 문제가 발생할 수 있다.
TF-IDF 가중치 적용
TF-IDF를 활용하여 문장 내 각 단어의 중요도에 따라 가중치를 적용하고, 이 가중치를 평균하여 문장의 임베딩을 생성한다.
3. 딥러닝을 활용한 문장 임베딩
딥러닝 모델을 이용해 문장 전체의 의미를 포함하는 벡터를 생성하며, 이 과정에서 BERT나 CLIP과 같은 모델이 활용된다. 이러한 모델은 각 단어의 정보를 종합하여 하나의 문장 벡터로 임베딩한다.
원핫 인코딩 (One-hot Encoding)으로 문장 임베딩 하기¶
In [ ]:
from sklearn.feature_extraction.text import CountVectorizer
In [ ]:
# 문장 리스트
sentences = ["사과는 맛있다",
"바나나는 맛있다",
"딸기는 맛있다",
"김치는 맵다",
"짜장면은 달다",
"소고기는 좋다"]
In [ ]:
# CountVectorizer를 생성
# CountVectorizer : 텍스트 데이터를 단어 빈도(count)로 변환하는 객체
# binary=True : 빈도가 2 이상이어도 1로 표현
# binary=False : BoW 코드로 사용 가능
vectorizer = CountVectorizer(binary=True)
vectorizer.fit(sentences)
Out[ ]:
CountVectorizer(binary=True)In a Jupyter environment, please rerun this cell to show the HTML representation or trust the notebook.
On GitHub, the HTML representation is unable to render, please try loading this page with nbviewer.org.
CountVectorizer(binary=True)
In [ ]:
# 단어-인덱스 매핑
word_to_index = vectorizer.vocabulary_
print("단어-인덱스 매핑:", word_to_index)
단어-인덱스 매핑: {'사과는': 6, '맛있다': 3, '바나나는': 5, '딸기는': 2, '김치는': 0, '맵다': 4, '짜장면은': 9, '달다': 1, '소고기는': 7, '좋다': 8}
In [ ]:
# 문장을 벡터로 변환
input_sentence = ["소고기는 맛있다"]
# input_sentence = ["소고기는 소고기는 소고기는 맛있다"]
sentence_vectors = vectorizer.transform(input_sentence).toarray()
print(f"입력 문장 '{input_sentence[0]}'의 원핫 임베딩 벡터 :", sentence_vectors[0])
입력 문장 '소고기는 맛있다'의 원핫 임베딩 벡터 : [0 0 0 1 0 0 0 1 0 0]
In [ ]:
# 문장을 벡터로 변환
# input_sentence = ["소고기는 맛있다"]
input_sentence = ["소고기는 소고기는 소고기는 맛있다"]
sentence_vectors = vectorizer.transform(input_sentence).toarray()
print(f"입력 문장 '{input_sentence[0]}'의 원핫 임베딩 벡터 :", sentence_vectors[0])
입력 문장 '소고기는 소고기는 소고기는 맛있다'의 원핫 임베딩 벡터 : [0 0 0 1 0 0 0 1 0 0]
In [ ]:
vectorizer = CountVectorizer(binary=False)
vectorizer.fit(sentences)
Out[ ]:
CountVectorizer()In a Jupyter environment, please rerun this cell to show the HTML representation or trust the notebook.
On GitHub, the HTML representation is unable to render, please try loading this page with nbviewer.org.
CountVectorizer()
In [ ]:
input_sentence = ["소고기는 맛있다"]
# input_sentence = ["소고기는 소고기는 소고기는 맛있다"]
sentence_vectors = vectorizer.transform(input_sentence).toarray()
print(f"입력 문장 '{input_sentence[0]}'의 원핫 임베딩 벡터 :", sentence_vectors[0])
입력 문장 '소고기는 맛있다'의 원핫 임베딩 벡터 : [0 0 0 1 0 0 0 1 0 0]
In [ ]:
# input_sentence = ["소고기는 맛있다"]
input_sentence = ["소고기는 소고기는 소고기는 맛있다"]
sentence_vectors = vectorizer.transform(input_sentence).toarray()
print(f"입력 문장 '{input_sentence[0]}'의 원핫 임베딩 벡터 :", sentence_vectors[0])
입력 문장 '소고기는 소고기는 소고기는 맛있다'의 원핫 임베딩 벡터 : [0 0 0 1 0 0 0 3 0 0]
In [ ]:
'Machine Learning > Embedding & NLP' 카테고리의 다른 글
| 감정 분석(Sentiment Analysis) (1) | 2024.06.10 |
|---|---|
| 단어 임베딩 (0) | 2024.06.10 |
| 텍스트 마이닝과 데이터 마이닝 (0) | 2024.05.14 |