자연어 처리 - 원-핫 인코딩
원-핫 인코딩
정형데이터 분석, 전처리시 유의
from konlpy.tag import Okt
okt = Okt()
tokens = okt.morphs("나는 자연어 처리를 배우는 거겠지")
tokens
['나', '는', '자연어', '처리', '를', '배우는', '거', '겠지']
one hot encoding vs label encoding
items = ['남자', '여자', '여자', '남자', '여자']
from sklearn.preprocessing import LabelEncoder
le = LabelEncoder()
le.fit_transform(items)
array([0, 1, 1, 0, 1], dtype=int64)
레이블 인코딩은 숫자의 크기가 결과에 영항을 미친다라고 학습할 가능성이 있다. -> 잘 사용하지 않음
원-핫 인코딩
원-핫 인코딩의 한계
- 수학적으로 처리해야할 차원이 늘어나 연산에 부담이 됨
- 각 원소들의 유사도를 표현하지 못함
- pandas: get_dummies
- sklearn: OnHotEncoder
- tf.keras: to_categorical
keras의 to_categorical
text = "나는 자연어 처리를 배우는 거겠지 자연어 처리는 어렵지 않기를 바래"
from keras.preprocessing.text import Tokenizer
from keras.utils import to_categorical
tok = Tokenizer()
tok.fit_on_texts([text])
print(tok.word_index)
{'자연어': 1, '나는': 2, '처리를': 3, '배우는': 4, '거겠지': 5, '처리는': 6, '어렵지': 7, '않기를': 8, '바래': 9}
sub_text = "나는 어렵지 않기를 바래"
enc1 = tok.texts_to_sequences([sub_text])[0]
enc1
[2, 7, 8, 9]
ohe1 = to_categorical(enc1)
ohe1
array([[0., 0., 1., 0., 0., 0., 0., 0., 0., 0.],
[0., 0., 0., 0., 0., 0., 0., 1., 0., 0.],
[0., 0., 0., 0., 0., 0., 0., 0., 1., 0.],
[0., 0., 0., 0., 0., 0., 0., 0., 0., 1.]], dtype=float32)
pandas의 get_dummies
import pandas as pd
X = ['b', 'r', 'r', 'g', 'g']
y = [0, 1, 1, 0, 0]
df1 = pd.DataFrame({'X': X, 'y':y})
df1
X | y | |
---|---|---|
0 | b | 0 |
1 | r | 1 |
2 | r | 1 |
3 | g | 0 |
4 | g | 0 |
pd.get_dummies(df1['X'])
b | g | r | |
---|---|---|---|
0 | 1 | 0 | 0 |
1 | 0 | 0 | 1 |
2 | 0 | 0 | 1 |
3 | 0 | 1 | 0 |
4 | 0 | 1 | 0 |
sklearn의 OneHotEncoder
from sklearn.preprocessing import OneHotEncoder
ohe = OneHotEncoder(sparse=False)
ohe.fit_transform(df1)
C:\Users\user\anaconda3\envs\sesac\lib\site-packages\sklearn\preprocessing\_encoders.py:808: FutureWarning: `sparse` was renamed to `sparse_output` in version 1.2 and will be removed in 1.4. `sparse_output` is ignored unless you leave `sparse` to its default value.
warnings.warn(
array([[1., 0., 0., 1., 0.],
[0., 0., 1., 0., 1.],
[0., 0., 1., 0., 1.],
[0., 1., 0., 1., 0.],
[0., 1., 0., 1., 0.]])
ohe.categories_
[array(['b', 'g', 'r'], dtype=object), array([0, 1], dtype=int64)]
댓글남기기