언어모델

 

  • 목표 : 문장이 일어날 확률을 구하는 것
  • 왜 필요한가?
    • 기계번역 (machine translation)
    • 맞춤법 검사 (spell correction)
    • 음성인식 (speech recognition)
  • 언어모델(Language Model) : 연속적 단어들(sequence of words)에 확률을 부여하는 모델
    • P(W) = P(w_1, w_2, w_3 ..., w_n)
  • 관련된 일 : 연속적 단어들이 주어졌을 때 그 다음 단어의 확률을 구하는 것
    • P(w_n | w_1, w_2, ..., w_(n-1))

P(W) 구하기

 

  • 결합확률(joint probability) 구하기
    • P(its, water, is, so, transparent, that) => Chain rule을 사용해보자.
    • Chain Rule
      • 조건부 확률

        P(B | A) = P(A, B) / P(A)
        P(A, B) = P(A)P(B | A)
      • 두 개 이상 확률 변수들의 경우

        P(A, B, C, D) = P(A)P(B | A)P(C | A,B)P(D | A,B,C)
        P(A, B, C)P(D | A, B, C) = P(A, B)P(C | A, B)P(D | A,B,C)
      • 일반적인 경우

        P(x_1, x_2, ..., x_n) = P(x_1)P(x_2 | x_1)P(x_3 | x_1,x_2)...P(x_n | x_1, x_2, ..., x_(n-1))
      • P("its water is so transparent") =
        P(its) * P(water | its) * P(is | its water) * P(so | its water is) * P(transparent | its water is so)
      • 조건부 확률 P(w | h(history))

        P(the | its water is so transparent that) =
        Count(its water is so transparent that the) / Count(its water is so transparent that)
        • 가능한 문장의 개수가 너무 많고, 이를 계산할 수 있는 충분한 양의 데이터를 가지지 못할 것이란 문제가 있음.
    • Markov Assumption
      • 한 단어의 확률은 그 단어 앞에 나타나는 몇 개 단어들에만 의존한다는 가정
      • P(the | its water is so transparent that) ≈ P(the | that)
        p(the | its water is so transparent that ≈ P(the | transparent that)
      • Unigram 모델 : 단어가 나타날 확률은 이전의 단어에 의존하지 않는다는 극단적 모델 
      • Bigram 모델 : 단어가 나타날 확률은 바로 이전의 단어에만 의존한다.
        • 확률 계산
          • Maximum likelihood estimation
      • N-gram 모델
        • trigrams, 4-grams, 5-grams로 확장가능
        • 멀리 떨어진 단어들간의 관계(long-distance dependencies)를 완벽히 모델링하진 못함
        • 하지만 많은 경우 n-gram만으로도 좋은 결과를 얻을 수 있음 

모델 평가

 

  • 외재적 평가(exctrinsic evaluation)
    • 언어모델은 일반적으로 그 자체가 목표이기보단 특정 과제(맞춤법 검사 등)를 위한 부분으로서 쓰여지게 된다.
    • 따라서 언어모델이 좋은지 판단하기 위해선 그 과제의 평가지표를 사용하는 경우가 많다.
    • ex) 맞춤법 검사를 위해 두 개의 언어모델 A, B를 사요할 때
      • 각 모델을 사용해 얼마나 정확히 맞춤법 오류를 수정할 수 있는지 계산한다.
      • 정확도가 높은 언어모델을 최종적으로 사용한다.
  • 내재적 평가(intrinsic evaluation)
    • 외재적 평가는 시간이 많이 걸리는 단점이 있다.
    • 언어모델이 학습하는 확률자체를 평가할 수 있다. : Perplexity
    • 이 기준에서의 최적의 언어모델이 최종 과제에서 최적은 아닐 수도 있다.
    • 하지만 언어모델 학습과정에 버그가 있었는지 빨리 확인하는 용도로 사용할 수 있다.
  • 좋은 언어모델이란?
    • 테스트 데이터를 높은 확률로 예측하는 모델
      • Perplexity(PP) : 확률 역수를 단어 개수로 정규화한 값
        • Perplexity를 최소화하는 것이 확률을 최대화하는 것.

