인일의 공부 블로그

[Aiffel 9기] 딥다이브 2. 텍스트의 분포로 벡터화 하기 본문

카테고리 없음

[Aiffel 9기] 딥다이브 2. 텍스트의 분포로 벡터화 하기

nineil912 2024. 10. 14. 16:52

포스팅 개요

아이펠 9기 온라인과정 딥다이브 코스 학습 중 핵심되는 부분이나 어려운 부분을 리뷰하는 페이지 입니다. 상세 내용은 아래 각 링크를 하여 보충하였습니다.

 

 

목차

1. 단어 빈도를 이용한 벡터화

2. LSA와 LDA

3. 텍스트 분포를 이용한 비지도학습 토크나이저

 

 

🎈 1. 단어 빈도를 이용한 벡터화

- 자연어 처리에서 벡터화 : 텍스트를 숫자 벡터로 변환한느 과정

- 벡터화 방법

    1. 통계와 머신러닝을 활용한 방법

    2. 인공 신경망을 활용하는 방법

1. Bag of Words(BoW)

사진 출처 : matlabhttps://kr.mathworks.com/discovery/bag-of-words.html

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

출처 : https://www.darrinbishop.com/blog/2017/10/text-analytics-document-term-matrix/

 

- 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 수식

[ 출처 : http://openuiz.blogspot.com/2018/11/tf-idf.html ]

- 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로 정신 뿌셔 뿌셔 했다. 퍼실님과 설명을 이해했는지 점검했는데 내 설명이 맞다고 어느정도 이해했다고 하셨지만,,, 이해가 안되는 상태 그냥 그 개념을 외운 것 같다. 수학 스터디를 진행하고 있으니 언젠가 이해 할 날이 오겠지! 꾸준히 하고 수학을 좀 더 공부 한 다음 다시 보자