Notice
Recent Posts
Recent Comments
«   2024/12   »
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30 31
Tags
more
Archives
Today
Total
관리 메뉴

No Limitation

[Pytorch] 자연어 처리 intro - 토큰화와 정수 인코딩 본문

ML & DL & RL

[Pytorch] 자연어 처리 intro - 토큰화와 정수 인코딩

yesungcho 2022. 3. 4. 12:31

본 글은 유원준 님의 Pytorch로 시작하는 딥러닝 입문 교재를 참고하였습니다.

https://wikidocs.net/64515

 

우선 기본적인 개념을 익히기 전에, 본 포스팅에서는 구글 Co-lab을 사용하였습니다.
한국어 토큰화 처리 패키지를 사용하기 위한 다음의 설치 과정을 수행해줍니다.

 

 

[1] 토큰화

 

우선 토큰화(Tokenization)란, 주어진 텍스트를 단어 또는 문자 단위로 자르는 것을 의미합니다. 

영어의 예시를 먼저 살펴보면

다음과 같은 문장이 있다고 하면

이를 토큰 단위로 나누는 역할을 하는 것은 매우 많은데

대표적으로는 spaCy와 nltk 패키지가 있습니다.

 

spacy.load를 통해 영어 토큰화하는 메서드를 로드한 다음

토큰 정보들을 담는 리스트를 리턴하는 함수를 정의해줍니다.

 

그리고 이와 같이 토큰화를 수행할 수 있습니다.

유사하게 nltk 패키지에서도 토큰화를 수행할 수 있습니다.

여기서는 word_tokenize라는 내장 함수를 사용합니다

 

그럼 반면 한국어 토큰화는 어떻게 수행될지 살펴보겠습니다.

 

대표적으로는 Mecab 이라는 분절화 패키지가 있습니다.

다음과 같이 한국어 문장이 있을 때

다음과 같이 분절을 수행할 수 있습니다.

이 이외에도 다양한 분절화 패키지들이 존재합니다.

 

[2] 단어 집합 생성

 

단어 집합이란 중복을 제거한 텍스트의 총 단어의 집합을 의미합니다.

우선 깃헙에 있는 네이버 영화 리뷰 데이터를 불어와 직접 분석을 시도해보도록 하겠습니다.

id는 영화의 id, document는 리뷰, label은 긍정이냐 부정이냐를 판단하는 레이블입니다.

전체 총 리뷰의 갯수는 20만개 입니다.

 

분석의 용이를 위해 100개만 샘플을 추려서 분석을 해보겠습니다.

분석에 방해가 될 수 있는 특수 기호들을 제거합니다.

 

다음으로 분석에 불필요한 불용어 리스트를 만들어줍니다.

토큰화를 수행해줍니다.

다음으로 nltk 패키지에 있는 FreqDist를 통해, 단어의 빈도 수를 계산하여 dictionary 형태로 반환해주는 객체를 생성합니다.

 

분석의 용이를 위해 등장 빈도수 상위 500개 단어만 추리도록 하겠습니다. 

 

단어의 목록이 완성이 되었다면

이제 단어들에 고유한 정수 값을 부여하는 과정을 거치도록 하겠습니다.

0, 1의 index는 특정 목적을 위해 사용되므로 이를 제외한 2 index부터 각 단어들에 labeling을 수행해줍니다.

'pad', 'unk' 에 대해서는 뒤에서 설명하도록 하겠습니다.

 

이제 본격적으로 label 된 정수 값을 encoding하는 과정을 거치도록 하겠습니다

여기서 'unk'의 경우 0으로 표시되며 단어 집합에 없는 단어인 경우를 의미합니다. 

 

예를 들어

['어릴', '때', '보', '고', '지금', '다시', '봐도', '재밌', '어요', 'ㅋㅋ'] 이 문장이

[78, 27, 9, 4, 50, 41, 79, 16, 28, 29 ]

으로 encoding이 되었다는 것입니다. 

 

하지만 여기서 문장의 길이는 다들 상이하기에 토큰들의 갯수가 상이하기 때문에 본 길이를 맞추어주는 과정을 거칩니다.

예를 들어

[78, 27, 9, 4, 50, 41, 79, 16, 28, 29] = ['어릴', '때', '보', '고', '지금', '다시', '봐도', '재밌', '어요', 'ㅋㅋ']

[188, 5, 80, 189, 190, 191, 42, 192, 114, 5, 193, 194, 21, 115, 195, 196, 13, 51, 81, 116, 30, 42, 197, 117, 118, 31, 198, 5, 199, 200, 17, 114, 7, 82, 52, 17, 43, 201, 5, 202, 4, 203, 14, 7, 83, 32, 204, 84], [205, 119, 206, 53, 207, 31, 208, 209, 54, 10, 25, 11], [44, 33, 120, 210, 211, 212, 213, 68, 45, 34, 13, 214, 121, 15, 2, 215, 69, 8, 33, 3, 35] 

= ['디자인', '을', '배우', '학생', '외국', '디자이너', '그', '일군', '전통', '을', '통해', '발전', '해', '문화', '산업', '부러웠', '는데', '사실', '우리', '나라', '에서', '그', '어려운', '시절', '끝', '까지', '열정', '을', '지킨', '노라노', '같', '전통', '있', '어', '저', '같', '사람', '꿈', '을', '꾸', '고', '이뤄나갈', '수', '있', '다는', '것', '감사', '합니다']

 

이 둘은 길이가 상이할 수 밖에 없습니다.

이 때 이 둘의 길이를 다음과 같이 통일할 수 있습니다.

 

[78, 27, 9, 4, 50, 41, 79, 16, 28, 29, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1] 

[188, 5, 80, 189, 190, 191, 42, 192, 114, 5, 193, 194, 21, 115, 195, 196, 13, 51, 81, 116, 30, 42, 197, 117, 118, 31, 198, 5, 199, 200, 17, 114, 7, 82, 52, 17, 43, 201, 5, 202, 4, 203, 14, 7, 83, 32, 204, 84]

 

다음 과정을 padding이라고 합니다.

 

앞선 과정에서 padding에 사용되는 정수를 1로 정의한 적이 있죠.

이제 현재 있는 토큰 목록 중 가장 길이가 긴 것을 기준으로 길이를 통일해주는 과정을 거칩니다.

 

다음 단계로 이제 각 정수로 label된 단어들을 고유한 단어 벡터로 만들어주는 작업을 해주어야 합니다. 

이 방법으로는 원 핫 인코딩과 워드 임베딩이 있는데, 현재는 주로 워드 임베딩이 사용됩니다. 이 내용들에 대해서는 추후에 다루도록 하겠습니다.