'AI > KDT 인공지능' 카테고리의 다른 글

[07/30] NLP : 단어 임베딩  (0) 2021.07.30
[07/29] NLP : 문서분류  (0) 2021.07.29
[07/27] NLP : 텍스트 전처리  (0) 2021.07.28
[07/22] Spark 3  (0) 2021.07.22
[07/21] Spark 2  (0) 2021.07.21

자연어 처리란?

 

자연어의 의미를 컴퓨터로 분석해 특정 작업을 위해 사용할 수 있도록 하는 것

 

  • 응용 분야
    • 기계 번역
    • 감성 분석
    • 문서 분류
    • 질의 응답 시스템
    • 챗봇
    • 언어 생성
    • 음성 인식
    • 추천 시스템

단어 (Word)

 

  • 문장부호를 단어에 포함시켜야 할까?
    • 단어들 사이의 경계를 짓는 역할을 할 경우
    • 문장의 의미에 영향을 주는 경우
  • 구어체 문장의 경우
    • ex) I do uh main-mainly business data processing
    • main- 처럼 말을 더듬어 깨어진 단어가 나타나는 경우(Fragments)
    • uh와 같이 중간에 의미 없는 추임새(filled pauses)
  • 표제어(lemma) : 여러 단어들이 공유하는 뿌리 단어
  • 단어 형태(wordform) : 같은 표제얼르 공유하나 다양한 형태를 가지는 경우

  • 단어 정의
    • Vocabulary : 단어 집합
    • Type : Vocabulary의 한 원소 
    • Token : 문장 내 나타나는 한 단어 (an instance of a type in running text)
    • They picnicked by the pool, then lay back on the grass and looked at the stars.
      • 16 tokens
      • 14 types (the가 반복)

말뭉치(Corpus)

 

  • 하나의 말뭉치(corpus)는 일반적으로 대용량 문서들의 집합이다.
  • 말뭉치 특성은 아래 요소들에 따라 달라지게 된다.
    • 언어 (7097개 언어 존재)
    • 방언
    • 장르(뉴스, 소설, 과학기술문서, 위키피디아, 종교문서 등)
    • 글쓴이 인구 통계적 속성 (나이, 성별, 인종 등)
  • 다양한 말뭉치에 적용할 수 있는 NLP 알고리즘이 바람직.

텍스트 정규화

 

모든 자연어 처리는 텍스트 정규화가 필요하다.

  • 토큰화 (tokenizing words)
  • 단어정규화 (normalizing word formats)
  • 문장분절화 (segmenting sentences)

Unix 명령으로 간단히 토큰화하기

 

  • 텍스트 파일 안에 있는 단어들 토큰화
    • tr -sc 'A-Za-z' '\n' < ooo.txt 
      • 주어진 텍스트파일 안에 있는 모든 단어들에 대해 newline으로 replace를 해준다.
        • ex) Hello I studying nlp now
        • Hello
          I
          studying
          nlp
          now
  • 빈도수로 정렬
    • tr -sc 'A-Za-z' '\n' < ooo.txt | sort | uniq -c | sort -n -r
  • 소문자로 변환해 정렬
    • tr 'A-Z' 'a-z' < ooo.txt | tr -sc 'a-z' '\n' | sort | uniq -c | sort -n -r

 

문제점들

 

  • 문장부호(punctuation)들을 항상 무시할 수 없다
    • 문장부호가 단어 의미를 명확히 하는 경우 제외시키지 않는 것이 좋다.
  • 접어(clitics) : 다른 단어에 붙어 존재하는 형태 ex) I'm -> I am
  • 여러 개 붙어야 의미 있는 경우 ex) rock'n'roll

