이번 글에서는 저번 자연어 처리 글과 관련되어 있는 하나의 주제인 one-hot encoding 에 대하여 알아보고 코딩으로 구현해보려고 합니다.
-원핫 인코딩이란?
범주형 데이터를 수치데이터(벡터)로 바꾸는 방법
ex) 빨강, 파랑, 초록이 있을때
빨강[1,0,0]
파랑[0,1,0]
초록[0,0,1]
*범주의 수가 많아지면 벡터의 차원이 증가하기 때문에 메모리와 연산 비용이 증가하게 되기 때문에 범주의 수가 적은 경우에 적합한 방식입니다.
또한, 단어간의 유사성을 알 수가 없기 때문에 검색 시스템 등에서 효율성이 떨어질 수 있다.
이 원핫 인코딩을 코딩으로 한 번 구현해 보겠습니다.
다음과 같이 알고리즘을 설계하고 C를 활용하여 코드를 구성해보았습니다.
#include <stdio.h>
#include <string.h> //strcmp 이용을 위하여
int main(){
char categories[10][10] ={ //데이터의 최대 개수 10개, 최대 길이 10자
"red", "blue", "green", "black", "white"
};
int num =5;
int category_index; // 입력받은 데이터의 인덱스를 저장
// 각 데이터에 해당하는 원핫 벡터를 배열에 저장
int vector[10][10];
// 벡터를 0으로 초기화
for (int i =0;i <num; i++){
for (int j= 0; j<num;j++){
vector[i][j] =0;
}
}
// 사용자로부터 입력 받기
printf("보기 중의 데이터를 입력하세요 :\n");
char c[10];
fgets(c,10,stdin);
// 입력받은 데이터의 인덱스 찾기
for (int i=0; i<num;i++){
if (strcmp(categories[i], c) == 0){
category_index= i;
break;
}
}
// 원핫 벡터 생성
for (int i = 0; i < num; i++){
if (i == category_index){
vector[category_index][i]= 1;
}
}
// 출력
printf("One-hot vector:\n");
for (int i = 0; i < num; i++){
if (i== category_index){
for (int j=0;j<num;j++){
printf("%d ", vector[i][j]);
}
}
}
}
이 코드 실행 시 사용자는 주어진 red, green, blue, black, white 중 하나를 입력하게 됩니다. 그러면 이에 해당하는 인덱스의 데이터를 찾아 미리 생성되어 있는 원핫 벡터를 출력하게 됩니다. 코드에서 최대 데이터의 개수, 최대 길이, 데이터의 개수를 변경할 수 있습니다.
어려웠던 점은 데이터를 입력받고 그 데이터를 원래의 데이터와 비교하여 인덱스를 찾아내는 과정을 어떻게 표현할 수 있을지 고민이 되었던것 같습니다. 그때 strcmp라는 함수가 생각이 났습니다. 이 함수를 이용하면 문자열 간의 비교를 손쉽게 할 수 있어서 바로 사용하게 되었습니다.
제 짧고 부족한 글을 읽어주셔서 감사합니다^
'정보과학융합탐구' 카테고리의 다른 글
14. diff - svc에 대하여 (0) | 2023.07.04 |
---|---|
11. 가우스 함수 그래프 (0) | 2023.05.30 |
10. 해외 이공계 체험 학습 후기 (0) | 2023.05.30 |
6. 자연어 처리(nlp) (0) | 2023.05.11 |
3. MSE, MAE를 C로 구현해보자!! (0) | 2023.03.13 |