반응형

Latent Semantic Indexing, 즉 LSI는 문서와 단어의 빈도 행렬을 낮은 차원의 의미 공간으로 압축해 문서와 단어 사이의 잠재 관계를 보려는 방식이다. NLP에서 단어와 문서를 숫자 벡터로 바꾸는 흐름을 이해할 때 좋은 출발점이 된다.

이 글은 LSI, document-term matrix, term-document matrix, SVD, Word2Vec, CBOW, skip-gram, vector space model을 한 번에 훑으며 개인 학습 메모로 정리한 내용이다.

 

핵심 정리

LSI는 문서별 단어 빈도를 행렬로 만든 뒤 SVD 같은 행렬 분해를 통해 더 작은 차원의 표현으로 압축한다. 원래의 단어 빈도 행렬은 많은 칸이 비어 있는 sparse matrix가 되기 쉬운데, 차원을 줄이면 단어와 문서 사이에 직접 드러나지 않던 잠재 의미 관계를 볼 수 있다. Word2Vec은 이와 다른 방식으로 단어 주변 문맥을 이용해 단어 벡터를 학습한다. CBOW는 주변 단어로 중심 단어를 예측하는 흐름이고, skip-gram은 중심 단어로 주변 단어를 예측하는 흐름으로 이해할 수 있다. vector space model과 TF-IDF는 문서와 쿼리를 벡터로 표현하고 코사인 유사도 등으로 가까움을 비교하는 전통적인 정보검색 관점과 연결된다.

  • LSI는 단어와 문서의 빈도 행렬을 낮은 차원의 의미 공간으로 압축한다.
  • Document-term matrix는 문서를 행, 단어를 열로 두고 빈도를 기록한 행렬이다.
  • Term-document matrix는 행과 열의 방향을 바꿔 단어 기준으로 문서를 보는 표현이다.
  • SVD는 큰 행렬을 더 작은 구조로 분해해 잠재 의미 축을 찾는 데 쓰인다.
  • Word2Vec은 주변 문맥을 이용해 단어를 실수 벡터로 학습한다.
  • CBOW는 주변 단어에서 중심 단어를 예측하는 방향으로 이해할 수 있다.
  • Skip-gram은 중심 단어에서 주변 단어를 예측하는 방향으로 이해할 수 있다.
  • TF-IDF와 코사인 유사도는 문서 검색과 추천의 기본 벡터 공간 관점과 연결된다.

원문은 LSI를 시작점으로 Word2Vec, Bag of Words, TF-IDF, vector space model까지 이어지는 넓은 학습 메모입니다. 보강문에서는 각 개념이 텍스트를 숫자 벡터로 바꾸는 큰 흐름 안에서 어떤 위치에 있는지 먼저 잡았습니다. 세부 구현보다 행렬 표현, 차원 축소, 문맥 기반 임베딩의 차이를 구분하는 것이 첫 이해에 도움이 됩니다.

이어서 볼 글

 

Latent Semantic Indexing (LSI)

> Word embedding techniaue which applies Singular Value Decomposition(SVD) over a word-document matrix.

> Goal of the approach is to compress the original information space through SVD in order to obtain a smaller-scale word-concepts matrix

> in which each column models laent concept occuring the original vector space

> unveil the latent relationships between terms according to their usage in the corpus.

음.. 이게 생각보다 복잡해서 아직 다 이해하지는 못했는데.. \\

word-document 빈도 행렬을 만들고 이게 굉장히 sparse한데 \\

기본적으로 행렬 사이즈를 줄이는 기술을 통해서 일종의 encoding을 하는거다.

Document-term matrix

> matrix that describes the frequency of terms that occur in a collection of documents.

문서들이 있고 단어들이 있을때 단어들의 등장하는 빈도를 나타내는 행렬

만들어 놓고 보면 sparse matix가 되는 경우가 많다.

> rows corresponding to the documents and

> columns corresponding to the terms.

행은 문서 D1, D2\\

열을 단어들 C1, C2\\

위에서 행렬 순서만 바꾸면 Term-Document matrix가 되는 듯 하다.. 아래처럼\\

word2vec

Mikolov라는 애가 word embedding을 만든 방식인거 같애

히든레이어 하나짜리 fully connected NN 사용 (그리고 hidden layer에는 relu등 activation없는 linear 방식임에 주의)

corpus에 있는 단어수가 V 이고, 100차원짜리 word vector로 만든다고 가정하자(N = 100)

pair of words

아래는 1:1 로 학습하는거 "cat climbed a tree" 면은.. cat이 input 옆에 있는 climbed를 아웃풋으로 해서 cat의 워드 임베딩을 학습시키는거

인풋노드의 숫자가 단어수 V란점에 주목하자. 단어가 10만개면 10만개가 되는거네!!

그담에 여기가 중요한데 \\

input layer가 one hot 으로 인코딩 되어 있기 때문에 히든레이어의 노드값이 결국 word embedding이 된다!!!

근데 히든레이어의 노드는 중간계산값이고 실체는 WI매트릭스 자체라고 봐야한다!

