학습 목표
텍스트 데이터 분석 방법의 기본 원리를 이해하고, 분석을 위한 전처리 단계에 대해 알아보기
- 텍스트 데이터 분석 과정의 기본 아이디어인 임베딩 기법에 대해 이해
- 텍스트 데이터 분석을 위한 전처리 과정에 대해 이해
- 텍스트 데이터를 전처리하는 과정을 코드로 실습
텍스트 데이터 분석
텍스트 데이터의 특성을 이해하고, 이를 분석하기 위해서 어떤 과정을 거쳐야 하는지 알아보기
원리
텍스트 데이터의 특징

텍스트 데이터?
- 전형적인 비정형 데이터 중 하나
- 비정형 데이터?
- 구조화된 데이터가 아님 → 여태 해왔던 데이터 분석 방법론을 그대로 적용하기 어려움
- 일반 사람들이 실생활에서 접하는 ‘정보’는 비정형 데이터 구조인 경우가 많음
- 전처리를 통해 분석 가능한 형태로 변형하여 분석을 진행해야 함
- 비정형 데이터 처리는 사실 쉬운 일이 아님
- 데이터 형태가 다양하기에 구조화된 형태로 만드는 것이 어려움
- 보통 비정형 데이터는 정형 데이터보다 용량이 매우 큰 편
- 자연어 처리(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과는 달리 단어가 등장한 횟수를 값으로 가지는 벡터를 생성
- 해당 단어가 몇 번 등장했는지 세서 숫자 형태로 저장
- scikit-learn의 CountVecotrizer를 활용
3. TF-IDF (Term Frequency - Inverse Document Frequency) ★

-
하나의 단어가 하나의 차원
- 단어를 벡터로 바꾸는 방법 중 가장 많이 사용됨
-
TF만 따지게 되면 조사나 관사 등 의미 없는 단어가 자주 등장할 가능성이 큼
- The, a, … 등의 값들이 문법적인 이유로 의미 있는 단어보다 자주 등장
- 분석에 적절하지 않은 값이라 볼 수 있음 → 이상치에 가까움
-
공통된 문서에서 자주 등장하는 단어는 페널티를 줘서 중요도를 낮추는 방법
-
계산식

- tf(w)
- 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로 작업하기 때문에 작업할 때마다 내용이 약간씩 달라질 수 있어요
'허준이' 교수님이신데 '허준''이'로 나눠짐
("허준"이 유명하기 때문이 아닐까?)