'numpy'에 해당하는 글 3건

문서들 간에 유사도를 구하기 위해서는 문서마다 동일한 단어나 비슷한 단어가 얼마나 사용되었는지를 파악할 수 있다. BoW, DTM, TF-IDF, Word2Vec 등의 방법으로 단어를 수치화 했다면, 유사도 기법을 사용하여 문서의 유사도를 구하는 게 가능하다.


  1. 코사인 유사도(Cosine similarity) 는 두 벡터의 방향에 따라 1~ -1 의 값을 가지며 1에 가까울수록 유사하다.
  2. 유클리드 거리(Euclidean distance) 는 두 점 사이의 직선 거리를 구하여 거리의 값이 작을수록 유사하다.
  3. 자카드 유사도(Jaccard similarity) 는 두개의 집합이 있을 때 합집합에서 교집합의 비율을 구하며, 1에 가까울 수록 유사하다.


문서1 : 저는 사과 좋아요

문서2 : 저는 바나나 좋아요

문서3 : 저는 바나나 좋아요 저는 바나나 좋아요


위 문서간의 유사도 구하기


from sklearn.feature_extraction.text import CountVectorizer
from numpy import dot
from numpy.linalg import norm
import numpy as np
 
corpus = [
    "저는 사과 좋아요",
    "저는 바나나 좋아요",
    "저는 바나나 좋아요 저는 바나나 좋아요",
]
vector = CountVectorizer()
dtm = vector.fit_transform(corpus).toarray()
print(dtm)
# [[0 1 1 1]
#  [1 0 1 1]
#  [2 0 2 2]]
 
def cos_sim(A, B):
    return dot(A, B) / (norm(A)*norm(B))
 
print(cos_sim(dtm[0], dtm[1])) #문서1과 문서2의 코사인 유사도 0.6666666666666667
print(cos_sim(dtm[0], dtm[2])) #문서1과 문서3의 코사인 유사도 0.6666666666666667
print(cos_sim(dtm[1], dtm[2])) #문서2과 문서3의 코사인 유사도 1.0000000000000002
 
def dist(A, B):
    return np.sqrt(np.sum((A-B)**2))
 
print(dist(dtm[0], dtm[1])) #문서1과 문서2의 유클리드 거리 1.4142135623730951
print(dist(dtm[0], dtm[2])) #문서1과 문서3의 유클리드 거리 2.6457513110645907
print(dist(dtm[1], dtm[2])) #문서2과 문서3의 유클리드 거리 1.7320508075688772
 
corp1 = corpus[0].split()
corp2 = corpus[1].split()
corp3 = corpus[2].split()
 
def jaccard(A, B):
    union = set(A).union(set(B))  # 합집합
    intersection = set(A).intersection(set(B))  # 교집합
    return len(intersection) / len(union)
 
print(jaccard(dtm[0], dtm[1])) #문서1과 문서2의 자카드 유사도 1.0
print(jaccard(dtm[0], dtm[2])) #문서1과 문서3의 자카드 유사도 0.3333333333333333
print(jaccard(dtm[1], dtm[2])) #문서2과 문서3의 자카드 유사도 0.3333333333333333
cs


위 코드에서 처럼 문서의 유사도의 성능은 각 문서의 단어들의 수치화 방법, 유사도 방법에 따라 다르다는 것을 알 수 있다.




WRITTEN BY
손가락귀신
정신 못차리면, 벌 받는다.

트랙백  0 , 댓글  0개가 달렸습니다.
secret

x와 y로 분리된 데이터에 대해 테스트 데이터를 분리할 수 있어야 한다.



사이킷런으로 분리


import numpy as np
from sklearn.model_selection import train_test_split
 
X, y = np.arange(10).reshape((52)), range(5)
 
print(X)
'''
[[0 1]
 [2 3]
 [4 5]
 [6 7]
 [8 9]]
'''
 
print(list(y))
# [0, 1, 2, 3, 4]
 
# test 데이터 비율을 20% 로 설정
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=1234)
 
print(X_test)  # [[8 9]]
print(y_test)  # [4]
cs



수동으로 분리


import numpy as np
 
X, y = np.arange(0,24).reshape((12,2)), range(12)
 
print(X)
'''
[[ 0  1]
 [ 2  3]
 [ 4  5]
 [ 6  7]
 [ 8  9]
 [10 11]
 [12 13]
 [14 15]
 [16 17]
 [18 19]
 [20 21]
 [22 23]]
'''
 
print(list(y))
# [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11]
 
# test 데이터 비율을 20%로 설정
n_train = int(len(X) * 0.8)  # 9
n_test = int(len(X) - n_train)  # 3
 
# train 데이터와 test 데이터 모두를 퍼센트로 구분할 경우 데이터가 누락될 수 있으므로,
# train 데이터나 test 데이터 중 하나만 선택하여 나머지와 함께 계산한다.
# 아래 예는 n_train 을 선택
X_test = X[n_train:] 
y_test = y[n_train:]
X_train = X[:n_train]
y_train = y[:n_train]
 
print(X_test)
print(list(y_test))
'''
[[18 19]
 [20 21]
 [22 23]]
[9, 10, 11]
'''
cs




WRITTEN BY
손가락귀신
정신 못차리면, 벌 받는다.

트랙백  0 , 댓글  0개가 달렸습니다.
secret

지도 학습(Supervised Learning) 에서 질문과 그에 적합한 답을 기계에 학습시킬 때, 데이터로부터 질문(x)과 답(y)을 구분해 학습시켜야 한다. 



zip 함수로 분리


q_a = [['질문1'1], ['질문2'2], ['질문3'3]]
x, y = zip(*q_a)
 
# x = ('질문1', '질문2', '질문3')
# y = (1, 2, 3)
cs



DataFrame 으로 분리


import pandas as pd
 
data = [['질문1'1], ['질문2'2], ['질문3'3]]
columns = ['질문컬럼''답변컬럼']
 
df = pd.DataFrame(data, columns=columns)
= df['질문컬럼']
= df['답변컬럼']
print(df)
print(x)
print(y)
 
"""
  질문컬럼  답변컬럼
0  질문1     1
1  질문2     2
2  질문3     3
0    질문1
1    질문2
2    질문3
Name: 질문컬럼, dtype: object
0    1
1    2
2    3
Name: 답변컬럼, dtype: int64
"""
cs



Numpy 로 분리


import numpy as np
 
arr = np.arange(0,16).reshape(4,4)
"""
[[ 0  1  2  3]
 [ 4  5  6  7]
 [ 8  9 10 11]
 [12 13 14 15]]
"""
 
res = arr[:, :2
"""
[[ 0  1]
 [ 4  5]
 [ 8  9]
 [12 13]]
"""
 
res = arr[:, 3]
# [ 3  7 11 15]
cs




WRITTEN BY
손가락귀신
정신 못차리면, 벌 받는다.

트랙백  0 , 댓글  0개가 달렸습니다.
secret