텍스트 전처리는 입력된 문장을 컴퓨터가 이해할 수 있는 형태로 변환하는 과정이다. 즉 원시 텍스트를 모델 학습에 적합한 형태로 변환하는 작업을 의미한다.
Machine Learning Work Flow
- 데이터 전처리 및 정제
- 문제 목적에 맞는 텍스트 전처리 수행
1. Text Preprocessing
Why is Preprocessing necessary?
- 사람은 문장을 단어들의 순차수열로 이해하지만, 컴퓨터는 문자열로 처리
- 따라서 문장을 단어 단위로 분리하고, 불필요한 문자는 제거
- 전처리된 단어 리스트 형태의 데이터는 다양한 NLP 작업을 쉽게 수행하게 함
Word List
- "계절이 지나가는 하늘에는 가을로 가득 차 있습니다."
- ['계절이','지나가는','하늘에는','가을로','가득',차','있습니다']
Text Preprocessing
- 주어진 텍스트에서 노이즈와 같이 불필요한 부분을 제거하고 문장을 표준 단어들로 분리한 후에 각 단어의 품사를 파악하는 작업
Method
- Tokenization: 주어진 텍스트를 원하는 단위로 나누는 작업
- Cleaning: 분석에 불필요한 노이즈를 제거하는 작업
- Normalization: 같은 의미를 가진 동일한 단어임에도 불구하고 다른 형태로 쓰여진 단어들을 통일시켜 표준 단어로 만드는 작업
- POS tagging: 토큰화된 단어에 대한 품사를 부착하는 작업
1.1 Tokenization
- 주어진 corpus에서 토큰이라 불리는 단위로 나누는 작업
- 토큰의 단위가 상황에 따라 다르지만, 보통 의미있는 단위로 토큰 정의
- 원하는 단위가 문장인 경우에는 문장 토큰화라고 하고, 단어인 경우에는 단어 토큰화라고 함
nltk
Sentence Tokenization
- 여러 문장으로 이루어진 텍스트를 각 문장으로 나누기 위해 nltk의
sent_tokenize() 사용
Word Tokenization
- 텍스트를 단어 단위로 분리하는 작업, nltk의
word_tokenize()를 사용
- 마침표나 느낌표가 별도의 단어로 분리됨
- It's는 It, 's로 분리
- WordPunctTokenizer를 사용하면 결과가 바뀔까?
- It's를 It, ', s의 세 토큰으로 분리
- 두 tokenizer가 서로 다른 알고리즘에 기반함을 알 수 있음
- 사용자는 tokernizer의 특성을 파악하고 자신의 목적에 맞는 tokernizer를 선택
1.2 Cleaning
- Noise 제거는 토큰화 전에 이루어지나, 이후에도 필요한 경우 지속됨
- 사전에 있는 유의미한 단어라도 분석에 도움이 안 되는 단어들은 제거 → 불용어(stopword) 제거
- E.g., I, it
- 너무 자주 쓰면 분석에서 별 의미를 지니지 않음
Stopword
- 의미 없는 특수문자 등과는 별도로, 실제 사용되는 단어이지만 분석에는 필요가 없는 단어
- 일반적으로 빈도가 너무 적거나 혹은 너무 많아서 필요가 없는 단어들
- nltk에서는 stopwords라는 라이브러리를 이용해 불용어 사전 제공
- 자신만의 불용어 사전을 만들고 제거할 수 있음
1.3 Normalization
- 서로 다른 단어들을 하나의 단어로 일반화시켜 문서 내의 단어 수를 줄이는 방법
- 단어의 단어 빈도 기반의 BoW 모형에서 활용하며, 데이터(corpus)의 복잡성을 줄이는 것이 목표
1. Stemming (어간 추출)
- 단어에서 접사 등을 제거하여 어간만 남기는 작업
- E.g., porter stemmer, lancaster stemmer
- Porter stemmer
- Martin porter가 작성한 stemming 알고리즘 (1980.07)으로 영어 분야의 표준
- cookery의 어간으로 cookeri를 제시하는데, 이는 뒤의 y를 i로 대체하는 규칙에 따라 생성된 것으로 사전에 있는 단어는 아님
- Stemmer는 단어가 변형되는 규칙을 이용해 알고리즘을 찾으므로, 그 결과가 항상 사전에 있는 올바른 단어가 되지는 않음

- 토큰화를 결합하여 어간 추출
- E.g., Everyone → everyon
- Porter stemmer를 쓰면 모든 단어가 같은 규칙에 따라 변화하여 변환 결과가 올바른 단어가 아니더라도, 분석의 의도를 충족
- Rancaster stemmer
- Porter stemmer와 다른 알고리즘이므로 결과가 조금씩 다름
- 현재분사(cooking)와 복수형(cookbooks)에 대한 처리를 동일하지만, cookery에 대한 결과는 다름

2. Lemmatization (표제어 추출)
- Lemma('단어의 기본형')으로 변환
- 어간과 '단어의 기본형'의 차이
- 사전에 나오는 단어(lemma)인지 아닌지의 차이로 구분
- nltk가 지원하는 WordNetLemmatizer로 표제어 추출
사전에 있는 단어의 기본형을 반환하며, 사전에 없는 단어거나 품사 정보가 없으면 기본형 반환에 제대로 이루어지지 않을 수 있다.
1.4 POS tagging
- 품사(Part of speech): 단어를 문법적인 기능에 따라 분류한 것으로 명사, 대명사, 동사, 형용사 등이 존재
- 토큰화한 단어에 품사를 부착하는 것
nltk
nltk.pos_tag()은 토큰화된 결과에 대해 품사를 태깅
- nltk는 Penn treebank set 사용
1.5 한글 형태소 분석과 품사 태깅
형태소
nltk로 한국어 문서에 대해 품사 태깅이 가능한가?

잘 되지 않는다.
KoNLPy
- morphs(): 주어진 텍스트를 형태소 단위로 분리
- nouns(): 주어진 텍스트를 형태소 단위로 분리해서 명사만 반환
- pos(): 주어진 텍스트를 형태소 단위로 분리하고, 각 형태소에 품사를 부착해 반환
출력 형태는 nltk와 같다.
2. Count-based representation: BoW
2.1 Tokenization(eng)
- 영어는 nltk, 한국어는 koNLPy 사용
- 기계에게 어느 구간까지가 문장이고, 단어인지를 알려줘야 함
- 문장 토큰화, 단어 토큰화, subword 토큰화 등 다양한 단위의 토큰화가 존재
형태소 분석기(kor)
한국어는 토크나이저로 형태소 분석기를 사용하는 것이 보편적
2.2 Count-based representation
Bag of Words: 단어들의 가방
- 가방에 문장의 단어들을 넣고 흔든다면 단어의 순서는 무의미
- 단어의 순서는 무시하고, 오직 단어의 빈도수에만 집중
단어별 카운트 기반으로 문서로부터 특성을 추출하고 표현하는 방식
- 문서에는 단어의 사용 여부만 표시하는 방법
- 단어 수를 세어 표시하는 방법
- 단어가 문서에 나타는 수를 반영해 보정하는 방법 등이 존재
Count-based representation
- 문서의 의미를 반영해 벡터(숫자리스트)를 만드는 과정
- 딥러닝 이전의 방법
- 앞에서부터 순서대로 단어들을 읽어가며 문장의 의미를 파악하는 것은 불가
- 단어의 통계를 이용해 문서의 내용을 이해하고자 하는 시도
자주 나온 단어를 알면 빨리 내용을 유추할 수 있기 때문에 단어의 빈도수를 센다.
- 컴퓨터가 이해하려면 텍스트 → 수치
- 각 수치는 텍스트의 특성을 표현
- 텍스트의 특성을 단어로 표현 가능
- 특성이 갖는 값을 그 단어가 텍스트에서 나타나는 횟수로 표현
2.3 BoW CounterVector
- nltk 제공 moview_reviews
- 2,000개의 영화 리뷰와 그 리뷰의 내용이 긍정적인지 부정정적인지를 나타내는 감성 값 함께 제공
1. Text Preprocessing
- 텍스트 전처리를 수행해 의미가 있는 최소 단위의 리스트로 변환
- 토큰화, 정제 적용
2. Word Selection
- 기준에 따라 단어들을 선별할 수 있음
- E.g., 빈도를 계산하고 빈도가 높은 상위 단어 n개만 사용
- 총 45,953개의 단어 추출
- 상위 빈도수를 가지는 1,000개만 추출하여 최종적으로 문서를 표현할 특성으로 사용
3. Feature Vector
- 각 문서별로 특성 추출 대상 단어들에 대해 단어의 빈도를 계산해 특성 벡터를 추출
- 단어의 빈도를 특성 값으로 사용해 Count vector라고도 부름
word_features에 포함된 단어들은 빈도가 높은 순서대로 정렬되어 있다.
따라서 앞쪽 20개 단어는 대부분 여러 문서에서 자주 나타나며, count 값이 0이 아닌 단어가 많을 것으로 기대된다. 반면 리스트가 뒤쪽으로 갈수록 등장 빈도가 낮아져 값이 0인 단어가 많어질 것으로 예상된다.
2.4 Scikit-learn으로 CountVector 생성
- Scikit-learn: Machine learning을 구현할 수 있는 간편하고 효과적인 라이브러리
- 텍스트로부터 특성을 추출하기 위해
- sklearn.feature_extraction 모듈의 CountVectorizer 클래스 이용
fit_transform()
- 토큰화, 불용어 제거, 특성 선택을 수행해 특성 집합 생성
- reviews_cv
- Review 문서에 대한 CountVector
word_features와 사용된 단어 및 순서가 동일하다.
Document-Term Matrix
- Row: 문서
- Column: 단어
- Value: 단어의 빈도인 행렬