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 방법을 사용하여 특정 단어와 관련된 단어를 찾아줍니다.
관련도 수치가 낮은 게 아쉽긴 합니다만, 관련된 단어라고 생각하는 것들이 나와서 나름 만족 스럽습니다.
다음 시리즈에서는 벡터화된 데이터를 이용하여, 클러스터링을 하면 어떤 결과가 나오는지 확인해보도록 하겠습니다.
긴 글 읽어 주셔서 감사합니다.
공감 버튼은 글쓴이에게 큰 동기부여가 됩니다.
'Data Mining' 카테고리의 다른 글
[Python] 공공데이터 API 사용기 (feat 미세먼지) (3) | 2019.01.15 |
---|---|
[Python]DBSCAN 클러스터링 (with 카톡 대화) (2) | 2018.12.23 |
[Python] 워드클라우드 (with 카톡 대화) (4) | 2018.12.09 |
[Python] 한글 형태소 분석기 Kkma (with 카톡 대화) (2) | 2018.12.08 |
[Python] MySQL 조회 결과를 DataFrame으로 저장하기 (7) | 2018.08.09 |