NLP

ganadara·2023년 2월 4일
1

python

목록 보기
9/10
word_to_index['몰라'], word_to_index['네']
---------------------------------------------------------------------------

KeyError                                  Traceback (most recent call last)

~\AppData\Local\Temp\ipykernel_10028\698520244.py in <module>
----> 1 word_to_index['몰라'], word_to_index['네']


KeyError: '네'
encoded_sentences = [] #자연어 -> 숫자 노래 가사 text1
for word in text1:
    try:
        encoded_sentences.append(word_to_index[word])
    except:
        encoded_sentences.append(word_to_index['OOV'])
encoded_sentences
[6,
 6,
 6,
 6,
 6,
 6,
 6,
 2,
 6,
 6,
 1,
 6,
 6,
 6,
 6,
 6,
 6,
 6,
 6,
 6,
 6,
 6,
 6,
 6,
 6,
 6,
 6,
 6,
 6,
 6,
 6,
 6,
 6,
 6,
 6,
 6,
 6,
 3,
 6,
 6,
 6,
 6,
 2,
 6,
 6,
 6,
 6,
 1,
 6,
 6,
 6,
 6,
 3,
 6,
 4,
 5,
 6,
 6,
 6,
 6,
 6,
 6,
 6,
 6,
 6,
 6,
 6,
 6,
 6,
 6,
 6,
 6,
 6,
 6,
 6,
 6,
 6,
 6,
 6,
 6,
 6,
 6,
 6,
 6,
 6,
 6,
 6,
 6,
 6,
 6,
 6,
 6,
 6,
 6,
 6,
 1,
 6,
 6,
 6,
 6,
 3,
 6,
 4,
 5,
 6,
 6,
 6,
 6,
 6,
 6,
 6,
 6,
 6,
 6,
 6,
 6,
 6,
 6,
 6,
 6,
 6,
 6,
 6,
 6,
 6,
 6,
 6,
 6,
 6,
 6,
 6,
 6,
 6,
 1,
 6,
 6,
 6,
 6,
 6,
 6,
 6,
 6,
 6,
 1,
 6,
 6,
 6,
 6,
 6,
 6,
 6,
 6,
 6,
 2,
 6,
 6,
 6,
 6,
 6,
 6,
 6,
 6,
 6,
 6]
word_to_index["몰라"], word_to_index["네"] #word_to_index["네"] = 에러
---------------------------------------------------------------------------

KeyError                                  Traceback (most recent call last)

~\AppData\Local\Temp\ipykernel_10028\3519756355.py in <module>
----> 1 word_to_index["몰라"], word_to_index["네"]


