일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | ||
6 | 7 | 8 | 9 | 10 | 11 | 12 |
13 | 14 | 15 | 16 | 17 | 18 | 19 |
20 | 21 | 22 | 23 | 24 | 25 | 26 |
27 | 28 | 29 | 30 |
- qiskit #qiskitHackerthon
- ibm #qiskit #quantum # quantumcomputer #quantumcomputing #quantummachine #quantumengineering #quantumbit #qbit
- qiskit #QuantumComputer #QuantumMachine #양자컴퓨터 #양자 #키스킷
- qiskit #
- Today
- Total
인일의 공부 블로그
[Aiffel 9기] 딥다이브 2. 텍스트의 분포로 벡터화 하기 본문
포스팅 개요
아이펠 9기 온라인과정 딥다이브 코스 학습 중 핵심되는 부분이나 어려운 부분을 리뷰하는 페이지 입니다. 상세 내용은 아래 각 링크를 하여 보충하였습니다.
목차
🎈 1. 단어 빈도를 이용한 벡터화
- 자연어 처리에서 벡터화 : 텍스트를 숫자 벡터로 변환한느 과정
- 벡터화 방법
1. 통계와 머신러닝을 활용한 방법
2. 인공 신경망을 활용하는 방법
1. Bag of Words(BoW)

1. 단어들을 모두 가방에 넣어 섞음
2. 빈도 정보만 보존함
- keras Tokenizer 활용
from tensorflow.keras.preprocessing.text import Tokenizer
sentence = ["Hello world Hello cpp Hello python Hello qiskit Hello pennylane"]
tokenizer = Tokenizer()
tokenizer.fit_on_text(sentence) #단어장 생성
bow = dict(tokenizer.word_counts) #단어 빈도 bow에 저장
print("Bag of Words :", bow)
print("단어장의 크기 : ", len(tokenizer.word_counts))
Bag of Words : {'hello':4 'cpp':1 ,'python':1 ,'qiskit':1 ,'pennylane':1}
단어장의 크기 : 5
- scikit-learn CountVectorizer 활용
from sklearn.feature_extraction.text import CountVectorizer
sentence = ["John likes to watch movies. Mary likes movies too! Mary also likes to watch football games."]
vector = CountVectorizer()
bow = vector.fit_transform(sentence).toarray()
print('Bag of Words : ', bow)
print('각 단어의 인덱스 :', vector.vocabulary_)
Bag of Words : [[1 1 1 1 3 2 2 2 1 2]]
각 단어의 인덱스 : {'john': 3, 'likes': 4, 'to': 7, 'watch': 9, 'movies': 6, 'mary': 5, 'too': 8, 'also': 0, 'football': 1, 'games': 2}
2. DTM과 코사인 유사도
- Document-Term Matrix(DTM) : 문서-단어 행렬
- 여러 문서의 Bag of Words를 하나의 행렬로 구현한 것 -> 문서에 등장한 빈도수를 행렬로 통합
- 아래는 예시 문장
Doc 1: Intelligent applications creates intelligent business processes
Doc 2: Bots are intelligent applications
Doc 3: I do business intelligence

- 3개의 문장으로 각각 Bag of Words를 만들고 한의 행으로 표현
- 행을 문서 벡터, 열을 단어 벡터로 부름
- 문서가 많을수록, 통합 단어장이 커짐
- 문서벡터와 단어벡터 모두 대부분 값이 0이 되는 성질을 가짐 (원핫벡터인코딩의 카테고리가 늘어나는것과 유사하다생각)
-1은 언제 나올까? 평행하지만 반대방향
bag of words에서는 0 ~ 90도 만 존재해서 0과 1사이 값이 나옴 코사인 유사도
- DTM 구현
from sklearn.feature_extraction.text import CountVectorizer
corpus = [
'John likes to watch movies',
'Mary likes movies too',
'Mary also likes to watch football games',
]
vector = CountVectorizer()
print(vector.fit_transform(corpus).toarray())
print(vector.vocabulary_)
- DTM 한계
1. 문서 갯수와 단어수가 많아질수록 대부분의 행, 열은 0을 가짐 -> 차원의 저주 발생
2. 빈도수에만 집중하는것이 문제임 -> 단어 빈도가 유사하다고 같은 문장이 아님. '관사' 같은것이 많이 포함될 가능성 다수(e.g. the)
3. TF-IDF
- Term Frequency-Inverse Document Frequency(TF-IDF) : 단어 빈도 - 역문서 빈도(단어의 빈도와 문서의 빈도의 역수)
- 모든 문서에서 자주 등장하는 단어는 중요도가 낮다고 판단
- 특정 문서에서 자주 등장하는 단어는 중요도가 높다고 판단
- TF-IDF 수식