한국어의 경우에서의 토큰화

 

  • 토큰화가 복잡함
  • 띄어쓰기가 잘 지켜지지 않고 띄어쓰기가 제대로 되어도 한 어절은 하나 이상의 의미 단위들이 있을 수 있다.
  • 형태소(morpheme) : 뜻을 가진 가장 작은 말의 단위
    • 자립형태소 : 명사, 대명사, 부사 등
    • 의존형태소 : 다른 형태소와 결합하여 사용되는 형태소. 접사, 어미, 조사 등
  • 단어보다 작은 단위(subword)로 토큰화가 필요하다.

Subword Tokenization

 

  • 만약 학습데이터에서 보지 못한 새로운 단어가 나타나면
    • 학습데이터 : low, new, newer
    • 테스트 데이터 : lower
    • -er, -est 등과 같은 형태소를 분리할 수 있으면 좋을 것
  • Subword tokenization algorithms
    • Byte-Pair Encoding (BPE)
    • WordPiece : 위와 유사한데 좀 더 확률적 개념을 활용해 향상시킨 모델
    • Unigram language modeling : 완전 확률을 기반한 모델
  • 두 가지 구성요소
    • Token learner : 말뭉치에서 vocabulary (token들 집합)을 만들어 냄
    • Token segmenter : 새로운 문장을 토큰화함.

Byte Pair Encoding(BPE)

 

  • 알고리즘 과정
    • Vocabulary를 단일 문자들 집합으로 초기화한다.
    • 다음을 반복
      • 말뭉치에서 연속적으로 가장 많이 발생하는 두 개 기호들(vocabulary 내 원소들)을 찾음
      • 두 기호들을 병합해 새로운 기호로 vocabulary에 추가
      • 말뭉치에서 그 두 기호들을 병합된 기호로 모두 교체
    • 위 과정을 k번 병합이 일어날 때까지 반복
  • 기호병합은 단어 안에서만 이뤄짐. 이것을 위해 단어끝을 나타내는 특수기호 '_'을 단어 뒤에 추가함. 그리고 각 단어를 문자 단위로 쪼갠다.
  • ex corpus )
    low low low low low lowest lowest newer newer newer newer newer newer wider wider wider new new
    • corpus
      5 l o w _
      2 l o w e s t _
      6 n e w e r _
      3 w i d e r _
      2 n e w _

      vocabulary
      _, d, e, i, l, n, o, r, s, t, w
    • e r을 er로 병합
      corpus
      5 l o w _
      2 l o w e s t _
      6 n e w er _
      3 w i d er _
      2 n e w _

      vocabulary
      _, d, e, i, l, n, o, r, s, t, w, er
    • er _을 er_로 병합
      corpus
      5 l o w _
      2 l o w e s t _
      6 n e w er_
      3 w i d er_
      2 n e w _

      vocabulary
      _, d, e, i, l, n, o, r, s, t, w, er, er_
    • n e을 ne로 병합
      corpus
      5 l o w _
      2 l o w e s t _
      6 ne w er_
      3 w i d er_
      2 ne w _

      vocabulary
      _, d, e, i, l, n, o, r, s, t, w, er, er_, ne
    • 다음과 같은 병합들이 일어남
      Merge          Current Vocabulary
      (ne, w)          _, d, e, i, l, n, o, r, s, t, w, er, er_, ne, new
      (l, o)             _, d, e, i, l, n, o, r, s, t, w, er, er_, ne, new, lo
      (lo, w)           _, d, e, i, l, n, o, r, s, t, w, er, er_, ne, new, lo, low
      (new, er_)       _, d, e, i, l, n, o, r, s, t, w, er, er_, ne, new, lo, low, newer_
      (low, er_)        _, d, e, i, l, n, o, r, s, t, w, er, er_, ne, new, lo, low, newer_, low_

  • Token segmenter
    • 새로운 단어가 주어졌을 때 어떻게 토큰화할 것인지?
    • Greedy한 적용 : 병합 학습한 순서대로 적용 ("e r" => "er")
    • 자주 나타나는 단어는 하나의 토큰으로 병합됨
    • 드문 단어는 subword 토큰들로 분할됨
  • 하나의 단어 "n e w e r _"은 하나의 토큰 "newer_"로 토큰화됨
  • 하나의 단어 "l o w e r _"은 두 개 토큰들 "low er_"로 토큰화됨

