📊 NLP (Natural Language Processing)


📌 자연어 처리란?

  • 정의
    - 자연어의 의미를 분석하여 컴퓨터를 통해 사람들이 원하는 어떤 결과를 처리할 수 있도록 하는 일을 말한다.

  • 종류
    음성 인식, 문서 요약, 감성 분석, 텍스트 분류, 질의 응답 시스템, 챗봇

  • NLP 처리 전, 전처리 작업
    - 워드 임베딩(Word Embedding)


📊 NLP를 위한 자연어 전처리

📌 워드 임베딩(Word Embedding)이란?

  • 정의
    - 코퍼스(단어, 문장 등)를 수치화해서 벡터로 변경하는 작업
    - 단어를 밀집 벡터(dense vector)의 형태로 표현하는 작업

  • 워드 임베딩 종류

1) 카테고리형 인코딩 : 원-핫 인코딩, 희소벡터
- 특징 : 0 또는 1로 수치화 수행
- 문제점 : 단어 개수가 늘어나면 그만큼 벡터 차원이 늘어난다.

2) 밀집 벡터(워드 임베딩) : 단어의 의미다차원 공간안에 실수로 벡터화 하는 분산 표현 방법



📌 Word2Vec

  • 정의
    - 유사한 의미를 갖는 단어들비슷한 방향이나 크기를 갖도록 변환하여 사용하는 방법
    - word를 vector로 바꿔주는 워드 임베딩 모델

  • word2vec 종류
    - CBOW : 주변 단어로 중심 단어를 예측
    - SkipGram : 중심 단어로 주변 단어를 예측


📌 Word2Vec 실습

1. 라이브러리 Import

from gensim.models import word2vec

2. 데이터 준비

# Word2Vec 모델은 2차원 자연어 데이터를 사용한다.
sentence = [['python', 'program', 'computer', 'language', 'sentence']]

3. Word2Vec 모델 구축
[ word2vec 속성 정리 ]
- sentences 속성 : 전처리된 2차원 코퍼스를 지정
- min_count 속성 : 단어의 최소 빈도수를 지정(1이면 1이외의 단어개수를 갖는 단어는 무시한다.)
- vector_size 속성 : 임베딩 벡터의 차원수를 지정

model = word2vec.Word2Vec(
    sentences=sentence,
    min_count=1,
    vector_size=50
)

4. 단어 벡터 생성
[ Word2Vec 단어 벡터 형태 ]
- key : 원본 단어명
- value : 수치화된 단어벡터

word_vectors = model.wv

5. 단어 벡터 출력

print('word_vectors : ', word_vectors)
# word_vectors :  <gensim.models.keyedvectors.KeyedVectors object at 0x00000187AEDDDAC0>

print('word_vectors index : ', word_vectors.key_to_index)
# word_vectors index :  {'sentence': 0, 'language': 1, 'computer': 2, 'program': 3, 'python': 4}

print('word_vectors keys : ', word_vectors.key_to_index.keys())
# word_vectors keys :  dict_keys(['sentence', 'language', 'computer', 'program', 'python'])

print('word_vectors values : ', word_vectors.key_to_index.values())
# word_vectors values :  dict_values([0, 1, 2, 3, 4])

6. 벡터화 시킨 단어의 벡터 확인

vocabs = word_vectors.key_to_index.keys()
word_vectors_list = [word_vectors[v] for v in vocabs]
print(word_vectors_list[0])
# [-1.0724545e-03  4.7286032e-04  1.0206699e-02  1.8018546e-02
#  -1.8605899e-02 -1.4233618e-02  1.2917743e-02  1.7945977e-02
#  -1.0030856e-02 -7.5267460e-03  1.4761009e-02 -3.0669451e-03
#  -9.0732286e-03  1.3108101e-02 -9.7203208e-03 -3.6320353e-03
#   5.7531595e-03  1.9837476e-03 -1.6570430e-02 -1.8897638e-02
#   1.4623532e-02  1.0140524e-02  1.3515387e-02  1.5257311e-03
#   1.2701779e-02 -6.8107317e-03 -1.8928051e-03  1.1537147e-02
#  -1.5043277e-02 -7.8722099e-03 -1.5023164e-02 -1.8600845e-03
#   1.9076237e-02 -1.4638334e-02 -4.6675396e-03 -3.8754845e-03
#   1.6154870e-02 -1.1861792e-02  9.0322494e-05 -9.5074698e-03
#  -1.9207101e-02  1.0014586e-02 -1.7519174e-02 -8.7836506e-03
#  -7.0199967e-05 -5.9236528e-04 -1.5322480e-02  1.9229483e-02
#   9.9641131e-03  1.8466286e-02]
# -> 개별 단어마다 30개의 차원으로 나눠진 벡터가 만들어진다.
# -> 해당 임베딩 벡터로 다른 단어와 유사도를 측정할 수 있다.

7. 단어 간 유사도 확인

print(word_vectors.similarity(w1='sentence', w2='language'))
# 0.042372987

print(word_vectors.similarity(w1='computer', w2='program'))
# -0.15515572



profile
데이터 사이언티스트를 목표로 하는 개발자

0개의 댓글