word2Vec
Word2Vec 에서는 우리가 벡터화하고자 하는 타겟 단어(Target word)의 표현이 해당 단어 주변 단어에 의해 결정됩니다.
단어 벡터를 이렇게 정하는 이유는 분포 가설(Distribution hypothesis) 때문입니다.
분포 가설은 다음과 같습니다.
'비슷한 위치에서 등장하는 단어들은 비슷한 의미를 가진다'
I found good stores.
I found beautiful stores.
두 문장에서 "good 과 beautiful 은 해당 단어 주변에 분포한 단어가 유사하기 때문에 비슷한 의미를 지닐 것이다" 라고 가정하는 것이 분포 가설입니다.
코사인 유사도 함수 구현하기
import numpy as np
def cos_sim(a, b):
"""
코사인 유사도를 구하는 함수입니다.
Args:
a, b : 토큰 벡터입니다 -> array
"""
arr_a = np.array(a)
arr_b = np.array(b)
result = np.dot(arr_a, arr_b)/(np.linalg.norm(arr_a)*np.linalg.norm(arr_b))
return result
print(f"I 와 am 의 코사인 유사도 : {cos_sim(word_dict['I'], word_dict['am'])}")
print(f"I 와 student 의 코사인 유사도 : {cos_sim(word_dict['I'], word_dict['student'])}")
이때 np.linalg.norm은 벡터의 길이를 구하는 것으로 제곱의 합의 루트와, 절댓값끼리의 합으로 구하는 것이 있다.
{'I': [1, 0, 0, 0], 'am': [0, 1, 0, 0], 'a': [0, 0, 1, 0], 'student': [0, 0, 0, 1]}으로 원핫인코딩을 하면 벡터의 내적은 항상 0이어서 유사도를 구할 수 없다.
gensin을 사용해서 여러 메서드 구현하기
wv.similarity(a,b)
유사도구하기
wv.most_similar()
안의 단어와 가장 유사한 단어 가져오기
wv.doesnt_match()
안에 단어중에서 가장 관계없는 것을 가져오기
dict에서 키와 값을 쌍으로 얻기 - items()
for (key, value) in word_index.items():
print(key,value)
keras에서 tokenizer를 활용해서 분류하기
###tokenizer.fit_on_texts(sentences)
단어랑 인덱스랑 합쳐주는 함수
word_index를 보면 단어 : 인덱스의 형태인데 이처럼 만들어주는 것 같다
tokenizer = Tokenizer(num_words = 100)
num_words를 단어 빈도수가 높은 순으로 100개만 사용한다는 의미이다. 나머지는 고려하지 않는다.
tokenizer.fit_on_texts(sentences)
fit_on_texts() 메서드는 문자 데이터를 입력받아서 리스트의 형태로 변환한다.
word_dic = tokenizer.word_index
tokenizer의 word_index 속성은 단어와 숫자의 키-값 쌍을 포함하는 딕셔너리를 반환한다. 이때, 반환 시 자동으로 소문자로 변환되어 들어간다. 그리고 느낌표나 마침표 같은 구두점은 자동으로 제거된다.
참고 : https://han-py.tistory.com/284
tokenizer.texts_to_sequences(sentences)
토큰화 된 단어를 정수로
X_encoded #sentences가 문장,문장..인데 얘는 각 문장을 인덱스화하여서 [[각문장의 인덱스], [각문장의 인덱스], ...]의 형태
[[1, 2, 3, 4], [1, 2, 3, 5], [6, 7, 8, 9, 10, 11], [12, 1, 13, 14, 15, 16, 17, 18, 19, 20]]
출처 - https://inuplace.tistory.com/536
https://ebbnflow.tistory.com/154
pad_sequence
분석을 할때에 훈련데이터끼리의 길이가 같지 않을때 길이를 맞춰주는 역할
라벨인코더 활용하기
la = LabelEncoder()
df['v1'] = la.fit_transform(df['v1'])
출처
https://mizykk.tistory.com/10
https://teddylee777.github.io/scikit-learn/labelencoder-%EC%82%AC%EC%9A%A9%EB%B2%95
input_length는 문장의 길이를 의미한다고 함
model.add(Embedding(4736, 150, input_length=150, trainable=False))
케라스에 토큰나이저에 학습시키키
model = Sequential()
model.add(Embedding(4736, 150, input_length=150, trainable=False))
model.add(GlobalAveragePooling1D()) # 입력되는 단어 벡터의 평균을 구하는 함수입니다.
model.add(Dense(1, activation='sigmoid'))
- 이때 학습되는 것은 x_train의 토큰화되고 패딩 처리된 것
- 임베딩시 처음은 입력되는 토큰의 개수, 다음은 원하는 차원,
- input_length는 원하는 문장의 길이
'딥러닝' 카테고리의 다른 글
[파이썬] 딥러닝에서 하이퍼 파리미터 조정하기 (0) | 2022.12.08 |
---|---|
[자연어처리] 자연어 처리 기본 (0) | 2022.11.16 |
[딥러닝] 딥러닝 기본 공부 (0) | 2022.11.12 |
[딥러닝] 활성화 함수와 출력층 함수 (0) | 2022.11.10 |
[딥러닝] 순전파와 역전파 (0) | 2022.11.10 |