KeyError: '네'
ly = list(zip(text1, encoded_sentences))
ly
[('난', 6),
 ('땅', 6),
 ('에서도', 6),
 ('숨', 6),
 ('을', 6),
 ('쉴', 6),
 ('수', 6),
 ('있는', 2),
 ('물고기', 6),
 ('였을지도', 6),
 ('몰라', 1),
 ('가끔', 6),
 ('내', 6),
 ('맘', 6),
 ('을', 6),
 ('이해', 6),
 ('못', 6),
 ('하는', 6),
 ('사람', 6),
 ('들', 6),
 ('을', 6),
 ('만나도', 6),
 ('상관없어', 6),
 ('물속', 6),
 ('을', 6),
 ('헤엄', 6),
 ('치는', 6),
 ('건', 6),
 ('하늘', 6),
 ('을', 6),
 ('나', 6),
 ('는', 6),
 ('기분', 6),
 ('과', 6),
 ('같을까', 6),
 ('?', 6),
 ('넌', 6),
 ('잠시', 3),
 ('땅', 6),
 ('에서', 6),
 ('쉬', 6),
 ('고', 6),
 ('있는', 2),
 ('자유롭게', 6),
 ('나', 6),
 ('는', 6),
 ('새였을지', 6),
 ('몰라', 1),
 ('우', 6),
 ('언', 6),
 ('젠', 6),
 ('간', 6),
 ('잠시', 3),
 ('널', 6),
 ('떠나', 4),
 ('어디', 5),
 ('론', 6),
 ('가', 6),
 ('사라져도', 6),
 ('넌', 6),
 ('걱정', 6),
 ('마', 6),
 ('네', 6),
 ('가', 6),
 ('날', 6),
 ('바로', 6),
 ('찾을', 6),
 ('수', 6),
 ('있게', 6),
 ('작은', 6),
 ('타투', 6),
 ('를', 6),
 ('새긴', 6),
 ('후', 6),
 ('다녀올게', 6),
 ('사실', 6),
 ('우린', 6),
 ('어쩌면', 6),
 ('조금씩', 6),
 ('남', 6),
 ('들', 6),
 ('과', 6),
 ('다른', 6),
 ('게', 6),
 ('아닐까', 6),
 ('거친', 6),
 ('바람', 6),
 ('에도', 6),
 ('꺼지지', 6),
 ('않는', 6),
 ('작고', 6),
 ('따뜻한', 6),
 ('촛불', 6),
 ('이', 6),
 ('될지', 6),
 ('몰라', 1),
 ('우', 6),
 ('언', 6),
 ('젠', 6),
 ('간', 6),
 ('잠시', 3),
 ('널', 6),
 ('떠나', 4),
 ('어디', 5),
 ('론', 6),
 ('가', 6),
 ('사라져도', 6),
 ('넌', 6),
 ('걱정', 6),
 ('마', 6),
 ('네', 6),
 ('가', 6),
 ('날', 6),
 ('바로', 6),
 ('찾을', 6),
 ('수', 6),
 ('있게', 6),
 ('작은', 6),
 ('타투', 6),
 ('를', 6),
 ('새긴', 6),
 ('후', 6),
 ('다녀올게', 6),
 ('우', 6),
 ('언젠가', 6),
 ('물이', 6),
 ('다', 6),
 ('말라', 6),
 ('편안하게', 6),
 ('숨', 6),
 ('쉴', 6),
 ('수', 6),
 ('없을지', 6),
 ('몰라', 1),
 ('우', 6),
 ('외롭게', 6),
 ('다시', 6),
 ('돌아와', 6),
 ('떠났던', 6),
 ('마음', 6),
 ('을', 6),
 ('후회', 6),
 ('할지도', 6),
 ('몰라', 1),
 ('너', 6),
 ('만은', 6),
 ('나를', 6),
 ('알아봐야', 6),
 ('해', 6),
 ('너', 6),
 ('만', 6),
 ('알', 6),
 ('수', 6),
 ('있는', 2),
 ('내', 6),
 ('마음', 6),
 ('을', 6),
 ('복잡한', 6),
 ('나', 6),
 ('만의', 6),
 ('언어', 6),
 ('를', 6),
 ('알아봐', 6),
 ('줘', 6)]
from tensorflow.keras.preprocessing.text import Tokenizer
text = [['오늘','보고','싶다'],
        ['다시','안아','보고','싶다'],
        ['오늘'],
        [],
        [],
        [],
        ['오늘'],
        ['다시'],
        ['보고','싶다'],
        ['오늘','보고','싶다'],
        ['다시','안아','보고','싶다'],
        ['오늘'],
        [],
        ['보고','싶다']]
tokenizer = Tokenizer()
tokenizer.fit_on_texts(text)
tokenizer.word_index
{'보고': 1, '싶다': 2, '오늘': 3, '다시': 4, '안아': 5}
tokenizer.word_counts
OrderedDict([('오늘', 5), ('보고', 6), ('싶다', 6), ('다시', 3), ('안아', 2)])
tokenizer.texts_to_sequences(text)
[[3, 1, 2],
 [4, 5, 1, 2],
 [3],
 [],
 [],
 [],
 [3],
 [4],
 [1, 2],
 [3, 1, 2],
 [4, 5, 1, 2],
 [3],
 [],
 [1, 2]]
vocab_size = 4
tok = Tokenizer(num_words = vocab_size + 1)
tok.fit_on_texts(text)
words_freq_cut = [word for word, index in tok.word_index.items()
              if index >= vocab_size + 1]
