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 모듈의 설치방법은 아래와 같습니다.
앞선 시리즈에서 형태소 분석기를 통해 Token을 만들었는데 그것을 이용해서 Word2Vec를 알고리즘을 적용합니다.
자세한 소스코드는 GitHub를 참조해주세요.
word2vector.py
| 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
| 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 방법을 사용하여 특정 단어와 관련된 단어를 찾아줍니다.
관련도 수치가 낮은 게 아쉽긴 합니다만, 관련된 단어라고 생각하는 것들이 나와서 나름 만족 스럽습니다.
다음 시리즈에서는 벡터화된 데이터를 이용하여, 클러스터링을 하면 어떤 결과가 나오는지 확인해보도록 하겠습니다.
긴 글 읽어 주셔서 감사합니다.
공감 버튼은 글쓴이에게 큰 동기부여가 됩니다.