WordPiece

 

  • 기호들의 쌍을찾을 때 빈도수(BPE) 대신 likelihood를 최대화시키는 쌍을 찾음
    • ex)
      Corpus C

      5 l o w _
      2 l o w e s t _ 
      6 n e w e r _
      3 w i d e r _
      2 n e w _
    • Corpus C_1

      5 l o w _
      2 l o w e s t _ 
      6 n e w er _
      3 w i d er _
      2 n e w _
    • Corpus C_2

      5 lo w _
      2 lo w e s t _ 
      6 n e w e r _
      3 w i d e r _
      2 n e w _
    • P(C_1) > P(C_2)이면 "er" 생성

Unigram 

 

  • 확률모델(언어모델)을 사용
  • 학습데이터 내 문장을 관측(observed) 확률변수로 정의
  • Tokenization을 잠재(latent) 확률변수로 정의
    • 연속적(Sequential) 변수
  • 데이터 주변 우도(marginal likelihood)를 최대화시키는 tokenization을 구함
    • EM(expectation maximization) 사용
    • Maximization step에서 Viterbi 알고리즘 사용(wordpiece는 greedy하게 likelihood 향상)

단어 정규화

 

  • 단어들을 정규화된 형식으로 표현
    • ex)
      U.S.A. or USA or US (하나로 통일)
      uhhuh or uh-huh
      Fed or fed
      am, is be, are
  • 검색엔진에서 문서들을 추출할 때 유용할 수 있다.
  • Case floding
    • 모든 문자들을 소문자화함
      • 일반화(generalization)를 위해 유용. 학습데이터와 테스트데이터 사이 불일치 문제에 도움
      • 정보검색, 음성인식 등에서 유용
      • 감성 분석 등의 문서 분류 문제에선 오히려 대소문자 구분이 유용할 수 있음.
        (ex) 국가이름 US / 대명사 us)
  • Lemmatization
    • 어근을 사용해 표현
      • ex)
        am, are, is -> be
        car, cars, car's, cars' -> car
  • 최근 단어 정규화 경향 -> 가능하면 하지 않으려고 한다. 
    • 단어 정규화가 필요한 근본적 이유
      • 단어들 사이 유사성을 이해해야하기 때문
      • 단어 정규화 작업을 같은 의미를 가진 여러 형태 단어들을 하나의 단어로 대응시키는 것으로 이해할 수 있음
    • 단어를 Vocabulary로 정의된 공간(고차원 희소 벡터)이 아닌 저차원 밀집 벡터로 대응시킬 수 있다면?
      • ex)
        car => [0.13, 0.52, 0.01]
        cars => [0.15, 0.49, 0.02]
      • 단어임베딩을 사용해 단어를 표현하게 되면 단어정규화 필요성이 줄어들게 됨.

'AI > KDT 인공지능' 카테고리의 다른 글

[07/29] NLP : 문서분류  (0) 2021.07.29
[07/28] NLP : 언어 모델  (0) 2021.07.28
[07/22] Spark 3  (0) 2021.07.22
[07/21] Spark 2  (0) 2021.07.21
[07/20] Spark  (0) 2021.07.20