for word in words_freq_cut:
    del tok.word_index[word]
    del tok.word_counts[word]
print(tok.word_index)
print(tok.word_counts)
print(tok.texts_to_sequences(text))
{'보고': 1, '싶다': 2, '오늘': 3, '다시': 4}
OrderedDict([('오늘', 5), ('보고', 6), ('싶다', 6), ('다시', 3)])
[[3, 1, 2], [4, 1, 2], [3], [], [], [], [3], [4], [1, 2], [3, 1, 2], [4, 1, 2], [3], [], [1, 2]]
vocab_size = 3
tok_oov = Tokenizer(num_words = vocab_size + 2, oov_token="OOV") #0, OOV
tok_oov.fit_on_texts(text)
words_freq_cut = [word for word, index in tok_oov.word_index.items()
              if index >= vocab_size + 1]
for word in words_freq_cut:
    del tok_oov.word_index[word]
    del tok_oov.word_counts[word]
print(tok_oov.word_index)
print(tok_oov.word_counts)
print(tok_oov.texts_to_sequences(text))
encoded_text = tok_oov.texts_to_sequences(text)
{'OOV': 1, '보고': 2, '싶다': 3}
OrderedDict([('보고', 6), ('싶다', 6)])
[[1, 2, 3], [1, 1, 2, 3], [1], [], [], [], [1], [1], [2, 3], [1, 2, 3], [1, 1, 2, 3], [1], [], [2, 3]]

padding

직사각형을 만들기위해서 패딩을 얼마나 해야 하나
vocab사이즈를 안 정해졌다면 vocab사이즈를 정할 수 있는 방법은
vocab사이즈를 정해야 한다. 안 정하면 알고리즘이 흔들린다.

word_to_index = {}
i = 0
for (word, freq) in  vocab_sorted:
    if freq > 1:
        i += 1
        word_to_index[word] = i
word_to_index

길이가 가장 긴 문장의 길이 추출 후 길이가 짧은 문장에 대하여 나머지 부분을 0으로 채워줌
문장마다 길이가 다름

max(len(item) for item in encoded_text)
4
MAX_LEN = 4
for sentence in encoded_text:
    while len(sentence) < MAX_LEN:
        sentence.append(0)
encoded_text
[[1, 2, 3, 0, 0],
 [1, 1, 2, 3, 0],
 [1, 0, 0, 0, 0],
 [0, 0, 0, 0, 0],
 [0, 0, 0, 0, 0],
 [0, 0, 0, 0, 0],
 [1, 0, 0, 0, 0],
 [1, 0, 0, 0, 0],
 [2, 3, 0, 0, 0],
 [1, 2, 3, 0, 0],
 [1, 1, 2, 3, 0],
 [1, 0, 0, 0, 0],
 [0, 0, 0, 0, 0],
 [2, 3, 0, 0, 0]]
from tensorflow.keras.preprocessing.sequence import  pad_sequences
tokenizer = Tokenizer()
tokenizer.fit_on_texts(text)
enc = tokenizer.texts_to_sequences(text)
enc
[[3, 1, 2],
 [4, 5, 1, 2],
 [3],
 [],
 [],
 [],
 [3],
 [4],
 [1, 2],
 [3, 1, 2],
 [4, 5, 1, 2],
 [3],
 [],
 [1, 2]]
padded = pad_sequences(enc)
padded

#앞에 0을 채우는 것이 기본이다.
#자연어 처리에서 시간의 흐림이 중요해서 뒤엥 이쓴 값이 중요해서 앞에 0을 채워서 중요한 값을 뒤로 보냄
array([[0, 3, 1, 2],
       [4, 5, 1, 2],
       [0, 0, 0, 3],
       [0, 0, 0, 0],
       [0, 0, 0, 0],
       [0, 0, 0, 0],
       [0, 0, 0, 3],
       [0, 0, 0, 4],
       [0, 0, 1, 2],
       [0, 3, 1, 2],
       [4, 5, 1, 2],
       [0, 0, 0, 3],
       [0, 0, 0, 0],
       [0, 0, 1, 2]])
