본문 바로가기
AI 관련/cs224n

0 cs224n 2021 Assignment 1: Exploring Word Vectors

by 세계 최고의 AI Engineer_naknak 2024. 8. 6.
def distinct_words(corpus):
	corpus_words = []
    num_corpus_words = -1
    
    corpus_words = numpy.sorted(set([word for word in corpus_words]))
    num_corpus_words = len(corpus_words)
    
    return corpus_words, num_corpus_words

참고 깃허브 : https://github.com/datamarket-tobigs/Text-Seminar-1314

 

GitHub - datamarket-tobigs/Text-Seminar-1314: [Tobigs] CS224N lecture & assignment solution

[Tobigs] CS224N lecture & assignment solution. Contribute to datamarket-tobigs/Text-Seminar-1314 development by creating an account on GitHub.

github.com

추후 공부할 사이트 : https://github.com/ndb796/Deep-Learning-Paper-Review-and-Practice/blob/master/code_practices/Attention_is_All_You_Need_Tutorial_(German_English).ipynb

 

Deep-Learning-Paper-Review-and-Practice/code_practices/Attention_is_All_You_Need_Tutorial_(German_English).ipynb at master · nd

꼼꼼한 딥러닝 논문 리뷰와 코드 실습. Contribute to ndb796/Deep-Learning-Paper-Review-and-Practice development by creating an account on GitHub.

github.com

 

아침마다 기본기를 다지기 위해서 공부를 해야겠다고 생각했고 가장 유명한 CS224N으로 시작해야겠다고 계획을 세웠다. 먼저 강의도 좋지만 과제를 해보면 좋겠다고 생각했기 때문에 이를 진행하려고 한다. 

 

Assignment 1은 Exploring Word Vectors로 단어를 vector 차원으로 mapping 시킬 때 사용된 방법이라고 할 수 있겠다. 

과제는 자체는 어렵지 않다. exploring_word_vectors.ipynb 라는 파일을 클론 코딩 하는 것인데 이를 하기에 앞서 개념을 먼저 잡고 클론 코딩을 하도록 하겠다.

 

Word Vectors를 만들기 위해 co-occurrence matrices와 word2vec 방식이 사용될 수 있다. 동시 발생 matrics는 알다시피 어떤 환경에서 해당 단어가 얼마나 발생되는 지를 counting 해서 matrix를 만든 것이다.

 

이 부분이 이해가 잘 안갔었는데 GPT 도움을 받아서 이해 할 수 있었다. 그니까 행 : 기준단어 - bold, 열 : 윈도우 내에 있는단어임. 그래서 윈도우 사이즈 = 1이므로 기준 단어 START를 생각했을 때 START all, START all로 두 Document의 첫번째 윈도우 사이즈 만큼 잘랐을 때 2번이 발생하므로 all이 2번 카운팅 된다. 이런 식으로 행렬을 만든다.

 

 

Plotting Co-Occurrence Word Embeddings

이를 구현하기 위해 Reuters라는 corpus 를 사용한다고 한다.

from nltk.corpus import reuters 로 가져 올 수 있으니 다운로드의 걱정은 하지 않아도 되겠다. 아무튼 잘해보자.

 

# All Import Statements Defined Here
# Note: Do not add to this list.
# All the dependencies you need, can be installed by running .
# ----------------

import sys
assert sys.version_info[0]==3
assert sys.version_info[1] >= 5

from gensim.models import KeyedVectors
from gensim.test.utils import datapath
import pprint
import matplotlib.pyplot as plt
plt.rcParams['figure.figsize'] = [10, 5]
import nltk
nltk.download('reuters')
from nltk.corpus import reuters
import numpy as np
import random
import scipy as sp
from sklearn.decomposition import TruncatedSVD
from sklearn.decomposition import PCA

START_TOKEN = '<START>'
END_TOKEN = '<END>'

np.random.seed(0)
random.seed(0)
# ----------------

위 코드는 base 코드로 가장 먼저 실행되어야 할 코드

 

def read_corpus(category="crude"):
    files = reuters.fileids(category)
	return [[START_TOKEN] + [w.lower() for w in list(reuters.words(f))] + [END_TOKEN] for f in files]
    
reuters_corpus = read_corpus()
pprint_.pprint(reuters_corpus[:3], compact=True, width=100)

이렇게 corpus를 불러 올 수 있다.

 

Question 1.1: Implement `distinct_words`

동시 발생 행렬을 만들 때 중복 단어가 있으면 곤란하게 되겠다. 이를 제거하기 위한 코드를 작성하란다.

loop를 사용해도 되지만 python list comprehensions를 사용하면 더 효율적일거라고 한다.  그리고 python sets를 사용해서 중복 단어를 제거하라고 한다.

 

#%%
def distinct_words(corpus):
    corpus_words = []
    num_corpus_words = -1
    
    # ------------------
    # Write your implementation here.
    
    corpus_words = sorted(list(set([token for list in corpus for token in list]))) # 앞에서 뒤로 넘어가야함
    num_corpus_words = len(corpus_words)
    
    # ------------------

    return corpus_words, num_corpus_words
#%%
# ---------------------
# Run this sanity check
# Note that this not an exhaustive check for correctness.
# ---------------------

# Define toy corpus
test_corpus = ["START All that glitters isn't gold END".split(" "), "START All's well that ends well END".split(" ")]
test_corpus_words, num_corpus_words = distinct_words(test_corpus)
print("test_corpus_words : ", test_corpus_words)

# Correct answers
ans_test_corpus_words = sorted(list(set(["START", "All", "ends", "that", "gold", "All's", "glitters", "isn't", "well", "END"])))
print("ans_test_corpus_words : ", ans_test_corpus_words)
ans_num_corpus_words = len(ans_test_corpus_words)

# Test correct number of words
assert(num_corpus_words == ans_num_corpus_words), "Incorrect number of distinct words. Correct: {}. Yours: {}".format(ans_num_corpus_words, num_corpus_words)

# Test correct words
assert (test_corpus_words == ans_test_corpus_words), "Incorrect corpus_words.\nCorrect: {}\nYours:   {}".format(str(ans_test_corpus_words), str(test_corpus_words))

# Print Success
print ("-" * 80)
print("Passed All Tests!")
print ("-" * 80)
# %%

 

2중 for문 in list comprehension 으로 문제를 해결한 것을 확인할 수 있다.

list comprehension을 검색하다가 차원 축소를 진행했던 블로그를 우연히 볼 수 있었다. 몰랐을 때는 list comprehension에 for 문을 반대로 적어서 틀렸었는데 다행인듯 하다.

 

오늘은 여기까지 하고 내일 돌아오겠다.

댓글