Spark MLib 소개

 

  • 머신러닝 관련 다양한 알고리즘, 유틸리티로 구성된 라이브러리
    • Classfication, Regression, Clustering, Collaborative Filtering(명시적 피드백(ex)리뷰 평점), 암묵적 피드백(ex)클릭, 구매 등등) 기반), Dimensionality, Reduction
    • 아직 딥러닝 지원은 미약
  • 여기엔 RDD 기반과 데이터프레임 기반 두 버전 존재
    • spark.mlib vs spark.ml
      • mlib가 RDD 기반. ml은 데이터프레임 기반
      • mlib는 RDD 위에서 동작하는 이전 라이브러리. 더 이상 업데이트가 안됨. 항상 spark.ml을 사용할 것! (import pyspark.ml(o) import pyspark.mlib(x))
  • Spark MLib 장점
    • 원스톱 ML 프레임워크
      • 데이터프레임과 SparkSQL 등을 이용해 전처리
      • 모델 빌딩
      • ML Pipeline을 통해 모델 빌딩 자동화
      • MLflow로 모델 관리하고 서빙
    • 대용량 데이터도 처리 가능
  • MLflow
    • 모델 관리와 서빙을 위한 Ops(Operations) 관련 기능 제공
  • Spark MLib 기반 모델 빌딩 기본 구조
    • 여느 라이브러리 사용 모델 빌딩과 크게 다르지 않음
      • 트레이닝셋 전처리
      • 모델 빌딩
      • 모델 검증
    • Scikit Learn과 비교했을 때 장점
      • 차이점은 데이터 크기
      • 트레이닝셋 크기가 크면 전처리와 모델 빌딩에 있어 Spark가 큰 장점을 가짐
      • Spark는 ML 파이프라인을 통해 모델 개발 반복을 쉽게 해줌

Spark MLib 피쳐 변환

 

  • 피쳐 추출과 변환
    • 피쳐 값들을 모델 훈련에 적합한 형태로 바꾸는 것을 지칭
    • 크게 두 가지 존재
      • Feature Extractor
        • 기존 피쳐에서 새로운 피쳐 추출
        • ex) TF-IDF, Word2Vec
      • Feature Transformer
        • 피쳐 값들은 숫자 필드여야 함. Categorical Data -> Numerical Data
        • 숫자 필드 값 범위 표준화 Feature Scaling or Normalization
        • 비어있는 필드들 값을 어떻게 채울까? Imputer
        • StringIndexer : 텍스트 카테고리를 숫자로 변환
          • sklearn.preprocessing 모듈에 다음과 같은 인코더 존재
            • OneHotEncoder, LabelEncoder, OrdinalEncoder, ...
          • Spark MLib 경우 pyspark.ml.feature 모듈 밑에 두 개의 인코더 존재
            • StringIndexer, OneHotEncoder
            • from pyspark.ml.feature import StringIndexer
              
              gender_indexer = StringIndexer(inputCol = 'Gender', outputCol = 'GenderIncdexed')
              gender_indexer_model = gender_indexer.fit(final_data)
              final_data_with_transformed_gender = gender_indexer_model.transform(final_data)
        • Sclaer : 숫자 필드값 범위 표준화
          • 숫자 필드 값 범위를 특정 범위로 변화하는 것. 피쳐 스케일링 또는 정규화라 부름
          • sklearn.preprocessing 모듈 아래 두 개 스케일러 존재 StandardScaler, MinMaxScaler
          • Spark MLib의 경우 pyspark.ml.feature 모듈 밑 두 개 스케일러 존재
            • StandardScaler
              • 각 값에서 평균을 빼고 이를 표준편차로 나눔. 값의 분포가 정규분포를 따르는 경우 사용
            • MinMaxScaler
              • 모든 값을 0과 1 사이로 스케일. 각 값에서 최소값을 빼고 (최대값 - 최소값)으로 나눔
        • Imputer : 값이 없는 필드 채우기
          • 값이 존재하지 않는 레코드들이 존재하는 필드들의 경우 기본값을 정해 채우는 것. Impute한다 부름.
          • sklearn.preprocessing 모듈 아래 존재. Imputer
          • Spark MLib의 경우 pyspark.ml.feature 모듈 밑에 존재
            • Imputer

