https://wikidocs.net/22883

 

1) 내부 단어의 학습

- FastText에서는 각 단어는 글자 단위 n-gram의 구성으로 취급한다.

- n을 몇으로 결정하는지에 따라서 단어들이 얼마나 분리되는지 결정된다.

# n = 3인 경우
<ap, app, ppl, ple, le>, <apple>

- 실제 사용할 때는 n의 최소값과 최대값으로 범위를 설정할 수 있는데, 기본값으로 각 3과 6으로 설정되어져 있다.

# n = 3 ~ 6인 경우
<ap, app, ppl, ppl, le>, <app, appl, pple, ple>, <appl, pple>, ..., <apple>

- 단어의 벡터 값 = 내부 단어들의 벡터값 총 합

apple =
<ap + app + ppl + ppl + le>
+
<app + appl + pple + ple>
+
<appl + pple>
+ , ..., +
<apple>

 

2) 모르는 단어 (Out Of Vocabulary, OOV)에 대한 대응

- FastText의 인공 신경망을 학습한 후에는 데이터 셋의 모든 단어의 각 n-gram에 대해서 워드 임베딩 된다.

- 데이터 셋만 충분하다면 내부 단어를 통해 모르는 단어에 대해서도 다른 단어와의 유사도를 계산할 수 있다.

- ex) 'birthplace'란 단어를 'birth', 'place'라는 내부 단어가 있었다면 'birthplace'의 벡터를 얻을 수 있다.

 

3) 단어 집합 내 빈도 수가 적었던 단어(Rare Word)에 대한 대응

- 희귀 단어라도, 단어의 n-gram이 다른 단어의 n-gram과 겹치는 경우라면 비교적 높은 임베딩 벡터값을 얻는다.

- 코퍼스에 오타나 맞춤법이 틀린 단어가 있는 경우, FastText는 이에 대해 일정 수준의 성능을 보인다.

 

 

https://wikidocs.net/33520

 

워드임베딩

- 단어를 벡터로 표현하는 방법

- 단어를 밀집 표현으로 변환

 

원-핫 인코딩 : 단어 집합의 크기를 벡터의 차원으로 하고, 표현하고 싶은 단어의 인덱스에 1의 값을 부여하고, 다른 인덱스에는 0을 부여하는 단어의 벡터 표현 방식

 

1) 희소 표현

- 벡터 또는 행렬의 값이 대부분 0으로 표현되는 방법

- 원-핫 벡터 = 희소 벡터

- 단어의 개수가 늘어나면 벡터의 차원이 한없이 커진다. -> 공간적 낭비

 

2) 밀집 표현

- 희소 표현과 반대되는 표현

- 사용자가 설정한 값으로 모든 단어의 벡터 표현의 차원을 맞춘다.

- 0과 1 뿐 아니라 다른 실수값을 가지게 된다.

 

3) 워드 임베딩

- 단어를 밀집 벡터의 형태로 표현하는 방법

- 임베딩 벡터 : 밀집 벡터를 워드 임베딩 과정을 통해 나온 결과

- 케라스 Embedding() : 단어를 랜덤한 값을 가지는 밀집 벡터로 변환한 뒤에 인공 신경망의 가중치를 학습하는 것과 같은 방식으로 단어 벡터를 학습하는 방법을 사용

https://wikidocs.net/83544

위 내용을 참고하여 정리

 

1) Numpy로 패딩하기

import numpy as np
from tensorflow.keras.preprocessing.text import Tokenizer
preprocessed_sentences = [['barber', 'person'], ['barber', 'good', 'person'], 
['barber', 'huge', 'person'], ['knew', 'secret'], ['secret', 'kept', 'huge', 'secret'], 
['huge', 'secret'], ['barber', 'kept', 'word'], ['barber', 'kept', 'word'], 
['barber', 'kept', 'secret'], ['keeping', 'keeping', 'huge', 'secret', 'driving', 'barber', 'crazy'], 
['barber', 'went', 'huge', 'mountain']]

// 단어 집합을 만들고, 정수 인코딩을 수행
tokenizer = Tokenizer()
tokenizer.fit_on_texts(preprocessed_sentences)
encoded = tokenizer.texts_to_sequences(preprocessed_sentences)
print(encoded)

모든 단어가 고유한 정수로 변환

 

- 모두 동일한 길이로 맞춰주기 위해 가장 길이가 긴 문장의 길이를 계산한다.

max_len = max(len(item) for item in encoded)
print('최대 길이 :',max_len)

최대 길이 : 7

 

- 가장 길이가 긴 문장의 길이는 7이므로 모든 문장의 길이를 7로 맞춘다.  데이터에 특정 값을 채워 데이터 크기를 조정하는 것을 패딩이라고 한다. 숫자 0을 사용하고 있다면 제로 패딩이라고 한다.

for sentence in encoded:
    while len(sentence) < max_len:
        sentence.append(0)

padded_np = np.array(encoded)
padded_np

 

 

2) 케라스 전처리 도구로 패딩하기

케라스에서는 패딩을 위한 pad_sequences()를 제공하고 있다.

padded = pad_sequences(encoded)
padded

 

- pad_sequences는 기본적으로 문서의 앞에 0으로 채우기 때문에 Numpy와의 패딩 결과가 다르다. 뒤에 0을 채우고 싶다면 인자로 padding='post'를 해주면 된다.

padded = pad_sequences(encoded, padding='post')
padded

 

