텍스트마이닝 군집과 분류
독립변수(X변수) 만의 변수들만 활용 하여 군집과 분류 하게됨.
군집의 방법 및 프로세스
- 유사도의 측정 원리는 Vector를 활용하여 거리를 측정하게 됨
- 텍스트 마이닝에서는 문서의 토큰화된 것에 대하여 CountVectorizer, TfidfVectorizer, Word2Vec 등으로 벡터화 시킴
- 벡터화 된것을 활용 하여 유사도를 측정 하게됨
- 벡터화 방법은 TDF, TD-IDF, 주제어 적인 방법 등으로 변환
-
유틀리디안 유사도 : 두 문서 벡터의 상대적 거리차를 측정 - 0 에 가까울 수록 유사한 방식이다
\(\sqrt{ \sum_{f=1}^p (x_{if} - x_{jf})^2 }\) -
코사인 유사도: 두 문서가 같게되면 $\Theta$ 는 0이됨
- 두 벡터의 각도를 활용 하여 유사도를 측정하게 됨
- 유클리디언 차이점 : 코사인의 각도는 동일해도 원점에서 멀어질 수록 유클리디언 거리는 커지게 됨
-
즉, 빈도가 늘어나게 되면 유클리디언 거리는 커지지만 코사인 각도는 동일하게 됨
\(x \bullet y = \| x\| \| y\| cos \Theta\)
\(cos\Theta = \frac{ x \bullet y}{ \| x \| \| y \| } = \frac{ \sum_{i=1}^{n} { x_{i} \times x_{j} } } { \sqrt { \sum_{i=1}^n x_{i}^2 } \sqrt { \sum_{i=1}^n y_{i}^2 } }\)
-
- 3단계(군집)에서는 Clustering 하게됨
- 비계층적 방법 대표 : K-means
- 계층적 방법
- 단일링크 클러스터링(single), 완전링크 클러스터링(complete), 평균링크 클러스터링(average), 워드 링크법(ward)
파이썬 활용 유사도 계산
-
아래와 같이 벡터화 된 문서의 경우 ( ※ https://wikidocs.net/24603 참고)
- 바나나 사과 저는 좋아요 문서1 0 1 1 1 문서2 1 0 1 1 문서3 2 0 2 2
- 유클리디언 유사도 계산
# 유클리디언 import numpy as np def dist(x,y): return np.sqrt(np.sum((x-y)**2)) doc1=np.array([0,1,1,1]) # 문서1의 단어 벡터 doc2=np.array([1,0,1,1]) # 문서2의 단어 벡터 doc3=np.array([2,0,2,2]) # 문서3의 단어 벡터 docQ = np.array((1,1,0,1)) print(dist(doc1,docQ)) print(dist(doc2,docQ)) print(dist(doc3,docQ))
-
코사인 유사도 계산
# 코사인 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)) doc1=np.array([0,1,1,1]) # 문서1의 단어 벡터 doc2=np.array([1,0,1,1]) # 문서2의 단어 벡터 doc3=np.array([2,0,2,2]) # 문서3의 단어 벡터 print(cos_sim(doc1, doc2)) #문서1과 문서2의 코사인 유사도 print(cos_sim(doc1, doc3)) #문서1과 문서3의 코사인 유사도 print(cos_sim(doc2, doc3)) #문서2과 문서3의 코사인 유사도 import numpy as np from sklearn.metrics.pairwise import cosine_similarity matx = np.vstack([doc1, doc2, doc3]) cosine_similarity(matx)
-
자카드 유사도 : 교집합의 토큰 개수 / 합집합 [유니크한 집합] 토큰의 개수 로 유사도를 표현하게 됨
#자카이드 유사도 계산 #공통 등장한 단어는 'radio', 'computer', 'like' doc1 = "radio computer everyone like likey watch card holder" doc2 = "radio computer coupon passport like you" # 토큰화를 수행합니다. tokenized_doc1 = doc1.split() tokenized_doc2 = doc2.split() # 토큰화 결과 출력 print(tokenized_doc1) print(tokenized_doc2) # 문서1과 문서2의 합집합 union = set(tokenized_doc1).union(set(tokenized_doc2)) print(union) # 문서1과 문서2의 교집합 intersection = set(tokenized_doc1).intersection(set(tokenized_doc2)) print(intersection) # 자카드 유사도 = 교집합의 수를 합집합의 수로 나누기 print(len(intersection)/len(union))
클러스터링 방법
- 비계층적 클러스터링
- K-means 클러스터링
- 비계층적 클러스터링 (계층적-Hierarchical 방법이 아님)
- 개체 수가 증가하게 되면 유용하지 못함
- k개수를 정함이 분석자 마다 다름
- 알고리즘
- Step1) n개의 개체를 미리 k개의 클러스터로 나누고 클러스터 중심을 계산
- Step2) 각 개체와 클러스터 중심과의 거리를 계산(제곱합)
- Step3) 각 개체의 거리가 가장 짧은 클러스터에 분류
- Step4) 더 이상의 클러스터가 없을때 까지 반복 실행
- K-means 클러스터링
- 계층적 클러스터링 (Hierarchical 방법) :
- Dendogram 형태로 그려짐 : 상세보기
댓글남기기