Spark MLib ML Pipeline 살펴보기

 

  • 모델 빌딩 관련 문제들
    • 트레이닝 셋 관리가 안됨
    • 모델 훈련 방법이 기록이 안 됨 (ML Pipeline을 통해 해결)
      • 어떤 트레이닝 셋을 사용했는지?
      • 어떤 피쳐들을 썼는가?
      • 하이퍼 파라미터는 무엇을 사용했는가?
    • 모델 훈련에 많은 시간 소요 (ML Pipeline을 통해 해결)
      • 모델 훈련이 자동화가 안 된 경우 각 스텝들을 노트북 등 일일히 수행
      • 에러 발생 여지가 많음. 특정 스텝을 까먹거나 다른 방식을 적용하는 경우...
  • ML 파이프라인이란?
    • 데이터 과학자가 머신러닝 개발과 테스트를 빠르게 해주는 기능
    • 머신러닝 알고리즘 관계 없이 일관된 형태의 API를 사용하여 모델링 가능
    • ML 모델개발과 테스트를 반복 가능하게 해줌.
    • 구성 요소
      • 데이터프레임
        • 기본적으로 CSV, JSON, Parquet, JDBC(관계형 데이터베이스) 지원
        • 다음 2가지 새로운 데이터 소스 지원
          • 이미지 데이터 소스
          • LIBSVM 데이터 소스
            • label과 features 두 개 컬럼으로 구성된 머신러닝 트레이닝셋 포맷
            • features 컬럼은 벡터 형태 구조를 가짐
      • Transformer
        • 입력 데이터프레임을 다른 데이터프레임으로 변환
          • 하나 이상의 새로운 컬럼 추가
        • 두 종류의 Transformer가 존재하며 transform이 메인 함수
          • Feature Transformer
            • 입력 데이터프레임의 컬럼으로부터 새로운 컬럼을 만들어내 이를 추가한 새로운 데이터프레임을 출력으로 내줌. 보통 피쳐 엔지니어링을 하는데 사용
            • ex) Imputer, StringIndexer, VectorAssembler
          • Learning Model
            • 머신러닝 모델에 해당
            • 피쳐 데이터프레임을 입력으로 받아 예측값이 새로운 컬럼으로 포함된 데이터프레임을 출력으로 내줌. : prediction, probability
      • Estimator
        • 머신러닝 알고리즘에 해당. fit이 메인 함수
        • 모델 정보를 저장하고 읽는 함수 제공. save와 load
      • Parameter
        • Transformer와 Estimator의 공통 API.
        • 두 종류의 파라미터 존재
          • Param(하나의 이름과 값)
          • ParamMap (Param 리스트)

'AI > KDT 인공지능' 카테고리의 다른 글

[07/28] NLP : 언어 모델  (0) 2021.07.28
[07/27] NLP : 텍스트 전처리  (0) 2021.07.28
[07/21] Spark 2  (0) 2021.07.21
[07/20] Spark  (0) 2021.07.20
[07/19] 12주차 강의 개요  (0) 2021.07.19

