01. 텍스트 마이닝 기초
1.1 텍스트 마이닝의 정의
텍스트 마이닝: 텍스트에서 고품질 정보를 추출하는 과정
- 텍스트에 숨어 있는 패턴을 이용해 어떤 사건을 예측하는 것으로 정리할 수 있음.
- 머신러닝을 통해 '패턴'을 찾을 수 있음. -> BUT, 머신러닝은 대부분 정형적인 데이터를 대상으로 하는 방법론임
=> 먼저 비정형 텍스트 데이터를 정형화하는 작업이 필요함.
=> 텍스트 마이닝: 자연어 처리 기법을 이용해 텍스트를 정형화된 데이터로 변환하고, 머신러닝 기법을 적용해 우리가 관심이 있는 어떤 사건을 예측하고자 하는 방법론
1.2 텍스트 마이닝 패러다임의 변화
텍스트 분류 등의 작업에 BERT(딥러닝 기반)를 쓰는게 일반화됨.
- BERT: 트랜스포머에 기반한 모형, 최근 작업에 거의 이 모델을 사용한다고 함.
- BOW or 카운트 기반 방식: 책 한권 정도 분량의 내용에 대한 문서를 분류해야 할때는 이와 같은 모델이 더 나음.
[카운트 기반의 문서 표현]
- 텍스트 마이닝에서 텍스트 -> 정형화된 데이터로 변환 시, 텍스트를 이해하는 것이 중요.
- 문장에 있는 단어들의 개수 세기 -> 주로 사용된 단어들을 이용해 문장 내용 파악하는 방법을 주로 사용했음.
ex) 아래 그림에서 단어의 빈도를 보는 것만으로도 무엇에 대한 내용으로 이루어졌는지 짐작 가능함.
=> 이 방법으로는 텍스트의 내용을 완전히 이해 않하더라도, 단어 빈도들을 이용해 우리가 원했던 텍스트 마이닝의 목적 달성 가능했음.
시퀀스 기반의 문서 표현
: 카운트 기반 문서 표현의 문제점 해결 + 텍스트 문맥 이해하고자 하는 방식
- 카운트 기반: 단어들의 빈도 -> 하나의 벡터로 문서 전체 표현
- 시퀀스 기반: 각 단어를 먼저 벡터로 변환 -> 벡터의 연속된 나열,시퀀스로 문서 표현
장점: 문맥을 이해할 수 있음. -> 더 정확하게 문장의 의미 이해 가능
(연속된 단어의 형태로 문장 이해하려면 딥러닝 기법 필요(ex. RNN))
문제점
- 벡터가 지나치게 커지면? -> 임베딩 과정!
- 가변 길이의 입력 허용 X -> 일정 길이로 맞추는 작업 필요.
1.3 텍스트 마이닝에 필요한 지식과 도구
[자연어 처리 기법]
자연어 처리: 컴퓨터 이용해 사람의 자연어를 분석하고 처리하는 기술 (텍스트 마이닝 개념 포함)
- 텍스트 전처리를 위한 기법으로 토큰화, 정규화(어간 추출, 표제어 추출), 품사 태깅에 대해 실습할 예정
- NLTK랑 KoNLPy 도구 사용
[통계학과 선형대수]
- 대용량의 데이터 다루기 -> 행렬 이해 필요
- 텍스트를 일정 길이의 벡터로 변환, 다루기 -> 선형대수 이해 필요
- 행렬 영산 -> 넘파이 / 텍스트 데이터 쉽게 처리 -> 판다스 활용 가능
[시각화 기법]
- 시각화: 전달하고자 하는 내용을 한눈에 쉽게 이해시키기 위함.
- 맷플롯립 & 사본을 많이 사용
[머신러닝]
- 머신러닝: 사람의 직접적 지시X, 컴퓨터가 학습을 통해 문제를 해결하게 하는 알고리즘이나 통계적 모형에 관한 연구.
- 기계학습은 지도학습 & 비지도학습 & 강화학습으로 나뉨 -> 지도 학습은 희귀&분류 / 비지도 학습은 클러스터링 & 차원축소로 나뉨.
- 파이썬 라이브러리 사이킷런이 있음. (매력적 패키지라고 함)
[딥러닝]
: 머신러닝의 한 분류. 인공신경망에서 은닉층을 깊게 쌓은 신경망 구조를 활용해 학습하는 알고리즘.
- 초기에는 RNN, LSTM, CNN 등의 단순&쉬운 방법론 사용, 지금은 트랜스포머에 기반한 BERT, GPT 등을 사용.
- 파이썬 오픈소스 라이브러리가 너무 잘 개발되어 있어서, 기본적인 개념만 이해하고 활용 가능함.
- 가장 많이 사용되는 라이브러리는 케라스 & 파이토치
1.4 텍스트 마이닝의 주요 적용분야
1. 문서 분류: 주어진 문서에 대해 미리 정의된 클래스로 분류하는 작업
2. 문서 생성: 사람이 쓴 것과 유사한 문장을 만들어내는 작업
3. 문서 요약: 주어진 문서에서 중요하고 흥미 있는 내용을 추출해 요약문을 생성하는 작업 (시퀀스 형태의 입력 -> 다시 시퀀스 형태로 출력)
4. 질의응답: 문서 요약과 유사. sequence-to-sequence 문제에 속함.
5. 기계번역: 자연어 처리에서 중요한 분야. '자연어 이해'를 전재로 함.
6. 토픽 모델링: 여러 문서에서 공통으로 등장하는 토픽을 추출하는 방법. 다수의 문서에 잠재된 내용을 파악하는 데 활용함.
02. 텍스트 전처리
2.1 텍스트 전처리의 개념
자연어 처리 단계:
- 준비 단계: 자연어로 쓰여진 글을 전처리
- 변환 단계: 전처리된 결과를 컴퓨터가 다루고 이해할 수 있는 형태로 변환
- 수행 단계: 변환된 형태를 이용해 다양한 분석 수행
왜 전처리가 필요한가?
- 프로그래밍 언어에서 문자열은 '기호의 순차수열'로 정의됨. -> 문자열이 문자 단위로 저장, 이해된다는 것을 의미
- 컴퓨터에게 문장을 이해시키고 싶다면 -> 하나의 문자열로 이루어진 문장,문서를 단어 단위로 나눔 -> 단어들의 리스트 형태로 변환 필요.
ex) “계절이 지나가는 하늘에는 가을로 가득 차 있습니다.” -> [‘계절이’, ‘지나가는’, ‘하늘에는’, ‘가을로’, ‘가득’, ‘차’, ‘있습니다’]
[전처리 단계]
텍스트 전처리: 주어진 텍스트에서 노이즈와 같이 불필요한 부분을 제거하고, 문장을 표준 단어들로 분리한 후에, 각 단어의 품사를 파악하는 것
1. 정제: 분석에 불필요한 노이즈를 제거하는 작업. 토큰화 이전&이후에도 지속적으로 이루어짐.
2. 토큰화: 주어진 텍스트를 원하는 단위(토큰)로 나누는 작업. 문장 토큰화(원하는 단위가 문장인 경우) & 단어 토큰화(단어일 경우). 일반적으로는 '단어 토큰화'를 의미함.
3. 정규화: 같은 의미를 가진 동일한 단어임에도 불구하고 다른 형태로 쓰여진 단어들을 통일시켜서 표준 단어로 만드는 작업. 방법에 따라 어간 추출 & 표제어 추출로 나뉨.
4. 품사 태깅: 앞서 토큰화한 단어에 대해 품사를 파악해 부착하는 것.
2.2 토큰화
주피터 노트북으로 실습을 진행함.
먼저, nltk를 설치하였음.
nltk를 import한후, nltk.download를 사용해 아래 라이브러리들을 다운로드하였음.
[문장 토큰화]
토큰화: 주어진 텍스트를 원하는 단위(토큰)로 나누는 작업
=> nltk의 sent_tokenize를 사용함. //주어진 텍스트를 문장 단위로 토큰화할 때 사용.
- 다른 언어에 대해 문장 토큰화를 하려면 사전학습된 모델을 지정해 불러올 수 있음.
[단어 토큰화]
아까 앞에서 말했던 것처럼, 일반적으로 토큰화=단어 토큰화를 의미. 단어 토큰화는 대상이 되는 텍스트를 단어 단위로 분리하는 작업.
- nltk의 word_tokenize를 사용함. //주어진 텍스트를 word 단위로 토큰화할 때 사용.
-> 마침표 & 느낌표가 별도의 단어로 분리되어 있음. + It's가 It & 's로 분리되었음.
WHAT IF, NLTK의 WordPunctTokenizer ?
-> It's를 It & ' & s 이렇게 세개의 토큰으로 분리했음.
=> WHY? : 두 토크나이저가 서로 다른 알고리즘에 기반하기 떄문.
[정규표현식을 이용한 토큰화]
정규표현식을 이용하면 NLTK를 쓰지 않고도 다양한 조건에 따라 토큰화할 수 있음.
- regex / regexp라고 줄여서 표현됨.
ex) "Hi, how are you?”에서 정확히 ’are’만 검색하고 싶다면 검색어를‘are’로
- 파이썬에서 정규표현식을 지원하는 라이브러리는 re임.
import re를 해주고, 실습을 진행해보자.
문자 클래스 [] //그 사이에 들어있는 문자와 매칭한다.
re 패키지의 findall() 함수: 첫째 인수의 패턴을 둘째 인수인 문자열에서 검색해서 매칭되는 모든 값들을 반환해줌.
IF, 숫자를 찾고 싶다? -> [0123456789]라고 적어주면 됨.
알파벳과 숫자에 _까지 검색하고 싶다면: [a-zA-Z0-9_]라고 쓰면 됨(=> 줄임 표현 '\w')
중요한 메타 문자 + // +는 한번 이상의 반복을 의미.
ex) 문자열에서 _가 하번 이상 반복된 부분을 찾고 싶다면 아래와 같이 사용 가능하다.
\w에는 공백이 포함되지 않아서 이걸 활용해 주어진 문자열에서 공백이나 쉼표 등으로 구분되는 단어들을 찾아낼 수 있음.
반복 횟수를 지정하는 방법
- +가 1번 이상 반복을 나타낸다면, {}을 이용해 정확한 반복 횟수를 지정할 수 있음.
[노이즈와 불용어 제거]
정규표현식을 이용한 토큰화 과정을 보았을 때, 특수문자와 같은 불필요한 문자/노이즈가 삭제된 것을 확인 가능.
- 길이가 짧은 단어들: 정규표현식 사용해 쉽게 제거 가능.
- 특정 단어를 지정해 불용어 사전을 만들고, 불용어 삭제 가능함.
-> NLTK에서는 stopwords라는 라이브러리 이용 가능
2.3 정규화
: 같은 의미를 가진 동일한 단어이면서 다른 형태로 쓰여진 단어들을 통일해 표준 단어로 만드는 작업
- 방법에 따라 어간 추출이랑 표제어 추출로 나뉨.
[어간 추출]
: 어형이 변형된 단어로부터 접사 등을 제거하고 그 단어의 어간을 분리해 내는 작업
- 포터 스테머(영어분야의 사실상의 표준)
-> 단어가 변형되는 규칙을 이용해 원형을 찾음.
-랭카스터 스테머
-> 포터 스테머와 비교했을 때, 현재분사와 복수형에 대한 처리( cooking과 cookbooks)는 동일하지만 cookery에 대한 결과는 다름.
[표제어 추출]
: 주어진 단어를 기본형으로 변환하는 것.
wordNet을 이용한 WordNet Lemmatizer가 잘알려져 있음.
NLTK가 지원하는 WordNetLemmatizer로 표제어 추출하기.
-> WordNetLemmatizer는 품사를 따로 지정하지 않으면 cooking 에 대한 기본형으로 동일한 cooking을 반환하는 것을 볼 수 있음.
=> 표제어 추출은 사전에 있는 단어의 기본형을 반환하고, 이를 위해 품사가 필요할 수 있다는 것을 알 수 있음.
2.4 품사 태깅
토큰화와 정규화 과정을 거쳐서 나온 각 결과 = 형태소
- 형태소: 의미를 가진 가장 작은 말의 단위.
[공용 품사 태그 집합]
[펜 트리뱅크 태그 집합]
- NLTK는 간소화된 태그 집합 외에 펜 트리뱅크 태그 집합을 제공함.
[NLTK를 활용한 품사 태깅]
- nltk.pos_tag()은 토큰화된 결과에 대해 품사를 태깅해 [단어, 품사] 로 구성된 튜플의 리스트로 품사 태깅 결과를 반환해 줌.
nltk.help.upenn_tagset()을 사용하면, 품사 약어의 의미와 설명을 볼 수 있음.
- 원하는 품사의 단어들만 추출할 수도 있음.
- 단어의 품사 정보를 추가해 구분
: 단어 뒤에 품사 태그를 붙여 사용 가능함.
03. 그래프와 워드 클라우드
3.1 단어 빈도 그래프 - 많이 쓰인 단어는?
- 먼저 단어의 반도를 구해야 함.
-> gutenberg.open()으로 파일 제목으로 해당 파일을 열 수 있고, read()로 그 내용을 읽어 올 수 있음.
+ 읽어 온 텍스트의 길이를 len()으로 알 수 있음.
-> 내용을 확인하고 NLTK를 이용해 토큰화함.
-> 포터 스테머로 스테밍 + 토큰 수와 앞 20개의 토큰을 확인
=> 위 결과들을 종합적으로 볼 때, 토큰 수는 변하지 않음. -> W? 토큰화된 결과에 대해 개별적으로 어간 추출과 표제어 추출을 수행하기 때문.
-> 정규표현식을 이용해 토큰화.
- 토큰 수가 많이 줄어든 것을 확인할 수 있음. 2자이하의 글자들이 모두 제외되었고, 부호가 사라졌음.
- 각 단어별로 빈도 계산(딕셔너리로 단어별 개수 세고 -> 빈고가 큰 순으로 정렬)
-> 빈도가 높은 상의 20개의 단어를 추출하였음.
3.2 워드 클라우드로 내용을 한눈에 보기
워드 클라우드: 텍스트 분석 결과를 보여주는 시각화 도구 중 가장 많이 활용되는 방법
- 빈도가 높은 단어는 크게, 낮은 단어는 작게 보여줌으로써 한눈에 전체적인 현황을 파악할 수 있게 함.
- WordCloud 패키지.
generate_form_frequencies() 메서드를 이용할 수도 있음.
3.3 한국어 문서에 대한 그래프와 워드 클라우드
(한국어 실습이 자꾸 오류가 나, 책으로만 공부 진행했습니다.)