잘이해 안가면 여기를 주의깊게 보기바람. 설명 잘 돼 있음

히든레이어의 노드가 워드임베딩이라면 아웃풋은 뭐냐?..

아웃풋은 소프트맥스 씌워가지고 바로옆에 단어일 확률을 1.0으로 해서 마찬가지로 one hot encoding된애가 답이라고 보고 학습시키면 됨

continuous bag of words(CBOW) model

위에거랑 같은데 한번에 여러단어들(학습은 WI에 역시 되고) 학습시킨다는 개념

skip-gram model

위에거 좌우 반전한거

음? 이 링크에서는 왜 인풋이 단어하나가 아니지?

vector space model

예전 방식인 것 같은데 TF-IDF개념이 들어 있어서 기록해둔다.

아직 파기전인데 느낌으로는 단어들을 숫자하나에 매핑하는 word symbol을 만들고 문서와 쿼리를 다음처럼 벡터로 표현

이렇게 보면 content-based 추천시스템과 뭐 동일한 수준이네(q를 이력서로 보고, d를 회사정보로 본다면 말이지)

유사도는 cosine similarity로 본다는데.. 뭐 내적이 사용되고 그렇겠네

python 에서 돌려보기

corpus는 다음 방법으로 받는다.


sudo pip install nltk
python
>> import nltk
>>
>> nltk.download()
>> d all  # 이 과정은 1회만 하면 된다.
>>
>> from nltk.corpus import movie_reviews
>> sentences = [list(s) for s in movie_reviews.sents()] 
>> sentences[0]
[u'plot', u':', u'two', u'teen', u'couples', u'go', u'to', u'a', u'church', u'party', u',', u'drink', u'and', u'then', u'drive', u'.']

word vector로는 다음과 같이 만든다.


sudo pip install gensim
python
>> from gensim.models.word2vec import Word2Vec
>> model = Word2Vec(sentences)
>> model.wv['computer']
array([ 0.13485171, -0.04323902, -0.20184085, -0.1116989 , -0.04531352,
       -0.02743174,  0.02062317,  0.08309605, -0.02160213, -0.05665653,
       -0.13692307, -0.02193299, -0.17518817, -0.23656274, -0.1691726 ,
       -0.0012426 , -0.04085199, -0.09222578, -0.06338105,  0.06809234,
       -0.11019737,  0.13307993,  0.02887194,  0.00884194,  0.10700572,
        0.05783712,  0.03618079,  0.18349797, -0.0037382 , -0.18910615,
       -0.19557972,  0.11449865,  0.07435124, -0.00751567, -0.03106933,
        0.11795301, -0.11565875, -0.05655258,  0.06150777,  0.04236739,
       -0.04773199, -0.08902597, -0.01122117, -0.19447234, -0.01905541,
       -0.00274717,  0.06359834, -0.00279643, -0.06623574,  0.07596399,
       -0.1091563 , -0.05727617,  0.03260028, -0.06816222, -0.00109099,
        0.01516672, -0.0987931 ,  0.03002268, -0.00479877, -0.1143024 ,
        0.04929075,  0.13717692, -0.10169379, -0.20210269,  0.26840541,
       -0.00166255, -0.01364663, -0.0632745 , -0.13172641, -0.06630141,
       -0.07936876,  0.07586182, -0.08521201, -0.03637725, -0.11793053,
       -0.01777722,  0.11835278,  0.07071985,  0.09348051,  0.14521094,
       -0.09072881,  0.00198069,  0.05751502, -0.04248039, -0.07017372,
       -0.03435459, -0.07197155, -0.25225294,  0.12287171,  0.08151881,
       -0.16226731,  0.11792457,  0.07550616,  0.01070554,  0.01871989,
        0.12193108,  0.1193144 , -0.02214389,  0.02268989, -0.03233242], dtype=float32)
>> len(model.wv['computer'])
100

기본적으로 100차원 짜리로 만들어지네..

Bag of Words

https://datascienceschool.net/view-notebook/6927b0906f884a67b0da9310d3a581ee/

텍스트를 구성하는 단어를 수치화 하는 방법의 일종

count sort 같은 방식인 점 주의

Word Embeddings

Bag of words와 마찬가지로 텍스트를 구성하는 단어를 수치화 하는 방법의 일종

비지도 학습으로 단어간 상관관계가 학습된다는게 끝내주는 장점

http://colah.github.io/posts/2014-07-NLP-RNNs-Representations/

위 설명 정말 좋다 ㅠ 차원이 단어수 등으로 정해진게 아니라.. 임의로 주는 값이구나.. 중요...

위처럼 단어를 실수 벡터로 만드는 것이, 그냥 integer 하나로 매핑하는 것(Bag of Words) 보다 뭐가 좋은지 이해하는게 중요할 것 같다.

5-gram 으로 word embedding 훈련시키기

위에서 중요한 건 다음 문장이다.

> switching a word with a random word (eg. “cat sat song the mat”), since that will almost certainly make our 5-gram nonsensical.

>

GAN과 마찬가지로 랜덤 치환한게 틀렸다고 확정해버리기 기술이 들어가네!!!

반응형

+ Recent posts