Notice
Recent Posts
Recent Comments
Link
«   2026/06   »
1 2 3 4 5 6
7 8 9 10 11 12 13
14 15 16 17 18 19 20
21 22 23 24 25 26 27
28 29 30
Tags
more
Archives
Today
Total
관리 메뉴

개발자가 될래요

[플레이데이터 SK네트웍스 Family AI 캠프 23기] 8주차 회고 본문

SKN_Family_AI

[플레이데이터 SK네트웍스 Family AI 캠프 23기] 8주차 회고

Youcan 2026. 1. 19. 21:45

회고 방식


The four Fs

  • FACTS(사실, 객관) : 이번 일주일 동안 있었던 일, 내가 한 일
  • FEELINGS(느낌, 주관) : 나의 감정적인 반응, 느낌
  • FINDINGS(배운 것) : 그 상황으로부터 내가 배운 것, 얻은 것
  • FUTURE(미래) : 배운 것을 미래에는 어떻게 적용할 지

FACTS
머신러닝과 딥러닝을 이용한 프로젝트가 무사히 끝났다. 병원 노쇼율을 예측하는 것을 주제로 한 프로젝트로 나는 개발에 필요한 함수들의 모듈화, 날씨 API 호출, 머신러닝 모델 중 Logistic Regression과 LightGBM을 이용한 노쇼 예측을 담당하였다. 프로젝트는 잘 완성이 되었는데, 내가 맡은 역할에 대해 잘 한건지는 모르겠다.
그리고 금요일에는 NLP에 들어가게 됐다. NLP는 Natural Language Processing로, 자연어 처리와 텍스트 분석을 시작했다.

문장들을 토큰화하고, 품사별로 나누고 그런 것을 했던 것 같은데, 아직은 특정 라이브러리를 활용하여 코드만 입력해보고 있다.

 

FEELINGS
감기 몸살과 비염이 겹치면서 컨디션만 봤을 때는 가장 최악의 한 주를 보내게 됐다.. 프로젝트에도 완전히 몰입하기 힘들었어서 팀원들에게 미안하고 너무 아쉬운 기분이 들었다.

NLP를 시작했으니 이번에는 정말 프로젝트까지도 잘하고 싶은 마음이 든다.

 

FINDINGS

NLTK 라이브러리를 이용해서 문장을 토큰화하는 것을 배웠다.

더보기
# NLTK 문장 토큰화
text = '''The Matrix is everywhere its all around us, here even in this room.
You can see it out your window or on your television. 
You feel it when you go to work, or go to church or pay your taxes.'''

sent_tokenize(text)

 

['The Matrix is everywhere its all around us, here even in this room.',
 'You can see it out your window or on your television.',
 'You feel it when you go to work, or go to church or pay your taxes.']

 

# 문장 -> 단아 토큰화 함수
def tokenize_text(text):
    sentences = sent_tokenize(text)                             # 문장 단위로 분리
    return [word_tokenize(sentence) for sentence in sentences]  # 각 문장을 단어 리스트로 변환

tokenize_text(text)
[['The',
  'Matrix',
  'is',
  'everywhere',
  'its',
  'all',
  'around',
  'us',
  ',',
  'here',
  'even',
  'in',
  'this',
  'room',
  '.'],
 ['You',
  'can',
  'see',
  'it',
  'out',
  'your',
  'window',
  'or',
  'on',
  'your',
  'television',
  '.'],
 ['You',
  'feel',
  'it',
  'when',
  'you',
  'go',
  'to',
  'work',
  ',',
  'or',
  'go',
  'to',
  'church',
  'or',
  'pay',
  'your',
  'taxes',
  '.']]

그리고 다른 문장들에 대해 서로 벡터화하여 두 문장들의 특징을 표시하는 것에 대해도 알 수 있었다.

 

더보기
text1 = 'The Matrix is everywhere its all around us, here even in this room. \
You can see it out your window or on your television. \
You feel it when you go to work, or go to church or pay your taxes.'