- TF-IDF는
tf는 많이 등장할수록 커짐
df가 커질수록 결과에 작은 영향을 주겠다
N은 고정
log는 0 ~ 1 사이 가짐, 음의값은 가질 일이 없음.
더 넓게 분포된 단어에 대해 중요도 낮춤
문서가 여러개가 있는데 조사가 들어가있고 부사 등등 희소한게 주제라 파악
중요도를 뽑아내는 기법
🎈 2. LSA와 LDA
Latent Semantic Analysis(LSA)
- 잠재 의미 분석
- 전체 코퍼스에서 문서 속 단어들 사이의 관계를 찾아내는 정보 검색 기술
- 단어와 단어, 문서와 문서, 단어와 문서 사이 의미적 유사성 점수를 찾을 수 있음
- 빈도 판단보다 더 효과적
특이값 분해
https://www.youtube.com/watch?v=35ESC-g49fY

LSA와 Truncated SVD
- U = rotation, S = strech, V = rotation
- 직교한 값의 특성을 구하여 그 값이 중요함임을 나타내는 것

🎈 3. 텍스트 분포를 이용한 비지도학습 토크나이저
형태소 분석기와 단어 미등록 문제
- 한국어는 교착어(어절이 하나의 어근 혹은 어간과 각각 단일한 기능을 가지는 하나의 접사의 결합으로 이루어져 있는 언어 이며, 조사라는 품사는 교착어에만 존재함.)
- 영어는 단순히 띄어쓰기로 구분이 가능하지만 한글은 그게 아님
- Okt를 사용했을때 문제는 미등록 단어가 있다는 것임
- 내가 생각하기로 미등록 문제 해결 방법 :새로 나온 단어를 중요하게 만든 다음 출현 빈도가 적으면 덜 중요하게 만들기
soynlp
- 품사 태깅, 형태소 분석 등을 지원하는 한국어 형태소 분석기
- 비지도학습이고 데이터에 자주 등장하는 단어들을 현태소로 분석
- 점수표로 동작함. 응집 확률과 브랜칭 엔트로피를 활용함
- 응집 확률
- 얼마나 자주 등장하는지 판단하는 척도


- 브랜칭 엔트로피
주어진 문자열에서 다음 문자가 등장 할 수 잇는 가능성 판단
https://ratsgo.github.io/from%20frequency%20to%20semantics/2017/05/06/BranchingEntropy/
Branching Entropy · ratsgo's blog
이번 글에서는 말뭉치에서 단어를 추출하는 기법 가운데 하나인 Branching Entropy(이하 BE)에 대해 살펴보도록 하겠습니다. BE는 Jin&Tanaka(2006)이 제안한 모델인데요, 이 글은 김현중 서울대 박사과정
ratsgo.github.io
간단 후기
LSA로 정신 뿌셔 뿌셔 했다. 퍼실님과 설명을 이해했는지 점검했는데 내 설명이 맞다고 어느정도 이해했다고 하셨지만,,, 이해가 안되는 상태 그냥 그 개념을 외운 것 같다. 수학 스터디를 진행하고 있으니 언젠가 이해 할 날이 오겠지! 꾸준히 하고 수학을 좀 더 공부 한 다음 다시 보자