본문 바로가기
NLP

Chapter 1. 텍스트 데이터에서 찾는 통찰

by Night Fury 2023. 3. 26.

젠스 알브레히트, 시다르트 라마찬드란, 크리스티안 윙클러, 『파이썬 라이브러리를 활용한 텍스트 분석 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면 수평으로 그림

Box plot

  • Histogram: df[컬럼명].hist(bins=30, figsize=(8,2))

Histogram

  • seaborn distplot: sns.distplot(df[컬럼명], bins=30, kde=True)

Dist plot

  • seaborn violinplot: sns.catplot(data=df, x=컬럼명, y=컬럼명, kind='violin')

Violin plot

시간 리샘플링

  • 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: 전체 데이터 셀 적용
  • 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" 이란 것을 알 수 있음

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을 먼저 실행 후 불용어를 제거하는 것이 좋다.

Reference

반응형

댓글