text2 = 'You take the blue pill and the story ends.  You wake in your bed and you believe whatever you want to believe \
You take the red pill and you stay in Wonderland and I show you how deep the rabbit-hole goes.'

texts = [text1, text2]

 

# CounterVectorizer로 BoW 벡터화
from sklearn.feature_extraction.text import CountVectorizer

count_vectorizer = CountVectorizer()
count_vectorizer.fit(texts)                         # 단어 사전(vocabulary) 학습
text_vecs = count_vectorizer.transform(texts)       # 문서를 BoW 벡터로 변환 (최소행렬)

print(type(text_vecs), type(text_vecs.toarray()))   # 희소행렬과 ndarray 타입 확인
text_vecs.toarray()                                 # 희소행렬을 dense 배열로 변환해 확인

 

# 단어 사전(vocabulary)를 DataFrame으로 정리
import pandas as pd

# count_vectorizer.vocabulary_.items()
vocab = sorted(count_vectorizer.vocabulary_.items(), key=lambda x: x[1])        # 단어 인덱스 기준으로 정렬
vocab_df = pd.DataFrame(vocab, columns=['word', 'idx'])                     # (단어, 인덱스) 표로 정렬

 

# 단어 빈도 계산후 DataFrame에 추가
word_counts =  text_vecs.toarray().sum(axis=0)          # 전체 문서 기준 단어별 합계(빈도) 계산

vocab_df['count'] = vocab_df['idx'].apply(lambda i : word_counts[i])            # idx로 빈도값 매핑해서 컬럼 추가

vocab_df = vocab_df.drop(columns=['idx'])       # 불필요한 idx 컬럼 제거

 

# CountVectorizer n-gram + 상위 특성 제한
count_vectorizer = CountVectorizer(         
    stop_words='english',                   # 영어 불용어 제거
    ngram_range = (1, 2),                   # 1-gram ~ 2-gram 까지 생성
    max_features = 20                       # 빈도수 기준 상위 20개 특성
)
texts_vecs = count_vectorizer.fit_transform(texts)      # 학습 + BoW 반환(희소행렬)

print(texts_vecs.toarray().shape)                   # (문서 수, 특성 수)

count_vectorizer.get_feature_names_out()            # 선택된 특성(단어/바이그램) 목록

 

 

 

  • 행(row): 문서(여기서는 text1, text2 각 1개)
  • 열(column): tfidf_vectorizer.get_feature_names_out()로 나온 단어(특징) 순서
  • 값(value): 해당 문서에서 해당 단어의 TF-IDF 가중치

즉, toarray()의 [i, j] 값은 i번째 문서에서 j번째 단어가 얼마나 “중요한지” 를 나타낸다.

0인 경우

그 단어가 그 문서에 없다.

0이 아닌 경우 (예: 0.333…, 0.218…)

해당 단어가 문서에 있고, TF-IDF 계산 후 정규화(normalization) 된 값.

  • TfidfVectorizer 기본 설정은 보통
    • use_idf=True (IDF 사용)
    • norm='l2' (각 문서 벡터의 길이를 1로 맞춤)
  • 그래서 한 문서 안에서 여러 단어의 값들이 “적당히 나뉜” 숫자로 보인다.
  • 예를 들어 어떤 문서에서 의미 있는 단어가 9개 정도 있고 IDF 차이가 크지 않으면, 정규화 이후 값이 비슷하게 퍼질 수 있다.(예: 0.333…가 여러 개)

이 값들을 이용하여  문서 간의 코사인 유사도를 구하고 두 문서가 얼마나 비슷한지에 대해, 혹은 가장 관련이 높은 문서를 반환하는 검색 기능을 구현하거나, 분류, 군집 등을 만들 수 있다고 한다.

 

 

 

FUTURE

새로 배우는 것이니 만큼 열심히 최선을 다하고 싶다.