본문 바로가기
  • ㄹㅇ
데이터 분석의 모든 것/7. 비정형 데이터 분석

텍스트 마이닝의 기본 프로세스: 데이터 수집부터 전처리까지

by 한강석 2024. 6. 6.

 

1.1 텍스트 분석에 대한 전체적인 절차 소개

텍스트 분석은 비정형 텍스트 데이터를 구조화하고 유의미한 정보를 추출하는 과정입니다. 이는 여러 단계로 나뉘며, 각 단계는 데이터의 품질과 분석 결과에 큰 영향을 미칩니다. 아래는 텍스트 분석의 기본 절차입니다.

  1. 텍스트 수집 (Data Collection):
    • 다양한 소스에서 텍스트 데이터를 수집합니다. 이는 웹 스크래핑, API 활용, 소셜 미디어 데이터 수집, 기존 문서 데이터베이스 이용 등을 포함할 수 있습니다.
  2. 텍스트 전처리 (Data Preprocessing):
    • 수집된 텍스트 데이터를 분석하기 전에 정제하는 과정입니다. 여기에는 토큰화(tokenization), 불용어 제거(stopword removal), 정규화(normalization), 형태소 분석 등이 포함됩니다. 전처리 단계는 텍스트 데이터의 노이즈를 줄이고, 분석의 정확성을 높이는 데 중요합니다.
  3. 텍스트 변환 (Data Transformation):
    • 정제된 텍스트 데이터를 분석 가능한 형태로 변환합니다. 주로 문서 단어 행렬(Document-Term Matrix, DTM)이나 TF-IDF(단어 빈도-역 문서 빈도)를 이용합니다. 이 과정에서 텍스트 데이터를 벡터화하여 기계 학습 모델에 입력할 수 있게 합니다.
  4. 텍스트 마이닝 (Text Mining):
    • 변환된 데이터를 분석합니다. 이 단계에서는 군집화(clustering), 분류(classification), 감성 분석(sentiment analysis), 주제 모델링(topic modeling) 등 다양한 분석 기법을 활용합니다. 이를 통해 데이터에서 패턴이나 트렌드를 발견할 수 있습니다.
  5. 결과 시각화 및 해석 (Visualization and Interpretation):
    • 분석 결과를 시각화하여 이해하기 쉽게 표현합니다. 그래프, 차트, 워드 클라우드 등을 이용해 결과를 시각화하며, 이를 기반으로 유의미한 인사이트를 도출합니다.
  6. 결과 평가 및 공유 (Evaluation and Sharing):
    • 분석 결과를 평가하고, 정확성과 유효성을 검증합니다. 이를 통해 분석 과정에서 발생할 수 있는 오류나 한계를 파악하고 개선합니다. 또한, 결과를 이해관계자와 공유하여 인사이트를 제공하고, 실제 비즈니스나 연구에 활용될 수 있도록 합니다.

 

1.2 텍스트 수집

 

