젠스 알브레히트, 시다르트 라마찬드란, 크리스티안 윙클러, 『파이썬 라이브러리를 활용한 텍스트 분석 Blueprints for Text Analytics Using Python』, 심상진, 한빛미디어-OREILLY(2022), p29-68.
EDA
- 탐색적 데이터 분석 (Exploratory Data Analysis)
- 수집 수준에서 데이터를 체계적으로 조사하는 과정 (요약, 통계, 결측치 확인 등)
- NLP에서는 말뭉치(corpus)의 통계적 탐색을 진행
- 메타 데이터: 범주, 작성자, 날짜/시간
- 콘텐츠: 단어, 구, 개체 -> 상대적 빈도 활용
- 단어: 문장 안에서 띄어쓰기가 되어 있는 각각의 단위
- ex. 나는 / 도서관에서 / 친구를 / 만났다
- 구: 2개 이상의 단어가 모여 하나의 단어처럼 쓰이는 덩어리, 서술어가 없음
- ex. 귀여운 강아지(명사구), 많이 먹는다(동사구)
- 절: 주어 + 서술어가 있는 덩어리, 종결 어미가 없어서 문장으로 완결되지는 못함
- 단어: 문장 안에서 띄어쓰기가 되어 있는 각각의 단위
- 점수: 인기도, 감성, 가독성 -> 모델에 의해 파생되기도 함
데이터 샘플링
- 샘플링: df.sample(frac=0.1)
- 10%를 임의로 추출 -> 주 메모리에 로드
개요 확인
- 메모리, 데이터 타입: df.info()
- 요약 통계:
- 수치형: df.describe() > count, mean, std, min, max, 25%, 50%, 75% 제공
- 범주형: df.describe(include='O') > count, unique, top(mode), freq 제공
- 결측치 수: df.isna().sum()
데이터 분포
범주형 변수 (빈도)
- 빈도수: df[컬럼명].value_counts()
- 빈도율: df[컬럼명].value_counts(normalize=True)
- Boxplot: df[컬럼명].plot(kind='box', vert=False, figsize=(8, 1))
- vert: vertical -> False면 수평으로 그림
- Histogram: df[컬럼명].hist(bins=30, figsize=(8,2))
- seaborn distplot: sns.distplot(df[컬럼명], bins=30, kde=True)
- seaborn violinplot: sns.catplot(data=df, x=컬럼명, y=컬럼명, kind='violin')
시간 리샘플링
- pandas series 객체의 'dt' 접근자를 사용
- 종류
- dt.date: 날짜 추출
- dt.year: 연도 추출
- dt.quarter: 분기 추출
- dt.hour: 시간 추출
- dt.month: 월 추출
- dt.week: 주 추출
- dt.strftime(형식): 원하는 날짜 포맷 지정
- pandas 내장함수 'resample' 사용
- 일/주/월 단위로 묶어서 집계 및 처리할 수 있음
전처리 파이프라인
- Step 1: 변환 (대문자 -> 소문자로 변환)
- Step 2: 토큰화 (tokenization): ex. 공백 or 정규 표현식 사용
- apply, map함수 활용
- map: 단일 column 변환
- apply: 단일, 다중 column 변환 가능
- applymap: 전체 데이터 셀 적용
- apply, map함수 활용
- Step3: 불용어 제거 (stop word removal)
- 불용어: 출현 빈도는 높지만 많은 정보를 전달하지 않는 단어 (ex. 부사, 대명사 등)
- nltk 불용어가 자주 사용됨 nltk.corpus.stopwords.words('english')
- 무조건적으로 제거하면 안됨 -> 불용어가 긍/부정의 의미, 전체에서 중요한 부분에서 중요한 부분일 수도 있음
- ex. I don't like cheese에서 don't는 불용어지만 not을 통해 부정을 유추할 수 있음
- 불용어 목록보다 문서(사용하는 데이터) 내의 빈도가 80% 이상인 단어를 처리하는 것이 유용할 수 있음
토큰화
- 주어진 corpus에서 토큰(token)이라는 단위로 나누는 작업
- 토큰의 기준은 단어, 단어구, 문장, 문자열 등 다양하게 설정 가능
- 단어 토큰
- 영어는 공백(space)을 기준으로 쉽게 분리 가능
- 한글은 교착어이기 때문에 단순 띄어쓰기로 분리 불가능
- 교착어: 조사, 어미 등을 붙여서 말을 만드는 언어
ex. 영어: he/him, 한국어: 그가, 그를, 그에게, 그와, 그는 -> 띄어쓰기 없이 조사가 '그' 뒤에 바로 붙음 - 한국어는 조사와 같이 붙어있는 무언가가 많아서 전부 분리해야됨
- 형태소(morpheme)을 기준으로 분리해야됨
- 교착어: 조사, 어미 등을 붙여서 말을 만드는 언어
단어 빈도 분석
- Counter 클래스
- 객체의 수 계산
- 토큰 목록을 추가로 업데이트 가능
- most_common을 써서 가장 빈번하게 나오는 단어 검색 가능
- 빈도 다이어그램
- 워드 클라우드
- 다양한 글꼴 크기로 빈도를 시각화
- 내용을 이해하고 비교하기 쉽지만, 정밀하지 못함
- 히트맵
TF-IDF
- 전체적으로 자주 등장하는 단어 보다 "개별 데이터에서만" 자주 등장하는 단어가 더 중요함
- TF: Term Frequency
- tf(d,t): 특정 문서(d)에서 특정 단어(t)의 등장 빈도
- IDF: Inverse Document Frequency
- df(t): 특정 단어(t)가 등장한 문서 수
- 일반적인 용어의 영향을 줄이는 데 사용
- 로그 스케일링 처리 -> 희귀 단어가 매우 높은 점수를 얻는 것을 방지
- Ex. 문서 수(n) = 1,000,000일 때
- 보통 분모가 0이 되는 것을 방지하기 위해 1을 더해서 사용
$$idf(t) = log({n \over {1+df(t)}})$$ - TF * IDF: 특정 문서에서만 자주 등장하는 단어가 높은 값을 가짐
컨텍스트 내 키워드 탐색
- KeyWord-In-Context (KWIC)
- nltk or textacy를 활용
- textacy.extract.kwic.keyword_in_context
- 시각화 결과(워드클라우드, 빈도다이어그램 등)를 보고 알 수 없는 토큰은 세부 사항을 살펴봐야됨
- 축약어? 전처리로 인한 결과? 등
- 키워드를 중심으로 왼쪽 및 오른쪽에 있는 일정한 개수의 단어를 목록화
- sdgs가 "Sustainable Development Goals" 이란 것을 알 수 있음
- sdgs가 "Sustainable Development Goals" 이란 것을 알 수 있음
N-gram
- 문서/문장 내에서 정확한 의미를 찾기 위해 2개 이상의 단어 조합을 봐야할 수 있다.
- ex. 합성어(compound), 연어(collocation)
- self-confident
- climate change
- 단어 개수에 따른 명칭 구분
- 1개 단어의 조합: unigram
- 2개 단어의 조합: bigram
- 3개 단어의 조합: trigram
- ngram은 3개 이하를 권장함 (n이 커지면 조합의 수가 기하급수적으로 증가하기 때문)
- 전치사, 한정사와 같은 불용어를 제거하고 조합을 찾는 것이 좋음
- 불용어를 먼저 제거하고 n-gram을 돌리면 원본 텍스트에 없는 n-gram이 생성되기 때문에,
n-gram을 먼저 실행 후 불용어를 제거하는 것이 좋다.
- 불용어를 먼저 제거하고 n-gram을 돌리면 원본 텍스트에 없는 n-gram이 생성되기 때문에,
Reference
반응형
'NLP' 카테고리의 다른 글
Chapter 6. 텍스트 분류 알고리즘 (0) | 2023.03.26 |
---|---|
Chapter 5. 특성 엔지니어링 및 구문 유사성 (0) | 2023.03.26 |
Chapter 4. 통계 및 머신러닝을 위한 텍스트 데이터 준비 (0) | 2023.03.26 |
Chapter 3. 웹사이트 스크래핑 및 데이터 추출 (0) | 2023.03.26 |
Chapter 2. API로 추출하는 텍스트 속 통찰 (0) | 2023.03.26 |
댓글