상세 컨텐츠

본문 제목

텍스트 데이터 분석 기초 복습 2 (TF-IDF, Cosine Similarity, 정규표현식)

본문

안녕하세요?

오늘은 원래 텍스트 데이터 분석 기초 활동 중에서 Text Data Exploration을 복습하려고 했으나 이를 하기전에 좀 알고가야할 배경지식들이 좀 있어서 이들을 복습하면서 이해해보는 시간을 가져보려고 합니다.


TF-IDF 란?

  • 어떤 특정 단어(문장의 구성요소)가 문서나 말뭉치에서 어떤 중요도를 가지는지를 나타내는 지표
  • 단어를 갯수 그대로 카운트하지 않고, 불용어처럼 많은 문서에 공통적으로 들어있는 단어의 경우 문서 구별 능력이 떨어진다고 보아 가중치를 축소하는 방법
  • 문서 d(document)와 단어 t에 대해...

 

예시

  • 문서1 : 먹고 싶은 사과
  • 문서2 : 먹고 싶은 바나나
  • 문서3 : 길고 노란 바나나 바나나
  • 문서4 : 저는 과일이 좋아요

위 처럼 4개의 문서가 있다고 가정을 할 때 우리는 각 문서들을 벡터 공간으로 바꾸어 표현할 수 있습니다.(단어의 빈도수 tf값)

 

위 4개의 문서에 대한 idf값을 계산하게 되면 아래와 같을 것입니다.

이 idf값을 볼 때 한번 중요하게 생각해볼 것들은 다음과 같습니다.

  1. 4개문서 중에 1번씩만 등장한 '길고', '노란' 등 보다 2번씩 등장한 '먹고', '싶은' 등이 idf 값이 더 낮다는 점 (덜중요시봄)
  2. '바나나'가 문서3에서는 2번이나 언급되었으므로 1번만 언급된 문서2보다 idf 값이 더 높다는 점 (더중요시봄)

 

IDF 값에 로그가 사용되는 이유?

  • idf는 말그대로 특정 단어의 inverse document frequency인데 왜 그냥 df의 역수를 취하는 것이 아니고 log를 씌울까?
  • log를 사용하지 않고 그냥 df의 역수로 쓴다면...
    총 문서의수(n)이 커질수록, idf값이 기하급수적으로 커지게 되기 때문.
  • 즉, 문서 개수가 많아짐에 따라 문서 내 빈출단어와 희귀단어에 부여되는 가중치 차이를 줄이기 위해 사용
  • 로그의 밑은 하이퍼파라미터로 사용자가 결정해주며, 분모에 1을 더해주는 이유는 특정단어가 출현하지 않아 분모가 0이되는 상황을 막기 위함임.
  • 로그가 왜 필요한지 총 문서의 개수 n이 1,000,000 이라고 가정하고 값을 비교해보자.


Cosine Similarty (코사인 유사도)

  • 두 벡터 사이 각도의 코사인 값을 이용하여 측정하는 값으로,
  • 두 벡터의 유사한 정도를 의미
  • 계산된 유사도는 -1에서 1까지의 값을 가지며,
  • -1은 서로 완전히 반대되는 경우, 0은 서로 독립적인 경우, 1은 서로 완전히 같은 경우를 의미
  • 텍스트 매칭에 적용될 경우 A, B의 벡터로는 일반적으로 해당 문서에서의 단어 빈도가 사용된다.

 


정규표현식(re, Regular Expression)이란?

  • 특정한 규칙을 가진 문자열의 집합을 표현하는 데 사용하는 형식 언어
  • 텍스트 데이터를 대상으로 일정한 패턴을 따르는 위치를 찾는다거나, 패턴을 따르는 여부를 확인할 때 활용
  • ex. 주민등록번호에 패턴이 존재하는지, 이메일주소에 일정한 패턴이 있는지 등등..
  • 참고 링크 :  http://j.mp/2PzgFO8, https://hamait.tistory.com/342
 

정규표현식 (Regex) 정리

정규표현식은 아주 가끔 쓰기때문에 항상 다시 볼때마다 헷갈리곤 하기에 주요 사용예를 내가 나중에 다시 봤을 때 편하도록 정리하여 보았다. 정규 표현식의 용어들정규 표현식에서 사용되는

hamait.tistory.com

 

정규표현식 코드 간단 정리

  • ^ 꺽쇠가 시작의 의미
  • '^[a-zA-Z]+'  :  [a-zA-Z]중 무엇이든 하나 이상으로 시작 { + : one or more ('a', 'airplane') }
  • '^[a-zA-Z]*'  :  [a-zA-Z]중 무엇이든 0번 이상으로 시작 { * : zero or more ('a', 'airplane', '') }
  • '^[a-zA-Z]?'  :  [a-zA-Z]중 한번이거나, 0번이거나 (2번이상은 충족 x) { ? : zero or one ('a', 'B', '') }

 

정규표현식 예제 코드

import re  #정규표현식

# re.match('^[a-zA-Z]+', 'airplane')
print(type(re.match('^[a-zA-Z]+', 'airplane')))
print(re.match('^[a-zA-Z]+', 'airplane'))
print(bool(re.match('^[a-zA-Z]+', 'airplane')))
print()

print(re.match('^[a-zA-Z]+', 'NewJeans'))
print(re.match('^[a-zA-Z]+', '???lessrafim'))
print(re.match('^[ㄱ-ㅎ]+', 'ㅋㅋㅋㅋㅋㅋ'))
print(re.match('^[가-힣]+', 'ㅋㅋㅋㅋㅋㅋ'))
print(re.match('^[가-힣]+', '명서준'))
print()

# 꺽쇠지우고 findall
re.findall('[a-zA-Z]+', 'Temperature is 32, air is clean and ware')

관련글 더보기