커리어 이야기

 

  • 이것만은 기억하자!
    • 남과 비교하지 말고 앞으로 2-30년을 보자
    • 하나를 하기로 하면 적어도 6개월은 파자.
      • 너무 빨리 포기하지 말자. 잘하는 사람들과 비교 금물. 어제의 나와 오늘의 나를 비교하자.
      • 뭐가 잘 안 되면 오히려 천천히 가자
    • 공부를 위한 공부를 하기보단 일을 시작해보자.
      • 어디건 일을 시작하고 발전하자.
      • 면접 실패를 감정적으로 받아들이지 말자.
    • Love Myself!
  • 커리어를 점진적 발전이라는 관점에서 보기
    • 커리어가 평생 직장이란 것이 존재하던 세상에서는 Waterfall(폭포수)였으나 이제는 계속해서 배우고 변해야 하는 Scrum으로 변화하였다. 
      • 어디서 시작하건 자신에 대해 배우며 계속해서 변화하고 성장하는 것이 중요하다. 
      • Growth Mindset
  • 새로운 시작(ex) 첫 직장에서의 일과 같은.. ) - 처음 90일이 중요하다. (The First ninety days)
    • 자기 검열하지 말고 매니저 스타일을 파악하고 피드백을 요청하기
    • 과거 상처를 갖고 시작하지 않기
    • 남과 비교하지 않기
    • 열심히 일하되 너무 서두르지 않기
  • 새로운 기술의 습득이 아닌 결과를 내는데 초점 맞추기
    • 아주 나쁘지 않은 환경에 있단 전제
    • 자신이 맡은 일을 잘 하기 위해 필요한 기술 습득
      • 예를 들어 자동화하기 혹은 실행시간 단축
    • 자신이 맡은 일의 성공/실패를 어떻게 결정하는지 생각
      • 매니저와의 소통이 중요
      • 성공/실패 지표에 대해 생각
    • 일을 그냥 하지 말고 항상 '왜' 이 일이 필요하고 큰 그림 생각
      • 질문하기

SQL 소개

 

  • 구조화된 데이터를 다루는 SQL. 데이터 규모와 상관없이 쓰인다.
  • 모든 대용량 데이터 웨어하우스는 SQL 기반이다.
    • Redshift, Snowflake, BigQuery, Hive, SparkSQL ...
  • 데이터 분야에서 일하고자 하면 반드시 익혀야 할 기본 기술이다.
  • 관계형 데이터베이스
    • 대표적 관계형 데이터베이스
      • MySQL, Postgres, Oracle, ...
      • Redshift, Snowflake, BigQuery, Hive ...
    • 관계형 데이터베이스는 2단계로 구성된다.
      • 가장 밑단엔 테이블들이 존재
      • 테이블들은 데이터베이스라는 폴더 밑으로 구성
    • 테이블(=스키마) 구조
      • 테이블들은 레코드들로 구성
      • 레코드는 하나 이상의 필드로 구성
      • 필드는 이름과 타입으로 구성됨

관계형 데이터베이스 예제 : 웹 서비스 사용자 / 세션 정보

 

  • 데이터
    • 사용자 ID : 보통 웹서비스에서 등록된 사용자마자 유일한 ID 부여
    • 세션 ID
      • 사용자가 외부 링크(보통 광고)를 타고 오거나 직접 방문해서 올 경우 세션 생성
      • 즉, 하나의 사용자 ID는 여러 개 세션 ID를 가질 수 있음
      • 보통 세션의 경우 세션을 만들어낸 소스를 채널이란 이름으로 기록해둠
        • 마케팅 관련 기여도 분석을 위함
      • 세션 생성 시간도 기록
  • 위의 데이터를 통해 다음과 같은 다양한 데이터 분석과 지표 설정 가능
    • 마케팅 관련
    • 사용자 트래픽 관련
    • etc

 

  • ex) 사용자 ID 100번이 총 3개의 세션을 갖는 예제
    • 100번 ID를 가진 사용자의 웹 서비스 이용 경로
      • 09:30 AM : 구글 광고 타고 방문
      • 09:31 AM : 상품 광고 클릭
      • 09:33 AM : 상품 리뷰 페이지 클릭
      • 09:45 AM : 페이스북 광고 타고 방문
      • 09:47 AM : 다른 상품 광고 클릭
      • 10:30 AM : 네이버 광고 타고 방문
      • 10:35 AM : 상품 구매

 

