자연어 처리 - 1회차

Suhyeon Lee·2025년 1월 8일
0

라이브 세션

목록 보기
32/37

학습 목표

텍스트 데이터 분석 방법의 기본 원리를 이해하고, 분석을 위한 전처리 단계에 대해 알아보기

  • 텍스트 데이터 분석 과정의 기본 아이디어인 임베딩 기법에 대해 이해
  • 텍스트 데이터 분석을 위한 전처리 과정에 대해 이해
  • 텍스트 데이터를 전처리하는 과정을 코드로 실습

텍스트 데이터 분석

텍스트 데이터의 특성을 이해하고, 이를 분석하기 위해서 어떤 과정을 거쳐야 하는지 알아보기

원리

텍스트 데이터의 특징

텍스트 데이터?

  • 전형적인 비정형 데이터 중 하나
    • 비정형 데이터?
      • 구조화된 데이터가 아님 → 여태 해왔던 데이터 분석 방법론을 그대로 적용하기 어려움
    • 일반 사람들이 실생활에서 접하는 ‘정보’는 비정형 데이터 구조인 경우가 많음
      • 이미지, 동영상, 오디오, 문서 등
    • 전처리를 통해 분석 가능한 형태로 변형하여 분석을 진행해야 함
  • 비정형 데이터 처리는 사실 쉬운 일이 아님
    • 데이터 형태가 다양하기에 구조화된 형태로 만드는 것이 어려움
    • 보통 비정형 데이터는 정형 데이터보다 용량이 매우 큰 편
      • 분석에 사용되는 컴퓨팅 자원이 많이 듦
  • 자연어 처리(Natural Language Processing)를 통해 정형화된 정보를 추출하고, 이를 분석에 활용

텍스트 데이터 임베딩 ★

임베딩(embedding)?

  • 자연어를 기계가 이해할 수 있도록 숫자형태인 벡터로 바꾸는 과정 혹은 일련의 전체 과정
    • 벡터라고 표현한 이유
      • 각각의 데이터 포인트가 크기와 방향을 가지기 때문

사람과 기계가 이해할 수 있을 정도로 차원 축소 후 벡터를 만들어 시각화해야 합니다.
인베딩의 핵심: 고차원 데이터(텍스트)를 사람이 이해할 수 있을 정도의 차원으로 낮추기!
→ String을 Vector로 변환

임베딩 방법

1. One Hot Encoding

  • 하나의 단어가 하나의 차원(컬럼)
  • 문서에 해당 단어가 등장하면 1, 등장하지 않으면 0으로 표기

한 언어를 유창하게 말하려면 2만 단어를 알아야 한다고 해요!
이를 One Hot Encoding으로 처리하면 2만 차원이 생성됨 → 차원의 저주
차원 축소가 절실해 보입니다…
Pandas에서 Categorical Data를 처리하던 것과 동일한 방식입니다.
(차원과 값을 가지는 벡터 형태로 변환)

2. Term Frequency

  • 하나의 단어가 하나의 차원
    • One Hot Encoding과 동일
  • One Hot Encoding과는 달리 단어가 등장한 횟수를 값으로 가지는 벡터를 생성
    • 해당 단어가 몇 번 등장했는지 세서 숫자 형태로 저장
  • scikit-learn의 CountVecotrizer를 활용

3. TF-IDF (Term Frequency - Inverse Document Frequency) ★

  • 하나의 단어가 하나의 차원

    • 단어를 벡터로 바꾸는 방법 중 가장 많이 사용됨
  • TF만 따지게 되면 조사나 관사 등 의미 없는 단어가 자주 등장할 가능성이 큼

    • The, a, … 등의 값들이 문법적인 이유로 의미 있는 단어보다 자주 등장
    • 분석에 적절하지 않은 값이라 볼 수 있음 → 이상치에 가까움
  • 공통된 문서에서 자주 등장하는 단어는 페널티를 줘서 중요도를 낮추는 방법

  • 계산식

    • tf(w)
      • 단어 w의 Term Frequency
    • df(w)
      • 단어 w의 Document Frequency
      • 해당 단어가 포함되어 있는 문서의 개수를 의미함
    • N
      • 총 문서의 개수
    • 특정 문서에 대해 키워드나 중요한 단어들 → TF-IDF값 높음
      보편적으로 나오는 단어들 → TF-IDF값 낮음
      • 해당 문서에만 나오고 해당 문서를 대표하는 단어만 TF-IDF값 높아지게 됨
  • scikit-learn의 TfidfVectorizer를 활용

