5단 분석법
순서 | 분석 | 단어 | 내용 |
1 | 일반 명사 | 문서 | 의사소통을 위해 고안된 정보를 물리적으로 묶어 놓은 것 |
임베딩 | 단단히 끼워넣는 것 | ||
문서 임베딩 | 의사소통을 위해 고안된 정보를 물리적으로 묶어놓은 것들을 단단히 끼워넣는 것? | ||
2 | 고유 명사 | 문서 | 어떤 응용 프로그램에 의해 작성된 하나의 체계적인 정보 |
임베딩 | 사람이 쓰는 자연어를 기계가 이해할 수 있는 숫자의 나열인 벡터로 바꾼 결과 혹은 그 과정 전체 | ||
문서 임베딩 | 자연어 처리(NLP) 분야에서 문서나 텍스트 데이터를 벡터 형태로 변환하는 기술 | ||
3 | 사용 이유 | 문서 임베딩 | (전처리한) 문서의 의미를 수치화하여 기계 학습 모델이 이해하고 처리할 수 있게 하기 위해서 |
4 | 사용 방법 | 문서 임베딩 | TF-IDF 벡터라이저로 문서 리스트를 벡터로 변환 |
5 | 다른 기술과의 비교 | 문서 임베딩 | - |
정의
일반 명사
문서 | 의사소통을 위해 고안된 정보를 물리적으로 묶어 놓은 것 |
임베딩 | 단단히 끼워넣는 것 |
문서 임베딩 | 의사소통을 위해 고안된 정보를 물리적으로 묶어 놓은 것들을 단단히 끼워넣는 것? |
문서는 의사소통을 위해 고안된 정보를 물리적으로 묶어 놓은 것 입니다.
임베딩은 단단히 끼워넣는 것이라는 뜻입니다.
두 단어의 뜻을 합쳐보면, 문서 임베딩은 의사소통을 위해 고안된 정보를 물리적으로 묶어 놓은 것들을 단단히 끼워넣는 것이라고 생각해 볼 수 있습니다.
고유 명사를 한 번 알아볼까요?
고유 명사
문서 | 어떤 응용 프로그램에 의해 작성된 하나의 체계적인 정보 |
임베딩 | 사람이 쓰는 자연어를 기계가 이해할 수 있는 숫자의 나열인 벡터로 바꾼 결과 혹은 그 과정 전체 |
문서 임베딩 | 자연어 처리(NLP) 분야에서 문서나 텍스트 데이터를 벡터 형태로 변환하는 기술 |
정보통신 업계에서 문서는 어떤 응용 프로그램에 의해 작성된 하나의 체계적인 정보를 말합니다.
임베딩은 사람이 쓰는 자연어를 기계가 이해할 수 있는 숫자의 나열인 벡터로 바꾼 결과 혹은 그 과정 전체를 말합니다.
그래서 문서 임베딩은, 자연어 처리(NLP) 분야에서 문서나 텍스트 데이터를 벡터 형태로 변환하는 기술을 말합니다.
문서 임베딩은 문서의 의미와 주제를 수학적으로 표현하여, 컴퓨터가 문서 간의 유사성을 계산하고 이해할 수 있게 합니다.
문서 임베딩을 통해 대규모 문서 집합에서 빠르고 정확한 검색, 분류, 클러스터링 등의 작업이 가능해집니다.
클러스터링이란?
•
데이터 포인트들을 유사성에 기반해 그룹화 하는 과정
•
대량의 데이터를 더 작고 관리하기 쉬운 하위 집합으로 나누어, 검색 속도를 높이고 메모리 사용을 최적화 함
사용 이유
문서 임베딩 | (전처리한) 문서의 의미를 수치화하여 기계 학습 모델이 이해하고 처리할 수 있게 하기 위해서 |
이유 | 설명 |
의미 표현 | 문서의 내용을 수치화하여 기계가 이해할 수 있도록 합니다. |
검색 효율성 | 유사한 문서나 텍스트를 빠르게 찾을 수 있게 합니다. |
데이터 분석 | 텍스트 데이터를 분석하고 분류하는 데 사용됩니다. |
머신러닝 적용 | 텍스트 데이터를 기계 학습 모델에 적용할 수 있도록 합니다. |
사용 방법
문서 임베딩 | TF-IDF 벡터라이저로 문서 리스트를 벡터로 변환 |
1. 라이브러리 임포트
from sklearn.feature_extraction.text import TfidfVectorizer
Python
복사
•
TfidfVectorizer는 텍스트 데이터를 TF-IDF(Term Frequency-Inverse Document Frequency) 벡터로 변환해주는 클래스입니다.
•
TF-IDF는 문서 내에서 단어의 상대적 중요성을 평가하는 방법입니다.
◦
TF (Term Frequency): 특정 단어가 문서에서 얼마나 자주 등장하는지를 측정합니다. 자주 등장할수록 높은 점수를 가집니다.
◦
IDF (Inverse Document Frequency): 특정 단어가 여러 문서에 얼마나 희귀하게 등장하는지를 측정합니다. 많은 문서에 자주 등장하는 단어는 가중치를 낮게, 드물게 등장하는 단어는 가중치를 높게 부여합니다.
◦
TF-IDF 계산: TF와 IDF 값을 곱해 각 단어의 최종 가중치를 계산합니다. 이를 통해 자주 사용되지만 중요한 단어(예: "the", "and")는 가중치가 낮아지고, 문서 간 구분을 짓는 드문 단어는 가중치가 높아집니다.
1. TF(Term Frequency) 계산:
TF는 단어가 문서에서 얼마나 자주 등장하는지 계산합니다.
첫 번째 문서: "This is a sample document."
•
총 단어 수: 5개
•
각 단어의 등장 횟수:
◦
"this": 1회
◦
"is": 1회
◦
"a": 1회
◦
"sample": 1회
◦
"document": 1회
•
TF 값 (빈도 / 총 단어 수):
◦
"this": 1/5 = 0.2
◦
"is": 1/5 = 0.2
◦
"a": 1/5 = 0.2
◦
"sample": 1/5 = 0.2
◦
"document": 1/5 = 0.2
두 번째 문서: "Document embedding is useful."
•
총 단어 수: 4개
•
각 단어의 등장 횟수:
◦
"document": 1회
◦
"embedding": 1회
◦
"is": 1회
◦
"useful": 1회
•
TF 값 (빈도 / 총 단어 수):
◦
"document": 1/4 = 0.25
◦
"embedding": 1/4 = 0.25
◦
"is": 1/4 = 0.25
◦
"useful": 1/4 = 0.25
세 번째 문서: "We use embeddings for NLP tasks."
•
총 단어 수: 6개
•
각 단어의 등장 횟수:
◦
"we": 1회
◦
"use": 1회
◦
"embeddings": 1회
◦
"for": 1회
◦
"nlp": 1회
◦
"tasks": 1회
•
TF 값 (빈도 / 총 단어 수):
◦
"we": 1/6 ≈ 0.1667
◦
"use": 1/6 ≈ 0.1667
◦
"embeddings": 1/6 ≈ 0.1667
◦
"for": 1/6 ≈ 0.1667
◦
"nlp": 1/6 ≈ 0.1667
◦
"tasks": 1/6 ≈ 0.1667
2. IDF(Inverse Document Frequency) 계산:
IDF는 해당 단어가 전체 문서에서 얼마나 드물게 등장하는지 계산합니다. IDF 공식은 다음과 같습니다:
•
N: 전체 문서의 수 (이 경우 3개).
•
df(term): 해당 단어가 등장한 문서의 수.
IDF 계산:
•
"this", "is", "a", "sample", "useful", "we", "use", "embeddings", "for", "nlp", "tasks" 등 각 단어는 한 문서에서만 등장했으므로, df = 1이고:
•
반면, "document"와 "embedding"은 각각 두 문서에 등장했으므로, df = 2이고:
3. TF-IDF 계산:
이제 각 단어의 TF 값과 IDF 값을 곱해 TF-IDF 값을 구합니다.
첫 번째 문서: "This is a sample document."
•
"this": TF×IDF=0.2×1.0986=0.2197
•
"is": 0.2×1.0986=0.2197
•
"a": 0.2×1.0986=0.2197
•
"sample": 0.2×1.0986=0.2197
•
"document": 0.2×0.4055=0.0811
두 번째 문서: "Document embedding is useful."
•
"document": 0.25×0.4055=0.1014
•
"embedding": 0.25×0.4055=0.1014
•
"is": 0.25×1.0986=0.2747
•
"useful": 0.25×1.0986=0.2747
세 번째 문서: "We use embeddings for NLP tasks."
•
"we": 0.1667×1.0986=0.1831
•
"use": 0.1667×1.0986=0.1831
•
"embeddings": 0.1667×1.0986=0.1831
•
"for": 0.1667×1.0986=0.1831
•
"nlp": 0.1667×1.0986=0.1831
•
"tasks": 0.1667×1.0986=0.1831
2. 문서 리스트 정의
documents = ["This is a sample document.", "Document embedding is useful.", "We use embeddings for NLP tasks."]
Python
복사
•
documents는 텍스트 데이터를 담고 있는 리스트입니다. 각 항목은 하나의 문서입니다.
3. TfidfVectorizer 인스턴스 생성
vectorizer = TfidfVectorizer()
Python
복사
•
TfidfVectorizer 클래스의 인스턴스를 생성합니다.
•
기본 설정으로 TfidfVectorizer를 생성하면 영어의 불용어(stop words)를 제거하고, 소문자로 변환하며, 단어 토큰화를 수행합니다.
◦
또한, custom_stop_words를 지정하여 사용자 정의 불용어 목록을 사용할 수도 있습니다.
불용어(stop words)란?
•
자연어 처리에서 빈번하게 등장하지만, 분석에 큰 의미를 주지 않는 단어들을 말합니다.
◦
예를 들어, 영어에서 “the”, “is”, “in”, “and”와 같은 단어들이 불용어에 해당합니다.
•
불용어 제거의 예
◦
원문
text = "The quick brown fox jumps over the lazy dog"
Python
복사
◦
불용어 제거한 문장
text_without_stopwords = "quick brown fox jumps over lazy dog"
Python
복사
4. 텍스트 데이터 변환
X = vectorizer.fit_transform(documents)
Python
복사
•
fit_transform(raw_documents, y=None) : sklearn 라이브러리의 벡터라이저 클래스들(TfidfVectorizer, CountVectorizer 등)에서 사용되는 메서드로, 주어진 텍스트 데이터를 학습(fit)하고 변환(transform)하여 벡터화된 형태로 반환합니다.
◦
raw_documents: 텍스트 데이터의 리스트 또는 iterable 객체입니다. 각 문자열은 하나의 문서에 해당합니다.
◦
y: fit_transform메서드에서 사용되지 않는 매개변수로, 인터페이스의 일관성을 위해 존재합니다.
•
X는 변환된 문서들의 TF-IDF 벡터를 담고 있는 행렬입니다. 이는 희소 행렬(sparse matrix) 형식입니다.
희소 행렬(sparse matrix)란?
•
대부분의 요소가 0인 행렬을 의미합니다. 하지만, 0이 아닌 값만 출력됩니다
•
희소 행렬은 많은 데이터를 공간 효율적으로 저장하고 처리하는데 사용합니다.
•
일반적으로 데이터의 밀도가 낮고, 비제로 요소의 수가 전체 요소 수에 비해 매우 적은 경우 유용합니다.
비제로 요소란?
•
행렬에서 값이 0이 아닌 요소를 의미합니다.
•
희소 행렬에서는 대부분의 요소가 0이지만, 비제로 요소는 중요한 데이터를 나타내므로 공간 효율적으로 저장하고, 처리하는 것이 핵심입니다.
결과값
print(X)
Python
복사
•
형식 :(문서 인덱스, 단어 인덱스) TF-IDF 값
(0, 8) 0.5628290964997665
(0, 4) 0.4280460350631185
(0, 6) 0.5628290964997665
(0, 0) 0.4280460350631185
(1, 4) 0.4280460350631185
(1, 0) 0.4280460350631185
(1, 1) 0.5628290964997665
(1, 10) 0.5628290964997665
(2, 11) 0.4082482904638631
(2, 9) 0.4082482904638631
(2, 2) 0.4082482904638631
(2, 3) 0.4082482904638631
(2, 5) 0.4082482904638631
(2, 7) 0.4082482904638631
JavaScript
복사
•
TF 값이 높으면 해당 단어가 그 문서에서 자주 등장한다는 것을 의미합니다. 즉, 문서 내에서 빈도가 높은 단어라는 뜻입니다.
•
IDF 값이 높을 때: 해당 단어가 다른 문서에서는 거의 등장하지 않는다는 것을 의미합니다. 즉, 해당 문서에서만 중요한 단어라는 뜻입니다.
•
TF-IDF 값이 높을수록: 해당 문서에서 자주 등장하면서도, 다른 문서들에서는 드물게 등장하는 단어일 가능성이 큽니다. 이는 문서의 내용을 잘 요약해주거나, 중요한 의미를 담고 있을 수 있음을 나타냅니다.
단어 인덱스가 어떤 값인 어떻게 아나요?
답변 :
아래 코드로 확인할 수 있습니다.
print(vectorizer.get_feature_names_out()) # 몇 번째 인덱스인지
Python
복사
위 코드를 동작시켜보면 아래와 같이 출력될 수 있습니다.
['document' 'embedding' 'embeddings' 'for' 'is' 'nlp' 'sample' 'tasks'
'this' 'use' 'useful' 'we']
Python
복사
5. 결과 출력
print(X.toarray())
Python
복사
•
X.toarray()는 희소 행렬을 밀집 행렬(dense matrix)로 변환합니다.
•
변환된 행렬을 출력합니다. 각 행은 하나의 문서를 나타내며, 각 열은 특정 단어에 대한 TF-IDF 값을 나타냅니다.
밀집 행렬(dense matrix)란?
•
대부분의 요소가 0이 아닌 값들로 채워진 행렬을 의미합니다.
•
밀집 행렬은 행렬의 모든 요소를 저장하며, 데이터의 밀도가 높은 경우에 주로 사용됩니다.
출력 결과
•
(값은 예시입니다)
[[0.42804604 0. 0. 0. 0.42804604 0.
0.5628291 0. 0.5628291 0. 0. 0. ]
[0.42804604 0.5628291 0. 0. 0.42804604 0.
0. 0. 0. 0. 0.5628291 0. ]
[0. 0. 0.40824829 0.40824829 0. 0.40824829
0. 0.40824829 0. 0.40824829 0. 0.40824829]]
Plain Text
복사
•
각 행은 문서에 해당하고, 각 열은 단어에 해당합니다.
◦
첫 번째 행: 첫 번째 문서의 각 단어에 대한 TF-IDF 값.
◦
두 번째 행: 두 번째 문서의 각 단어에 대한 TF-IDF 값.
◦
세 번째 행: 세 번째 문서의 각 단어에 대한 TF-IDF 값.
•
행렬의 값은 해당 단어의 TF-IDF 점수입니다.