텍스트 수집은 텍스트 분석의 첫 번째 단계로, 다양한 출처에서 데이터를 모으는 과정을 포함합니다. 효과적인 텍스트 수집은 이후 분석 단계의 품질을 결정짓는 중요한 역할을 합니다. 아래는 텍스트 데이터를 수집하는 몇 가지 방법입니다.

  1. 웹 스크래핑 (Web Scraping):
    • 웹 사이트에서 데이터를 자동으로 추출하는 방법입니다. 파이썬의 BeautifulSoup 또는 Scrapy 라이브러리를 사용하여 특정 웹 페이지의 텍스트를 수집할 수 있습니다.
    • 예시: 
    • import requests url = 'http://example.com' response = requests.get(url) soup = BeautifulSoup(response.text, 'html.parser') text = soup.get_text()```
  2. API 활용 (Using APIs):
    • 트위터, 페이스북, 뉴스 사이트 등에서 제공하는 API를 통해 데이터를 수집할 수 있습니다. 이 방법은 대량의 데이터를 체계적으로 수집하는 데 유용합니다.
    • 예시:
    • import tweepy consumer_key = 'your_consumer_key' consumer_secret = 'your_consumer_secret' access_token = 'your_access_token' access_token_secret = 'your_access_token_secret' auth = tweepy.OAuthHandler(consumer_key, consumer_secret) auth.set_access_token(access_token, access_token_secret) api = tweepy.API(auth) tweets = api.user_timeline(screen_name='twitter_user', count=100) for tweet in tweets: print(tweet.text)
  3. 소셜 미디어 데이터 수집 (Social Media Data Collection):
    • 트위터, 페이스북, 인스타그램 등 소셜 미디어 플랫폼에서 데이터를 수집합니다. 이를 통해 사용자 의견, 트렌드, 감성 분석 등을 수행할 수 있습니다.
  4. 기존 문서 데이터베이스 이용 (Using Existing Document Databases):
    • 논문, 기사, 보고서 등 이미 존재하는 문서 데이터베이스를 활용하여 텍스트 데이터를 수집할 수 있습니다. 이는 신뢰성 높은 데이터를 얻는 데 유리합니다.
  5. 사용자 생성 데이터 (User-Generated Content):
    • 설문조사, 리뷰, 피드백 등 사용자로부터 직접 데이터를 수집하는 방법입니다. 이는 특정 주제에 대한 심층적인 인사이트를 얻는 데 도움이 됩니다.

이와 같은 다양한 방법을 활용하여 텍스트 데이터를 수집할 수 있습니다. 수집된 데이터는 다음 단계인 전처리를 통해 분석 가능한 형태로 변환됩니다.

 

 

1.3 텍스트 전처리

1.3.1 토큰화 (Tokenization)

토큰화는 텍스트 데이터를 분석하기 위해 작은 단위로 분할하는 과정입니다. 이 작은 단위를 토큰(token)이라고 부르며, 일반적으로 단어, 문장, 또는 의미 있는 문자열이 토큰으로 사용됩니다. 토큰화는 텍스트 데이터의 전처리 과정에서 가장 기본적이고 중요한 단계입니다.

토큰화의 주요 목적은 텍스트 데이터를 기계가 이해할 수 있는 형태로 변환하는 것입니다. 아래는 파이썬을 사용한 토큰화 예시입니다.

단어 단위 토큰화

단어 단위로 텍스트를 분할하는 가장 일반적인 방법입니다. 파이썬의 nltk 라이브러리를 사용하여 쉽게 구현할 수 있습니다.

import nltk
nltk.download('punkt')
from nltk.tokenize import word_tokenize

text = "텍스트 마이닝은 흥미로운 분야입니다."
tokens = word_tokenize(text)
print(tokens)

['텍스트', '마이닝은', '흥미로운', '분야입니다', '.']

문장 단위 토큰화

텍스트를 문장 단위로 분할하는 방법입니다. 이 역시 nltk 라이브러리를 사용하여 구현할 수 있습니다.

from nltk.tokenize import sent_tokenize

text = "텍스트 마이닝은 흥미로운 분야입니다. 여러 단계로 이루어져 있습니다."
sentences = sent_tokenize(text)
print(sentences)

['텍스트 마이닝은 흥미로운 분야입니다.', '여러 단계로 이루어져 있습니다.']

한글 토큰화

한글은 띄어쓰기나 문법 구조가 영어와 다르기 때문에, 한글 텍스트를 효과적으로 토큰화하기 위해서는 KoNLPy와 같은 라이브러리를 사용할 수 있습니다.

from konlpy.tag import Okt

okt = Okt()
text = "텍스트 마이닝은 흥미로운 분야입니다."
tokens = okt.morphs(text)
print(tokens)

['텍스트', '마이닝', '은', '흥미로운', '분야', '입니다', '.']

토큰화는 텍스트 데이터를 분석 가능한 작은 단위로 나누어, 이후의 데이터 정제와 분석 과정에서 효율적으로 처리할 수 있도록 도와줍니다. 이를 통해 텍스트 데이터에서 의미 있는 정보를 추출하는 데 중요한 기초 작업을 수행할 수 있습니다.

 

 

1.4 데이터 정제와 정규화

데이터 정제와 정규화는 텍스트 데이터를 분석 가능한 형태로 변환하는 과정에서 필수적인 단계입니다. 이 단계는 텍스트 데이터의 노이즈를 제거하고, 일관성을 높여 분석의 정확성을 향상시키는 데 목적이 있습니다.

데이터 정제 (Data Cleaning)

데이터 정제는 텍스트 데이터에서 불필요한 요소를 제거하고, 텍스트의 품질을 향상시키는 과정입니다. 아래는 주요 정제 작업과 그 예시입니다.

  1. 불용어 제거 (Stopword Removal):
    • 불용어는 분석에 큰 의미를 가지지 않는 단어들입니다. 예를 들어, "는", "이", "가"와 같은 단어는 문장의 의미를 파악하는 데 크게 기여하지 않습니다.
    from nltk.corpus import stopwords
    from nltk.tokenize import word_tokenize
    
    nltk.download('stopwords')
    stop_words = set(stopwords.words('korean'))
    
    text = "텍스트 마이닝은 흥미로운 분야입니다."
    word_tokens = word_tokenize(text)
    
    filtered_text = [word for word in word_tokens if not word in stop_words]
    print(filtered_text)
    # 출력: ['텍스트', '마이닝', '흥미로운', '분야입니다', '.']
  2. 특수 문자 제거 (Removing Special Characters):
    • 텍스트에서 특수 문자나 불필요한 기호를 제거합니다.
    import re
    
    text = "텍스트 마이닝은 흥미로운 분야입니다!!!"
    cleaned_text = re.sub(r'[^\w\s]', '', text)
    print(cleaned_text)
    # 출력: 텍스트 마이닝은 흥미로운 분야입니다
  3. 대문자 변환 (Lowercasing):
    • 텍스트의 일관성을 위해 모든 문자를 소문자로 변환합니다.
    text = "Text Mining is an INTERESTING Field."
    lower_text = text.lower()
    print(lower_text)
    # 출력: text mining is an interesting field.

데이터 정규화 (Data Normalization)

데이터 정규화는 텍스트 데이터를 일관된 형식으로 변환하여 분석의 정확성을 높이는 과정입니다. 주요 정규화 작업에는 어간 추출과 표제어 추출이 포함됩니다.

  1. 어간 추출 (Stemming):
    • 어간 추출은 단어의 어간(기본 형태)을 추출하여 단어의 변형을 통일하는 방법입니다.
    from nltk.stem import PorterStemmer
    
    ps = PorterStemmer()
    words = ["running", "ran", "runs"]
    stemmed_words = [ps.stem(word) for word in words]
    print(stemmed_words)
    # 출력: ['run', 'ran', 'run']
  2. 표제어 추출 (Lemmatization):
    • 표제어 추출은 단어의 표제어(사전형)로 변환하여 단어의 변형을 통일하는 방법입니다.
    from nltk.stem import WordNetLemmatizer
    
    lemmatizer = WordNetLemmatizer()
    words = ["running", "ran", "runs"]
    lemmatized_words = [lemmatizer.lemmatize(word, pos='v') for word in words]
    print(lemmatized_words)
    # 출력: ['run', 'run', 'run']

 

1.5 문서 단어 행렬 (Document-Term Matrix)과 예제

문서 단어 행렬(Document-Term Matrix, DTM)은 문서와 단어의 빈도를 매트릭스로 표현한 것입니다. 이는 텍스트 데이터를 분석할 때 많이 사용되는 방법 중 하나로, 각 문서를 벡터로 변환하여 기계 학습 모델에 입력할 수 있는 형태로 만듭니다.

DTM은 행이 문서, 열이 단어로 구성된 행렬로, 각 셀의 값은 해당 문서에서 해당 단어의 등장 빈도를 나타냅니다. 이와 비슷한 개념으로 용어 문서 행렬(Term-Document Matrix, TDM)도 있는데, 이는 DTM의 전치 행렬로 생각할 수 있습니다.

문서 단어 행렬의 예제

파이썬의 scikit-learn 라이브러리를 사용하여 문서 단어 행렬을 쉽게 생성할 수 있습니다. 아래 예제를 통해 DTM을 생성하는 과정을 살펴보겠습니다.

from sklearn.feature_extraction.text import CountVectorizer

# 예제 문서
documents = [
    "텍스트 마이닝은 데이터 분석의 한 분야입니다.",
    "데이터 분석을 통해 유의미한 정보를 추출합니다.",
    "자연어 처리는 텍스트 마이닝의 중요한 기술입니다."
]

# CountVectorizer를 이용해 문서 단어 행렬 생성
vectorizer = CountVectorizer()
X = vectorizer.fit_transform(documents)

# 문서 단어 행렬을 배열로 변환
dtm = X.toarray()

# 특성(단어) 이름 추출
feature_names = vectorizer.get_feature_names_out()

# 결과 출력
print("단어 목록:", feature_names)
print("문서 단어 행렬:\n", dtm)
111
# 출력:
# 단어 목록: ['데이터', '마이닝은', '마이닝의', '분야입니다', '분석을', '분석의', '자연어', '처리는', '추출합니다', '텍스트', '통해', '한', '유의미한', '중요한', '정보를']
# 문서 단어 행렬:
# [[1 1 0 1 0 1 0 0 0 1 0 1 0 0 0]
#  [1 0 0 0 1 0 0 0 1 0 1 0 1 0 1]
#  [0 0 1 0 0 0 1 1 0 1 0 0 0 1 0]]

이 예제에서 CountVectorizer를 사용하여 세 개의 문서로 구성된 코퍼스(corpus)로부터 문서 단어 행렬을 생성했습니다. fit_transform 메소드는 문서 단어 행렬을 생성하고, toarray 메소드는 이를 배열 형태로 변환합니다. 마지막으로, get_feature_names_out 메소드를 사용하여 각 열에 해당하는 단어 목록을 출력합니다.

용어 빈도-역 문서 빈도 (TF-IDF)

문서 단어 행렬의 단점을 보완하기 위해 TF-IDF(Term Frequency-Inverse Document Frequency) 가중치를 사용할 수 있습니다. TF-IDF는 단어의 빈도와 역 문서 빈도를 결합하여, 문서에서 중요한 단어를 강조합니다. scikit-learn의 TfidfVectorizer를 사용하여 쉽게 구현할 수 있습니다.

from sklearn.feature_extraction.text import TfidfVectorizer

# TfidfVectorizer를 이용해 TF-IDF 행렬 생성
vectorizer = TfidfVectorizer()
X = vectorizer.fit_transform(documents)

# TF-IDF 행렬을 배열로 변환
tfidf_matrix = X.toarray()

# 특성(단어) 이름 추출
feature_names = vectorizer.get_feature_names_out()

# 결과 출력
print("단어 목록:", feature_names)
print("TF-IDF 행렬:\n", tfidf_matrix)
111
# 출력:
# 단어 목록: ['데이터', '마이닝은', '마이닝의', '분야입니다', '분석을', '분석의', '자연어', '처리는', '추출합니다', '텍스트', '통해', '한', '유의미한', '중요한', '정보를']
# TF-IDF 행렬:
# [[0.3645444  0.51594521 0.         0.51594521 0.         0.51594521
#   0.         0.         0.         0.3645444  0.         0.51594521
#   0.         0.         0.        ]
#  [0.29808861 0.         0.         0.         0.42129173 0.
#   0.         0.         0.42129173 0.         0.42129173 0.
#   0.42129173 0.         0.42129173]
#  [0.         0.         0.38662027 0.         0.         0.
#   0.38662027 0.38662027 0.         0.29808861 0.         0.
#   0.         0.38662027 0.        ]]

이 예제에서 TfidfVectorizer를 사용하여 TF-IDF 행렬을 생성하고, 이를 배열 형태로 변환한 후, 단어 목록과 함께 출력합니다. TF-IDF는 문서 내에서 중요한 단어에 높은 가중치를 부여하여 분석의 정확성을 높입니다.

문서 단어 행렬과 TF-IDF는 텍스트 데이터를 구조화하여 기계 학습 모델에 입력할 수 있는 형태로 변환하는 중요한 도구입니다. 이를 통해 텍스트 데이터에서 유의미한 패턴과 인사이트를 도출할 수 있습니다.

 

 

 

 

참고 링크:

https://konlpy.org/ko/latest/index.html

 

KoNLPy: 파이썬 한국어 NLP — KoNLPy 0.6.0 documentation

KoNLPy: 파이썬 한국어 NLP KoNLPy(“코엔엘파이”라고 읽습니다)는 한국어 정보처리를 위한 파이썬 패키지입니다. 설치법은 이 곳을 참고해주세요. NLP를 처음 시작하시는 분들은 시작하기 에서 가

konlpy.org

scikit-learn Tutorials — scikit-learn 1.5.0 documentation

 

scikit-learn Tutorials

An introduction to machine learning with scikit-learn- Machine learning: the problem setting, Loading an example dataset, Learning and predicting, Conventions., A tutorial on statistical-learning f...

scikit-learn.org