200개의 기사 분석 → 한 사람이 작성한 경우
모든 문서에서 동일하게 쓰인 단어(작성자 이름)가 등장 횟수 가장 많지만 중요하지 않은 단어임 → 일반적인 글에 보편적으로 나오는 단어의 중요도를 낮춰서 해결!

QnA
전처리 과정에서 조사나 관사처럼 의미가 없는 단어도 가급적 보존하는게 좋은 건가요?
정형 데이터였으면 그냥 제거하는 방법을 택할 것 같은데 텍스트는 그렇지 않은 것 같네요.
→ 언어에 따라 다릅니다!
영어는 단어마다 띄어쓰기가 되어 있어서 상대적으로 자연어 처리가 쉬울 거 같은데 한국어는 단어마다 띄어쓰기가 되어 있지 않고 단어의 뜻도 여러 개가 있어서 좀 더 어려운지도 궁금해요!
→ 네…
→ 뉘앙스에 따라서도 의미가 많이 달라져서 한국어 분석의 난이도가 높아요
☞ 영어와 한국어의 차이
He is a good guy.
걔 생각보다 좋은 애야.
이 두 가지가 차이를 보여줄 수 있지 않을까요?

4. Word Embedding

  • 새로운 관점의 등장 - 문맥을 반영하자:
    • 빈도 기반으로 단어를 벡터화하면 단어와 단어 사이의 관계, 문맥 등을 반영하기 어려움
    • 연관성 있는 단어를 가까운 곳에, 연관성이 떨어지는 단어를 먼 곳에 위치하게 벡터화를 하면 단어 사이 연관성을 파악하기 수월함
      • 주변 단어를 함께 고려하면 해당 단어의 의미를 좀 더 명확하게 알 수 있음
        '오이도' vs. "오이"도
  • Word2Vec 알고리즘 등을 활용하여, 단어를 주어진 차원(하이퍼 파라미터)에 벡터화할 수 있음
    • 특정 문장에서 단어의 ‘주변 단어’를 활용
      • C-Bow: 주변 단어가 주어졌을 때 빈 칸의 단어를 예측하는 모델
      • Skip-gram: 특정 단어가 주어졌을 때 주변 단어를 예측하는 모델 → 현업에서 많이 씀(좀 더 학습이 잘 된다고 알려져 있음)
  • gensim의 word2vec 모델을 사용하여 구현 가능

word2vec 알고리즘 웹으로 확인해보기
한국서울한국-서울 → '수도'라는 값
따라서 한국서울=일본도쿄한국-서울=일본-도쿄
그렇다면 한국서울+도쿄한국-서울+도쿄는 어떤 값이 나올까요?

5. LLM을 활용한 임베딩과 Vector DB

  • ChatGPT와 같은 LLM(Large Language Model)
    • 수많은 텍스트 데이터를 학습하여 만들어진 결과물
    • 모델 학습 시 문장 간 단어 사이의 관계성을 계산하고 이를 학습하는 과정을 반복
  • 이미 학습된 LLM의 API 호출을 통해 텍스트를 벡터로 변환할 수 있음
    • OpenAI Embeddings로부터 추출한 embedding vector는 (text-embedding-ada-002 모델 사용 시) 1,536차원에 해당
  • Vector DB
    • 벡터 형태 데이터를 효율적으로 다룰 수 있는 DB
    • 벡터 형태의 검색이 가능

텍스트 데이터 전처리

  • 전처리를 통해서 분석 대상의 텍스트에서 최대한 중요한 정보를 남기기

텍스트 데이터 분석을 위한 전처리 과정

