데이터분석/데이터분석

자연어 처리

이규승 2022. 5. 26. 12:53
728x90

tensorflow 버전때문에 colab을 사용하지않았다.

pip install gensim

 

자연어 처리 - 레이블 인코딩

# 자연어 처리
# Word embedding : 워드를 수치화해서 벡터화
# 카테고리컬 인코딩 : 레이블 인코딩(문자를 숫자화), 원핫 인코딩(0과 1의 조합) 

print('레이블 인코딩 -------')
datas = ['python', 'lan', 'program', 'computer', 'say']
datas.sort() # 정렬
print(datas)

values = []
for x in range(len(datas)):
  values.append(x)

print(values, ' ', type(values))


ㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡ
레이블 인코딩 -------
['computer', 'lan', 'program', 'python', 'say']
[0, 1, 2, 3, 4]   <class 'list'>

 

자연어 처리 - 원핫 인코딩

print('원핫 인코딩 ------')
import numpy as np
onehot = np.eye(len(datas))
print(onehot, ' ', type(onehot))

ㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡ
원핫 인코딩 ------
[[1. 0. 0. 0. 0.]
 [0. 1. 0. 0. 0.]
 [0. 0. 1. 0. 0.]
 [0. 0. 0. 1. 0.]
 [0. 0. 0. 0. 1.]]   <class 'numpy.ndarray'>

 

자연어 처리 - 레이블 인코딩 (클래스사용)

print('레이블 인코딩 : 클래스 사용-----')
from sklearn.preprocessing import LabelEncoder
datas = ['python', 'lan', 'program', 'computer', 'say']
encoder = LabelEncoder().fit(datas)
values = encoder.transform(datas)
print(values, ' ', type(values))
print(encoder.classes_)

ㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡ
레이블 인코딩 : 클래스 사용-----
[3 1 2 0 4]   <class 'numpy.ndarray'>
['computer' 'lan' 'program' 'python' 'say']

 

자연어 처리 - 원핫 인코딩 (클래스사용)

print('원핫 인코딩 : 클래스 사용-----')
from sklearn.preprocessing import OneHotEncoder
labels = values.reshape(-1, 1)
print(labels, ' ',labels.shape)
onehot = OneHotEncoder().fit(labels)
onehotValues = onehot.transform(labels)
print(onehotValues.toarray())

ㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡ

원핫 인코딩 : 클래스 사용-----
[[3]
 [1]
 [2]
 [0]
 [4]]   (5, 1)
[[0. 0. 0. 1. 0.]
 [0. 1. 0. 0. 0.]
 [0. 0. 1. 0. 0.]
 [1. 0. 0. 0. 0.]
 [0. 0. 0. 0. 1.]]

 

밀집표현 

# 밀집 표현 : 단어마다 고유한 일련번호를 매겨서 사용하는 것이 아니라, 유사한 단어들을 비슷한 방향과 힘의 벡터를 갖도록 변환해 사용
# word2vec : 단어의 의미를 다차원 공간에 실수로 벡터화하는 분산표현 기법, 단어 간 유사성을 표현 간능

from gensim.models import word2vec
sentence = [['python', 'lan', 'program', 'computer', 'say']]
model = word2vec.Word2Vec(sentence, vector_size=10, min_count=1) 
print(model)
word_vectors = model.wv
print('word_vectors:', word_vectors)
print('word_vectors_index:,',word_vectors.key_to_index)
print('word_vectors_index:,',word_vectors.key_to_index.keys())
print('word_vectors_index:,',word_vectors.key_to_index.values())
vocabs = word_vectors.key_to_index.keys()
word_vectors_list = [word_vectors[v] for v in vocabs ]
print(word_vectors_list[0], len(word_vectors_list[0]))

ㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡ

Word2Vec<vocab=5, vector_size=30, alpha=0.025>
word_vectors: KeyedVectors<vector_size=30, 5 keys>
word_vectors_index:, {'say': 0, 'computer': 1, 'program': 2, 'lan': 3, 'python': 4}
word_vectors_index:, dict_keys(['say', 'computer', 'program', 'lan', 'python'])
word_vectors_index:, dict_values([0, 1, 2, 3, 4])
[-0.00178742  0.0007881   0.01701117  0.03003091 -0.03100983 -0.0237227
  0.02152958  0.02990996 -0.01671809 -0.01254457  0.02460168 -0.00511157
 -0.01512204  0.02184684 -0.01620053 -0.00605339  0.0095886   0.00330625
 -0.02761738 -0.03149606  0.02437255  0.01690087  0.02252564  0.00254289
  0.02116963 -0.01135122 -0.00315467  0.01922858 -0.02507213 -0.01312034] 30

 

단어 유사도 확인

# 단어 간 유사도(코사인 유사도) 확인 : 두 벡터가 닮은 정도를 정량적(-1 ~ 0 ~ 1)으로 나타낼 수 있다.
print(word_vectors.similarity(w1='python', w2='lan'))
print(word_vectors.similarity(w1='python', w2='say'))

ㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡ

0.1671837
-0.3632388

 

시각화

# 시각화
import matplotlib.pyplot as plt
def plot_func(vocabs, x, y):
    plt.figure(figsize=(8,6))
    plt.scatter(x, y)
    for i, v in enumerate(vocabs):
        plt.annotate(v, xy=(x[i],y[i]))
    
from sklearn.decomposition import PCA # 주성분 분석
pca = PCA(n_components=2)
xys = pca.fit_transform(word_vectors_list)
xs = xys[:,0]
ys = xys[:,1]
plot_func(vocabs, xs, ys)
plt.show()

 

728x90