위의 데이터에 대해 생성될 수 있는 데이터베이스와 테이블은 다음과 같다.

 

  • raw_data 데이터베이스
    • user_session_channel
      • 컬럼 타입
        userid int
        sessionid varchar(32)
        channel varchar(32)
      • channel 값 ex) instagram, facebook, naver, etc...
    •  session_timestamp
      • 컬럼 타입
        sessionid varchar(32)
        ts timestamp
  • marketing 데이터베이스
  • ...
  • SQL(Structured Query Language) 소개
    • 1970년대 초반 IBM이 개발한 구조화된 데이터 질의 언어
      • 주로 관계형 데이터베이스에 있는 데이터(테이블)를 질의하는 언어
    • 두 종류의 언어로 구성된다.
      • DDL(Data Definition Language) : 테이블 구조 정의어
        • CREATE TABLE / DROP TABLE / ALTER TABLE
        • --ex
          
          CREATE TABLE raw_data.user_session_channel(
              userid int,
              sessionid varchar(32),
              channel varchar(32)
          );
      • DML(Data Manipulation Language) : 테이블 조작 정의어
        • SELECT FROM / INSERT INTO / UPDATE SET / DELETE FROM
        • -- ex
          
          SELECT * FROM raw_data.user_session_channel LIMIT 10; -- 10개의 데이터를 읽어와라
          
          SELECT COUNT(1) FROM raw_data.user_session_channel;
          
          SELECT COUNT(1) FROM raw_data.user_session_channel;
          WHERE channel='Facebook'; -- channel 이름이 Facebook인 경우만 고려
          
          SELECT COUNT(1) FROM raw_data.user_session_channel;
          WHERE channel like '%o%'; -- channel 이름에 o나 O가 있는 경우만 고려
          
          SELECT channel, COUNT(1) --channel별 레코드 수 카운트하기
          FROM raw_data.user_session_channel
          GROUP BY channel;
        • 세션에 대한 모든 정보를 읽어오려면 user_session_channel과 session_timestamp를 조인해야 한다.
        • SELECT *
          FROM raw_data.user_session_channel usc
          JOIN raw_data.session_timestamp ts ON usc.sessionID = ts.sessionID;

 


SparkSQL 소개

 

  • SparkSQL과 Spark Core의 차이점
    • 구조화된 데이터 처리를 위한 Spark 모듈
    • 대화형 Spark shell 제공
    • 하둡 상 데이터를 기반으로 작성된 hive 쿼리의 경우 변경없이 최대 5~10배까지 빠른 성능을 가능하게 해준다.
    • 데이터 프레임을 SQL로 처리 가능
      • RDD 데이터, 외부 데이터는 데이터프레임으로 변환 후 처리 가능
      • 데이터프레임은 테이블이 되고 그 다음부터 SQL 함수 사용 가능
  • Spark의 일반적 사용법 이해
    • 외부 데이터베이스 연결
      • 외부 데이터베이스 기반 데이터 프레임 생성
        • SparkSession의 read 함수를 사용해 테이블 혹은 SQL 결과를 데이터프레임으로 읽어옴
      • Redshift 연결 
        • SparkSession을 만들 때 외부 데이터베이스에 맞는 JDBC jar 지정
        • SparkSession의 read 함수 호출
          • 로그인 관련 정보와 읽어오고자 하는 테이블 혹은 SQL 지정
          • 결과가 데이터 프레임으로 리턴됨
        • 데이터 프레임 기반 테이블 뷰 생성 : 테이블이 만들어짐
          • createOrReplaceTempView : sparkSession이 살아있는 동안 존재
          • createGlobalTempView : Spark 드라이버가 살아있는 동안 존재
        • SparkSession의 sql 함수로 SQL 결과를 데이터 프레임으로 받음

'AI > KDT 인공지능' 카테고리의 다른 글

[07/27] NLP : 텍스트 전처리  (0) 2021.07.28
[07/22] Spark 3  (0) 2021.07.22
[07/20] Spark  (0) 2021.07.20
[07/19] 12주차 강의 개요  (0) 2021.07.19
[06/28] 심층학습 기초2  (0) 2021.06.28

+ Recent posts