1. 문장 분리(Sentence Segmentation)

  • 문서처럼 긴 텍스트를 분석할 때는 문서를 우선 더 작은 문장 단위로 쪼개는 것이 좋음
    • 필수는 아님
    • 문서 단위로 분석하는 것이 적절하거나, 하나의 문서의 길이가 짧은 경우(댓글, 리뷰 등)에는 굳이 적용하지 않아도 됨
  • 쉽게는 마침표(.)처럼 확실한 구분자(boundary)를 이용해 구분하는 방식이 있음
  • 분석 대상 언어마다, 그리고 분석 대상 글의 속성에 따라 적용할 수 있는 룰이 다름
    • 한글과 달리 일본어와 중국어에서는 고리점(。)을 마침표로 사용
    • 뉴스 기사는 문장 마지막에 마침표를 정확하게 찍는 반면, 커뮤니티 게시글은 마침표를 사용하지 않는 경우도 많음

2. 불필요한 문자 제거(Text Cleaning)

  • 불필요한 텍스트가 포함되어 있는 경우 이를 사전에 제거
    • 불필요한 텍스트 예시
      • ‘ㅋㅋㅋㅋㅋㅋ’, ‘ㅎㅎㅎㅎㅎ’ 같이 불필요한 자음의 반복 → 통일시켜 주면 좋음(e.g. 'ㅋㅋ'/'ㅎㅎ'로 통일)
      • html tag (e.g. /n /s 등)
      • 특수문자(#@%$[]{})
  • 정규 표현식(Regex)를 활용하면 간편하게 특정 문자열을 제거할 수 있음

3. 토큰화(Tokenization)

  • 문장을 의미 있는 단위로 쪼개는 작업

  • 전처리의 핵심

  • 영어의 경우는 띄어쓰기 단위로만 쪼개도 각 토큰이 어느 정도 의미를 가지지만 한글의 경우 띄어쓰기에 민감하지 않아 띄어쓰기가 잘 이루어지지 않는 경우도 많을 뿐더러, 띄어쓰기 단위인 ‘어절’로 쪼개도 의미 단위로 쪼개지지 않음

    • 한글은 조사나 어미에 따라 그 의미가 달라지는 경우가 많음
      • 스파르타는 / 스파르타에서 / 스파르타식
    • 한글에서 뜻을 가지는 가장 작은 단위는 ‘형태소’ → 따라서 한글 토크나이저는 형태소 단위로 쪼개는 형태소 분석기를 활용하는 경우가 대다수
    • 형태소 분석기를 이용해 나뉘어진 토큰은 품사 태그(Part-of-speech, POS) 정보를 포함하고 있어 이를 분석에 활용할 수 있음
  • 영문의 경우 표제어 추출(Lemmatization), 어간 추출(Stemming) 기법을 활용하기도 함

    • 표제어 추출: 기본 사전어 단어로 변환
      • am, are , is → be(be동사 통일)
      • knives → knife(단수/복수 통일)
    • 어간 추출: 단어 생성 규칙에 따라 어간(stem)만 남기는 방법
      • normalization, normalize → normal
      • numerical → numeric

    4. 불용어 제거(Stopword)

  • 토큰 중에서 불필요한 토큰을 제거하는 단계

  • ‘불용어 사전’ → Stopwords

    • 불용어를 모아둔 집합
    • 보편적으로 많이 제거되는 대명사나 조사, 접미사 등을 포함하고 있으며 사용자가 직접 정의할 수도 있음
      • 예시: 이 / 그 / 저 / 또 / 결국 / 한다
  • 웹 상에 보편적으로 정리되어 있는 불용어 사전을 활용해도 됨

이렇게 전처리한 텍스트를 임베딩을 통해 벡터화하고 나면, 이후에는 정형 데이터를 다루는 것과 동일하게 분석 모델에 활용할 수 있습니다.

실습

텍스트 데이터에 대해 전처리를 진행하고, 결과물을 활용해 임베딩을 진행

패키지 설명

  • kss
  • konlpy
    • Okt, Kkma, Komoran 등의 토크나이저 호출 가능
  • {패키지명}

허깅페이스?

  • 딥러닝계의 오픈소스 소통의 장
    • Kaggle처럼 딥러닝 학습에 사용할 만한 데이터를 공유하는 곳입니다.

DataFrame vs. List

  • 작업 대상이 되는 부분만 List로 가져오는 게 작업 속도가 좀 더 빠름

rule-based로 작업하기 때문에 작업할 때마다 내용이 약간씩 달라질 수 있어요

'허준이' 교수님이신데 '허준''이'로 나눠짐
("허준"이 유명하기 때문이 아닐까?)

profile
2 B R 0 2 B

0개의 댓글

관련 채용 정보