padded = pad_sequences(enc, padding="post")
padded
array([[3, 1, 2, 0],
       [4, 5, 1, 2],
       [3, 0, 0, 0],
       [0, 0, 0, 0],
       [0, 0, 0, 0],
       [0, 0, 0, 0],
       [3, 0, 0, 0],
       [4, 0, 0, 0],
       [1, 2, 0, 0],
       [3, 1, 2, 0],
       [4, 5, 1, 2],
       [3, 0, 0, 0],
       [0, 0, 0, 0],
       [1, 2, 0, 0]])
from konlpy.tag import Okt
okt = Okt()
tokens = okt.morphs("나는 자연어 처리를 배우는 거겠지?")
tokens
['나', '는', '자연어', '처리', '를', '배우는', '거', '겠지', '?']

pandas에서의 원핫인코딩

pandas - get_dummies()
sklearn - OneHotEnocoder, tf.keras

text = "나는 자연어 처리를 배우는 거겠지 자연어 처리를 없지 않기를 바라"
text
'나는 자연어 처리를 배우는 거겠지 자연어 처리를 없지 않기를 바라'
from tensorflow.keras.preprocessing.text import Tokenizer
from tensorflow.keras.utils import to_categorical
import pandas as pd
tok = Tokenizer()
tok.fit_on_texts([text])
print(tok.word_index)
{'자연어': 1, '처리를': 2, '나는': 3, '배우는': 4, '거겠지': 5, '없지': 6, '않기를': 7, '바라': 8}
sub_text = "나는 어렵지 않기를 바라"
enc1 = tok.texts_to_sequences([sub_text])[0]
enc1
[3, 7, 8]
ohe1 = to_categorical(enc1)
ohe1
array([[0., 0., 0., 1., 0., 0., 0., 0., 0.],
       [0., 0., 0., 0., 0., 0., 0., 1., 0.],
       [0., 0., 0., 0., 0., 0., 0., 0., 1.]], dtype=float32)
#get_dummy()
X = ["b", "r", "r", "g", "g"] #옷 색깔
y = [0, 1, 1, 0, 0] #구조 여부

df1 = pd.DataFrame(data = {"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
from sklearn.preprocessing import OneHotEncoder
ohe = OneHotEncoder(sparse=False)
ohe.fit_transform(df1)
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_

소프트맥스 원핫인코딩

분류?
원핫인코딩 정리하기

원핫인코딩 vs 라벨인코딩

one hot encoding - 우선순위를 오해할 수 있기에 vs label encoding - '라벨링', sklearn

  • 원핫인코딩

중요도가 그대로 반영된다.
1. 처리할 차원이 늘어난다.
2. 차원이 많다는 것은 서로의 연관성이 깨졌다. 독립적인 관계로 떨어졌다.
처리할 차원이 늘어져서 연산의 부담이 생긴다. 차원이 갈리기 때문에
랜덤포레스트는 depth한번에 컬럼쪼개지는 것이 다르다. depth가 늘어날 때 마다 따로따로 관리됨 -> 잘못됨 = 원핫인코딩의 문제
연산의 부담은 주지만 헷갈리게 하지 않는다,

  • 라벨인코딩
    라벨인코딩의 치명적인 이유는 왜 2가 생기고 왜 2이고, 오해가 생긴다.
    라벨인코딩을 쓰지는 않는다.
items = ["남자", "여자","여자","남자","여자"]
from sklearn.preprocessing import LabelEncoder
le = LabelEncoder()
le.fit_transform(items)
array([0, 1, 1, 0, 1], dtype=int64)
X = ["b", "r", "r", "g", "g"] #옷 색깔
y = [0, 1, 1, 0, 0] #구조 여부
le = LabelEncoder()
le.fit_transform(X)
array([0, 2, 2, 1, 1], dtype=int64)

언어모델

음성 : 주파수 분석 -> 단어
아버지가 방에 들어간신다 : 아버지와 빵에돌아가신다(초기 언어모델)

profile
DL 공부중

1개의 댓글

comment-user-thumbnail
2023년 2월 16일

🐶

답글 달기