NLP (Text preprocessing)

김태준·2024년 1월 6일
0

Deep-Learning

목록 보기
10/10

요즘 LLM에 근간이 되는 트랜스포머가 등장한 논문을 학습 중에 있는데, 보다 빠르게 학습하고자 이전에 선행으로 연구되던 텍스트 전처리부터 알아보고자 한다.

NLP에서 크롤링으로 얻어낸 데이터들은 전부 긴 텍스트 형태인데, 이를 용도에 맞게 가공하기 위해선 토큰화 & 정제 % 정규화 등 작업이 필요하다. 따라서 텍스트 전처리 하는 방안에 대해 오늘 정리를 하고자 한다.

✅ Text Preprocessing

✍️ 1. Tokenization

주어진 corpus(문장)에서 token이라 불리는 단위로 나누는 작업을 의미. 즉 문장을 단어로 나누는 방법이다.
일반적으로 토큰화 작업은 띄어쓰기나 마침표, 컴마, 물음표, 세미클론, 느낌표 등으로 문장 내 단어를 구분한다.
이때 이미 오픈소스로 제공받을 수 있는 NLTK(영어 코퍼스 토큰화 도구)를 통해 word_tokenize, WordPunctTokenizer를 사용해 '가 쓰인 문장도 처리를 할 수 있다. (keras의 경우 text_to_word_sequence를 지원)

토큰화 시 주의하고 고려해야 할 사항들이 있다.
1. 구두점, 특수 문자를 단순 제외해선 안된다.
2. 줄임말과 단어 내 띄어쓰기가 있는 경우
3. 표준 토큰화 예제 (TreebankWordTokenizer)
4. 문장 토큰화 (토큰 단위가 문장인 경우) (한국어의 경우 KSS 라이브러리 추천)
5. 한국어에서의 토큰화의 어려움 (띄어쓰기만으로 토큰화 힘듬. (어절, 교착어 등의 문제))
-> 한국어 토큰화에 있어 형태소란 개념 이해가 필요.
6. Part of speech tagging (품사 태깅 작업)
-> 단어는 표기는 같아도 품사에 따라 의미가 달라지기 때문에 해당 단어의 의미를 파악하기 위해선 품사가 무엇인지 알 필요가 있음.)

✍️ 2. Cleaning & Normalization

cleaning : 정제라는 단어로 갖고 있는 문장 내 노이즈 제거
normalization : 표현 방법이 다른 단어들을 통합해 같은 단어로 만드는 방법
-> 규칙 기반 표기 다른 단어 통합 (stemming / lemmatization)
-> 대/소문자 통합
-> 불필요 단어 제거 (빈도 낮거나 길이가 짧은 단어 -> 정규 표현식 활용)
ex) shortword = re.compile(r'\W*\b\w{1,2}\b')

✍️ 3. Stemming & Lemmatization

어간 추출, 표제어 추출 이 2가지 작업은 눈으로 봤을 땐 서로 다른 단어이지만 하나의 단어로 일반화시킬 수 있다면 통합시켜 문서 내 단어 수를 줄이는 작업이다.

-> 어간 : 단어의 의미를 담고 있는 핵심
-> 접사 : 단어에 추가적인 의미를 주는 부분

  • Lemmatization
    : 각 단어들이 다른 형태를 가지더라도 뿌리를 찾아가서 단어의 개수를 줄이는 방법으로 예시로는 am, are, is -> be로 압축할 수 있다.

  • Stemming
    : 섬세한 작업은 아니지만 정해진 규칙을 기반으로 단어의 어미를 자르는 작업
    따라서 추출한 결과가 사전에는 없는 단어들도 포함되어 있다.

한국어의 경우 어간에 어미가 붙기에 규칙/불규칙 형태로 바뀌게 되고 어미가 붙음에 따라 의미가 달라지기에 더 고도화된 작업이 필요하다.

✍️ 4. Stopword

데이터 내 유의미한 단어 토큰만을 선별하기 위해 큰 의미가 없는 단어 토큰을 제거하는 작업으로 불용어라 부른다.
즉, 해당 작업을 수행한다면 조사, I와 같은 단어들이 제거된다.

✍️ 5. Regular Expression

파이썬의 경우 re모듈을 통해 특정 규칙을 기반으로 텍스트 데이터를 빠르게 정제할 수 있다.
정규 표현식의 모듈 함수와 종류는 무수히 많기에 아래 링크를 참고하길 바란다.
https://wikidocs.net/21703

✍️ 6. Integer Encoding

컴퓨터는 텍스트보다 숫자를 더 잘 처리하기 때문에 텍스트로 이루어진 데이터들을 숫자로 바꾸기 위한 매핑하는 가공 작업과 기법에는 여러 종류들이 있다.
예시로 단어가 5,000개에 달하는 텍스트 데이터가 주어진다면 단어들은 각각 1 ~ 5,000 번까지 단어와 맵핑되는 고유한 정수, 다른 표현으로는 인덱스가 부여된다. 예시로 book : 150, love : 1232, books : 1312 와 같이 숫자가 부여되고 일반적으로는 단어 등장 빈도수를 기준으로 정렬한다.

사용 방법으로는 dictionary // Counter // NLTK - FreqDist // enumerate 등이 있다.

✍️ 7. Padding

컴퓨터는 길이가 전부 동일한 문서에 대해 하나의 행렬로 보고 한꺼번에 묶어서 처리할 수 있다. 그러나 문장들이 길이가 서로 다르기 때문에 병렬 연산을 위해선 이를 임의로 동일하게 길이를 맞춰 줄 필요가 있다.
keras로 전처리 / numpy로 for문 사용해 패딩하는 방법이 있다.

✍️ 8. One-Hot encoding

머신러닝에 있어 텍스트 데이터를 숫자로 변환하는 인코딩 작업이다.
원-핫 인코딩은 단어 집합 크기를 벡터 차원으로 나타내고 표현하고자 하는 단어의 인덱스에 1을, 나머지 단어들은 0을 부여하는 벡터 표현 방식이다.
원핫 인코딩을 2가지 과정으로 정리하면 다음과 같다.
1. 정수 인코딩을 수행 ( 각 단어에 인덱스 부여 )
2. 표현하고자 하는 단어의 값을 1로 나머지는 0을 부여

이러한 원-핫 인코딩도 결정적으론 단점과 한계가 존재한다.

  • 단어 개수가 늘어날수록 벡터를 저장하기 위해 필요한 공간이 계속 늘어난다는 단점 존재.
  • 원핫벡터는 단어의 유사도를 표현할 수 없음
    -> 단어 간 유사성을 밝힐 수 없는 단점은 검색 엔진/시스템에서 문제가 될 수 있다.

-> 이러한 단점을 해결하기 위해 단어의 잠재 의미를 반영하여 다차원 공간에 벡터화하는 기법으로 크게 2가지가 있다.
1. 카운트 기반의 벡터화 방법인 LSA(잠재 의미 분석), HAL
2. 예측 기반으로 벡터화하는 NHLM, RNNLM, Word2Vec, FastText
-> 2가지 기법을 모두 사용하는 GloVe라는 방법 존재.

profile
To be a DataScientist

0개의 댓글