Comment :
Udacity DeepLearning - RNN Lesson 5: Embeddings & Word2Vec에서의 Word2Vec 예시 코드를 보다가 약간... 코드문제같은 부분이 있어서 이처럼 문제로 작성하였다.
Implement a function get_target
that receives a list of words, an index, and a window size, then returns a list of words in the window around the index.
글로 읽으니 직관적으로 와닿지가 않는다. 아래의 예시를 보자
words
: 숫자값(타입은 str)들이 나열된 리스트idx
: 입력 리스트에서 (특정값의) 기준이 될 값의 위치 인덱스window_size
: 앞뒤 n개의 값에서의 n의 범위ex)
words
= ['13', '486', '741', '69', '0', '896', '5533', '147', '96', '117']
idx
= 2
window_size
= 5
[!] 1~window_size
범위내에서 랜덤으로 1개의 정수값을 뽑는다. 만약 2가 나왔다고 하면
output
= ['13', '486', '69', '0']
def get_target(words,
idx,
window_size=5):
R = np.random.randint(1, window_size+1)
start = idx - R if (idx-R) > 0 else 0
stop = idx + R
target_words = words[start:idx] + words[idx+1:stop+1]
return list(target_words)
간단하게 리스트의 요소값은 숫자 String이지만 따옴표없이, 알파벳으로 대체해보자
words
= [A, B, C, D, E, F, G, H, I, J]
idx
= 2
window_size
= 5
랜덤으로 돌린 R
값이 2가 나왔다고하면
우리가 원하는 반환값은 [A, B, D, E]
이다. 이는 words
리스트의 0~1 슬라이싱과 3~4 슬라이싱 값을 합친것이다. Python의 슬라이싱 및 인덱스 규칙에 의해서 words
리스트의 idx-R ~ idx
값이 앞부분, idx+1 ~ idx+R+1
값이 뒷부분이 된다. [+] idx
에 해당하는 자기자신 값은 빠져야하므로 이와같이 된다.
idx
값 기준으로 앞부분을 R
만큼 떼가야하는데 idx
값이 R
보다 작으면? 예를 들어서 그냥 idx
값이 0이면 앞에 있는 값이 없음! 따라서 if문을 통해서 idx > R
을 확인해주고 False일 경우 start 인덱스 값인 start
를 0으로 해줘야한다.
li = [1,2,3,4,5,6,7,8,9,10]
print(li[11:12])
>>>
[]
위와 같이 Python에서 리스트의 인덱스를 벗어나는 값으로 슬라이싱하면 단순히 빈 리스트를 반환한다. 따라서 문제없음