목록전체 글 (315)
rueki

자연어 처리에서 토픽은 문서 집합의 추상적인 주제를 발견하기 위한 통계적 모델 중 하나이며, 텍스트 본문의 숨겨진 의미 구조를 발견하기 위해 사용되는 텍스트 마이닝 기법이다. Bow에 기반한 DTM이나 TF-IDF는 기본적으로 단어의 빈도 수를 이용한 수치화 방법으로 단어의 의미는 고려하지 않았다. 이에 대한 대안으로 나온 것이 잠재 의미 분석(LSA)이다. LSA를 이해하기 위해서는 선형대수의 특이값 분해(SVD)를 이해해야한다. 특이값 분해(SVD)는 실수 벡터 공간에 한정하여 내용을 설명한다. A가 m × n 행렬일 때, 다음과 같이 3개의 행렬의 곱으로 분해(decomposition)하는 것을 말한다. 직교행렬 : 자신과 자신의 전치 행렬의 곱 또는 이를 반대로 곱한 결과가 단위행렬이 되는 행렬 ..

1. 유클리드 거리 두 개의 점 P, q가 각각의 좌표를 가질 때, 두 점 사이의 거리를 계산하는 유클리드 공식이다. 2차원에서 두 점 p와 q사이의 거리를 구하는 것을 나타내었다. 두 점 사이의 유클리드 거리 공식은 피타고라스를 통해 구할 수 있다. 넘파이를 이용해서 구현해보자 import numpy as np def dist(x,y): return np.sqrt(np.sum((x-y)**2)) doc1 = np.array((2,3,0,1)) doc2 = np.array((1,2,3,1)) doc3 = np.array((2,1,2,2)) docQ = np.array((1,1,0,1)) print(dist(doc1,docQ)) print(dist(doc2,docQ)) print(dist(doc3,docQ..

코사인 유사도는 두 벡터 간의 코사인 각도를 이용하여 구할 수 있는 두 벡터의 유사도를 말한다. 두 벡터의 방향이 같으면 1, 직교일 때는 0, 서로 반대 방향이면 -1이다. 즉 1에 가까울 수록 유사도가 높다고 판단할 수 있다. 예제를 통해 코사인 유사도를 구해보자. 문서1 : 저는 사과 좋아요 문서2 : 저는 바나나 좋아요 문서3 : 저는 바나나 좋아요 저는 바나나 좋아요 위의 문서들에 대해 문서 단어 행렬을 만들면 밑의 표처럼 나온다 코사인 유사도를 numpy로 식을 만들어보자 from numpy import dot from numpy.linalg import norm import numpy as np def cos_sim(A, B): return dot(A,B) / (norm(A)*norm(B))..

TF-IDF(Term Frequency-Inverse Document Frequency)는 DTM(문서 단어 행렬) 내에 각 단어에 대한 중요도를 계산할 수 있다. 기존의 DTM 사용보다 정확하게 문서 비교가 가능하다. TF-IDF(단어 빈도-역 문서 빈도)는 DTM 내의 각 단어들마다 중요정도를 가중치로 준다. 순서로는 DTM을 만들고 TF-IDF를 주면 된다. 문서의 유사도, 검색 시스템에서 검색 결과의 중요도를 정하는 작업, 문서 내 특정 단어의 중요도를 구하는 작업 등에 쓰일 수 있다. TF-IDF는 TF와 IDF를 곱한 값으로서, 문서 : d 단어 : t 문서 총 갯수 : n tf(d,t) : 특정 문서 d에서의 특정 단어 t의 등장 횟수 = DTM의 각 단어들이 가진 등장 빈도 df(t) : ..

문서 단어 행렬(DTM)은 서로 다른 문서들의 Bow들을 결합한 표현 방법이다. 행과 열을 바꾸면 TDM이라고도 일컫으며, 서로 다른 문서들을 비교할 수 있게 된다. Bow(Box of words)를 하나의 행렬로 만든 것으로 볼 수 있으며, 각 단어들의 빈도를 행렬로 표현한다. 문서1 : 먹고 싶은 사과 문서2 : 먹고 싶은 바나나 문서3 : 길고 노란 바나나 바나나 문서4 : 저는 과일이 좋아요 이를 문서 단어 행렬로 표현하면 각 문서에 등장한 단어의 빈도를 행렬값으로 나타냈으며, 서로 비교가능한 것이 장점이다. 그러나 DTM은 원-핫 인코딩의 단점과 마찬가지로, 단어 집합의 크기가 벡터의 차원이 되고 대부분의 값이 0이 된다는 점이 있다. 가지고 있는 코퍼스가 방대하다면, 문서 벡터의 차원은 수백만..
단어의 순서는 고려하지 않고, 출현 빈도에만 집중하는 텍스트 데이터 수치화 표현 방법이다. Bow를 만드는 과정 1) 각 단어에 고유 인덱스 부여 2) 각 인덱스의 위치에 단어 토큰의 등장 횟수를 기록한 벡터(Vector) Bow를 한번 만들어보자 from konlpy.tag import Okt import re okt = Okt() token = re.sub("(\.)","","정부가 발표하는 물가상승률과 소비자가 느끼는 물가상승률은 다르다.") token = okt.morphs(token) token ['정부', '가', '발표', '하는', '물가상승률', '과', '소비자', '가', '느끼는', '물가상승률', '은', '다르다'] 토큰화 진ㅌ word2index = {} bow = [] for..

https://wikidocs.net/31767 를 참고해서 작성한 글입니다. Bag of Words(TDM) -> Locla Representatioin 국소 표현 : 단어의 빈도수를 카운트하여 단어를 수치화 LSA -> Continuous Representation 연속표현 : 단어의 뉘앙스를 반영, 토픽 모델링 주제 학습 Word2vec, FastText -> Continuous Representation 연속표현 : 예측 기반으로 단어의 뉘앙스 표현

본문은 https://wikidocs.net/21681 을 참고해서 작성한 글입니다. 앞에서 보았던 언어모델에서 다음으로 오는 단어를 예측하는 확률을 구할 때, 조건부 확률이 많이 나왔다. 그래서 조건부 확률을 이해해보자. A = 학생이 남학생인 사건 B = 학생이 여학생인 사건 C = 학생이 중학생인 사건 D = 학생이 고등학생인 사건 1. 학생을 뽑았을 때 남학생일 확률 P(A) = 180/360 = 0.5 2. 학생을 뽑았을 때 고등학생이면서 남학생일 확률 P(A n D) 80/360 3. 고등학생 중 한명을 뽑았을 때 남학생일 확률 P(A|D) = 80/200 = P(AnD) / P(D) = (80/360) / (200/360) = 0.4