- 꼭 가장 긴 문서의 길이를 기준으로 해야하는 것은 아니다. 길이에 제한을 두고 패딩할 수 있다. maxlen의 인자로 정수를 주면, 해당 정수로 모든 문서의 길이를 동일하게 한다. 길이가 maxlen보다 짧은 문서들은 0으로 패딩되고, 긴 문서는 데이터가 손실된다. 

padded = pad_sequences(encoded, padding='post', maxlen=5)
padded

 

- 기본적으로 앞쪽의 데이터가 손실되는데 뒤의 단어가 삭제되도록 하려면 truncating='post' 를 주면 된다.

 

Pandas

  • 데이터를 효과적으로 처리하고 보여줄 수 있도록 도와주는 라이브러리
  • Numpy와 함께 사용되어 다양한 연계적인 기능을 제공
  • 인덱스에 따라 데이터를 나열하므로 사전 자료형에 가까움
  • 시리즈를 기본적인 자료형으로 사용
  • 엑셀과 유사

- 시리즈 (Series)

: 인덱스와 값으로 구성

{
     name : '철수',
     age : '20'
}

0 : 철수, 20
1 : 홍길동, 40
import pandas as pd

array=pd.Series(['사과', '바나나', '당근'], index=['a', 'b', 'c'])
print(array)
# a  사과
# b  바나나
# c  당근

print(array['a']) #사과
import pandas as pd

data = {
    'a': '사과',
    'b': '바나나',
    'c': '당근'
}

# Dict 자료형을 Series로 바꾸기
array = pd.Series(data)
print(array['a']) #사과

 

- 데이터 프레임

  • 다수의 시리즈를 모아 처리하기 위한 목적으로 사용
  • 표 형태로 데이터를 손쉽게 출력하고자 할 때 사용
import pandas as pd

word_dict = {
    'Apple': '사과',
    'Banana': '바나나',
    'Carrot': '당근'
}

frequency_dict = {
    'Apple': 3,
    'Banana': 5,
    'Carrot': 7
}

word = pd.Series(word_dict)
frequency = pd.Series(frequency_dict)

# 이름(Name): 값(Values)
summary = pd.DataFrame({
    'word': word,
    'frequency': frequency
})

print(summary)

 

- 시리즈의 연산

import pandas as pd

word_dict = {
    'Apple': '사과',
    'Banana': '바나나',
    'Carrot': '당근'
}

frequency_dict = {
    'Apple': 3,
    'Banana': 5,
    'Carrot': 7
}

importance_dict = {
    'Apple': 3,
    'Banana': 2,
    'Carrot': 1
}

word = pd.Series(word_dict)
frequency = pd.Series(frequency_dict)
importance = pd.Series(importance_dict)

summary = pd.DataFrame({
    'word': word,
    'frequency': frequency,
    'importance': importance
})

score = summary['frequency'] * summary['importance']
summary['score'] = score

print(summary)

- 데이터 프레임 슬라이싱

import pandas as pd

word_dict = {
    'Apple': '사과',
    'Banana': '바나나',
    'Carrot': '당근',
    'Durian': '두리안'
}

frequency_dict = {
    'Apple': 3,
    'Banana': 5,
    'Carrot': 7,
    'Durian': 2
}

importance_dict = {
    'Apple': 3,
    'Banana': 2,
    'Carrot': 1,
    'Durian': 1
}

word = pd.Series(word_dict)
frequency = pd.Series(frequency_dict)
importance = pd.Series(importance_dict)

summary = pd.DataFrame({
    'word': word,
    'frequency': frequency,
    'importance': importance
})

print(summary)

# 이름을 기준으로 슬라이싱
print(summary.loc['Banana':'Carrot', 'importance':])

# 인덱스를 기준으로 슬라이싱
print(summary.iloc[1:3, 2:])

 

- 데이터 프레임 연산

import pandas as pd

word_dict = {
    'Apple': '사과',
    'Banana': '바나나',
    'Carrot': '당근',
    'Durian': '두리안'
}

frequency_dict = {
    'Apple': 3,
    'Banana': 5,
    'Carrot': 7,
    'Durian': 2
}

importance_dict = {
    'Apple': 3,
    'Banana': 2,
    'Carrot': 1,
    'Durian': 1
}

word = pd.Series(word_dict)
frequency = pd.Series(frequency_dict)
importance = pd.Series(importance_dict)

summary = pd.DataFrame({
    'word': word,
    'frequency': frequency,
    'importance': importance
})

print(summary)

summary.loc['Apple', 'importance'] = 5 # 데이터의 변경
summary.loc['Elderberry'] = ['엘더베리', 5, 3] # 새 데이터 삽입

print(summary)

- 엑셀로 내보내기/불러오기

import pandas as pd

word_dict = {
    'Apple': '사과',
    'Banana': '바나나',
    'Carrot': '당근'
}

frequency_dict = {
    'Apple': 3,
    'Banana': 5,
    'Carrot': 7
}

word = pd.Series(word_dict)
frequency = pd.Series(frequency_dict)

summary = pd.DataFrame({
    'word': word,
    'frequency': frequency
})

summary.to_csv("summary.csv", encoding="utf-8-sig")
saved = pd.read_csv("summary.csv", index_col=0)
print(saved)

 

https://youtu.be/9PF4BAFh-J8

위 영상을 참고하여 작성

+ Recent posts