자연어의 해석 방향은 무궁무진하다. 단어(word) 가 모여서 문장(sentence) 이 되고, 문장이 모여 글(text) 이 되고, 글이 모여서 말뭉치(corpus)가 된다. 자연어에 대한 통계적 접근은 보통 이 단위들의 빈번도 (frequency) 조사로 시작된다.
tf-idf 를 통해 단어 각각의 빈번도에 대해서 알아보았다면, 이제 단어 간의 같이 출현할 확률과 같이 유기적인 관계에 대해서 조사하는 법을 알아보도록 하자.
두 단어가 같이 출현할 확률이라고 했을 때, 같이 출현하는 것에 대한 범위는 어떻게 정의할 수 있을까. 글 단위? 문장 단위? 아니면 해당 단어 바로 옆? 이를 window size라고 한다. window size가 1이라면, 해당 단어의 바로 앞 뒤의 단어들을 살피고, 5라면, 해당 단어 앞 뒤로 다섯 단어들을 살핀다.
혹시 초중학생 시절, 영단어 책에서 형광필터를 본 적이 있는가? 영단어와 사전 정의가 적힌 페이지 위에 이 형광필터를 살포시 올리면, 사전정의는 안 보이고 단어만 보이게 해주는 그런 신기한 필터였다. 그 형광필터처럼 글에 사이즈가 자유자재로 바뀌는 창문을 얹어놓고, 창문 안에 비춰진 단어들만을 살핀다고 하면 이해가 조금 수월할 것 같다. 그리고 그 창문을 이제 한 단어씩 옆으로 밀어서(slide) 글 내에 단어 간 동시 출현 (co-occurrence)에 대한 통계를 획득하는 거다.
이제 파이썬 코드로 구현해보자.
def sliding_window (document, window_size ) :
words = document.split()
from collections import defaultdict
count_dict = defaultdict(int) #따로 초깃값을 정해주지 않아도 될 수 있도록 defaultdict 호출
for i, word in enumerate(words) : # iterate over index and word
for co_word in words[ i-window_size : i+window_size] : #같이 출현한 co_word는 word의 +-window_size 범위 내에 있다.
if word != co_word :
count_dict[(word, co_word)] += 1
return count_dict
'NLP' 카테고리의 다른 글
선택 선호도 (selectional preference) (0) | 2020.03.31 |
---|---|
자연어 처리 (0) | 2020.03.28 |