심심해서 하는 블로그 :: [Python] Word2Vec으로 관련 키워드 찾기 (with 카톡 대화)


Github > https://github.com/ssooni/data_mining_practice

- 자세한 소스코드는 Github에 올렸습니다.

- 데이터 파일도 올려 드리고 싶지만 실제 카카오톡 대화내용이라 일부분만 올렸습니다.

- 소스코드는 짬짬히 업로드할 예정입니다.




Word to Vector

Word2Vec은 간단하게 텍스트를 숫자로 변환하는 것을 의미합니다.

컴퓨터가 모든 텍스트의 의미를 이해해서, Context를 잘 잡아낸다면 굳이 이런 작업을 하지 않아도 됩니다.

하지만 아직까지 컴퓨터는 숫자로 이루어진 세계에 대한 연산을 더 잘 합니다. 

숫자로 이루어진 세계에서 마치 컴퓨터가 우리가 글을 이해하는 듯한 알고리즘을 적용한다면 문맥을 이해할 수 있지 않을까? 하는 취지에서 시작되었습니다.


그렇다면 텍스트를 특정한 벡터 좌표로 표현할려면 어떤 방법들이 있을까요.

하나는 각각의 차원에 텍스트가 가질 수 있는 특성을 부여하는 방법입니다.



각각의 차원에 특성을 두고 사람과 닭이 가지는 특성에 맞게 배치를 하였습니다. 

사람과 닭은 예제에서 보여준 4가지의 속성에 따라 서로 구분이 가능하다는 것을 알 수 있습니다.

하지만 원숭이와 사람을 이 속성이 따라 구분하면 어떻게 될까요?



사람과 원숭이는 4가지의 속성으로는 서로 구분이 가기 힘듭니다.

따라서 우리는 사람과 원숭이를 구분할 수 있는 특성을 추가적으로 넣어야 합니다.

이렇게 계속 다른 것과 구분을 하기 위해 특성을 추가하다보면 이 세상 모든 단어를 표현하는데 필요한 차원은 무한대에 가까울 것입니다.

그리고 그런 특성을 사람이 일일히 부여하는 것은 매우 피곤한 일입니다.


CBOW 방법 vs Skip-Gram 방법

그래서 이번에는 다른 방법을 사용하여, 텍스트를 벡터로 표현하고자 합니다.

 


위의 문제가 주어졌을 때 운동이나 밥, 노래들을 잘하는지는 이전 또는 이후 문장을 확인해야 알 수 있습니다. 

주변의 단어를 통해 중심 단어를 추측하는 방법이 CBOW 방법입니다.  



반대로 Skip-Gram 방법은 어떤 단어가 등장했을 때 근접한 단어가 발생하는 양상을 측정하는 방법입니다.

노래라는 중심 단어를 기준으로 앞뒤 N개의 단어가 등장하는 확률을 구하여 Vector로 만들어 줍니다.



관련 키워드 찾기

Word2Vec 모듈의 설치방법은 아래와 같습니다.

>> pip install word2vec


앞선 시리즈에서 형태소 분석기를 통해 Token을 만들었는데 그것을 이용해서 Word2Vec를 알고리즘을 적용합니다.

자세한 소스코드는 GitHub를 참조해주세요.





word2vector.py


1
2
3
4
5
6
7
8
9
10
11
12
13
14
def create_model(filename, skip_gram=False):
    tokens = pd.read_csv(filename)
    tokens = tokens[tokens["contents"].apply(lambda x: 'http' not in x)]
 
    sentence = tokens["token"].apply(lambda x: ast.literal_eval(x)).tolist()
    
    if skip_gram:
        model = Word2Vec(sentence, min_count=10, iter=20, size=300, sg=1)
    else:
        model = Word2Vec(sentence, min_count=10, iter=20, size=300, sg=0)
 
    model.init_sims(replace=True)
    model.save("./result/embedding.model")
 
cs


line 3

카카오톡의 대화 내용 중에서 링크를 첨부하는 경우를 제외하였습니다. 


line 5

Word2Vec의 Sentence는 iterable한 자료형이 들어가면 됩니다.

저는 이전 시리즈에서 형태소 분석기로 Tokenize한 결과를 넣었습니다.


line 7-10

Skip Gram 방법을 사용할지 CBOW 방법을 사용할지 선택합니다.

각각의 파라미터는 반드시 똑같이 따라 하실 필요는 없습니다.


size : 몇 차원의 Vector를 만들지 여부를 결정합니다.

min_count : 특정 빈도수 이상 발생한 단어에 대하여 Embedding을 합니다.

iter: 반복 횟수


line 13

완성된 모델을 파일로 저장합니다.


word2vector.py

1
2
3
4
5
def most_similar():
    model = Word2Vec.load("./result/embedding.model")
    print("용돈과 관련된 키워드 : ", model.most_similar("용돈"))
    print("졍이와 관련된 키워드 : ", model.most_similar("졍이"))
    print("쭈니와 관련된 키워드 : ", model.most_similar("쭈니"))
cs


line 2

앞서 생성한 모델을 읽어드립니다.


line 3 - 5

most_similar 함수는 Word Vector에 Cosine 값을 내적을 통해 구한 뒤 그 값이 클수록 유사하다는 Cosine Similarity 방법을 사용하여 특정 단어와 관련된 단어를 찾아줍니다. 



관련도 수치가 낮은 게 아쉽긴 합니다만, 관련된 단어라고 생각하는 것들이 나와서 나름 만족 스럽습니다.

다음 시리즈에서는 벡터화된 데이터를 이용하여, 클러스터링을 하면 어떤 결과가 나오는지 확인해보도록 하겠습니다.


긴 글 읽어 주셔서 감사합니다.

공감 버튼은 글쓴이에게 큰 동기부여가 됩니다.

 

,