์ผ | ์ | ํ | ์ | ๋ชฉ | ๊ธ | ํ |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | |||
5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | 29 | 30 | 31 |
- ์๋ํด๋ผ์ฐ๋
- LDA
- ADsP
- dataframe
- Python
- ํ ์คํธ๋ถ์
- ADP
- t-test
- ๋ฐ์ดํฐ๋ถ๊ท ํ
- ํฌ๋กค๋ง
- ๋ฐ์ดํฐ๋ถ์์ ๋ฌธ๊ฐ
- datascience
- ๋ฐ์ดํฐ๋ถ์
- Lambda
- pandas
- ๋ฐ์ดํฐ๋ถ์์ค์ ๋ฌธ๊ฐ
- DBSCAN
- iloc
- PCA
- numpy
- ๋ ๋ฆฝํ๋ณธ
- ๋์ํ๋ณธ
- ์ฃผ์ฑ๋ถ๋ถ์
- ์ค๋ฒ์ํ๋ง
- ๋น ๋ฐ์ดํฐ
- opencv
- ๊ตฐ์งํ
- ํ์ด์ฌ
- ๋น ๋ฐ์ดํฐ๋ถ์๊ธฐ์ฌ
- ์ธ๋์ํ๋ง
Data Science LAB
[Python] ๋ฌธ์ ์ ์ฌ๋ ๋ณธ๋ฌธ
๋ฌธ์ ์ฌ์ด์ ์ ์ฌ๋ ์ธก์ ์ ์ฃผ๋ก ์ฝ์ฌ์ธ ์ ์ฌ๋(Cosine Similarity)๋ฅผ ์ฌ์ฉํ๋ค.
๋ฒกํฐ์ ํฌ๊ธฐ ๋ณด๋ค๋ ๋ฒกํฐ์ ์ํธ ๋ฐฉํฅ์ฑ์ด ์ผ๋ง๋ ์ ์ฌํ์ง์ ๊ธฐ๋ฐํ์ฌ ์ธก์ ํ๋ค.
๋ ๋ฒกํฐ์ ์ฌ์๊ฐ์ ๋ฐ๋ผ ์ํ ๊ด๊ณ๋ ์ ์ฌํ๊ฑฐ๋ ๊ด๋ จ์ด ์๊ฑฐ๋ ์์ ๋ฐ๋ ๊ด๊ณ๊ฐ ๋ ์ ์๋ค.
๋ ๋ฒกํฐ A,B์ ๋ด์ ๊ฐ์ ๋ ๋ฒกํฐ์ ํฌ๊ธฐ๋ฅผ ๊ฒํ ๊ฐ์ ์ฝ์ฌ์ธ ๊ฐ๋ ๊ฐ์ ๊ณฑํ ๊ฐ์ด๋ค.
๋ฐ๋ผ์ ์ ์ฌ๋(similarity)๋ ๋ค์๊ณผ ๊ฐ์ด ๋ ๋ฒกํฐ์ ๋ด์ ์ ์ด ๋ฒกํฐ ํฌ๊ธฐ์ ํฉ์ผ๋ก ๋๋ ๊ฒ์ด๋ค.
๋ ๋ํ์ด ๋ฐฐ์ด์ ๋ํ ์ฝ์ฌ์ธ ์ ์ฌ๋ ๊ตฌํ๋ ํจ์ ์์ฑ
import numpy as np
def cos_similarity(v1,v2):
dot_product = np.dot(v1,v2)
l2_norm = (np.sqrt(sum(np.square(v1))) * np.sqrt(sum(np.square(v2))))
similarity = dot_product / l2_norm
return similarity
3๊ฐ์ ๊ฐ๋จํ ๋ฌธ์๋ค์ ์ ์ฌ๋ ๋น๊ต
from sklearn.feature_extraction.text import TfidfVectorizer
doc_list = ['if you take the blue pill, the story ends',
'if you take the red pill, you stay in Wonderland',
'if you take the red pill, I show you how deep the rabbit hole goes']
tfidf_vect_simple = TfidfVectorizer()
feature_vect_simple = tfidf_vect_simple.fit_transform(doc_list)
print(feature_vect_simple.shape)
3๊ฐ์ ๊ฐ๋จํ ๋ฌธ์๋ฅผ ์์๋ก ์์ฑํ ๋ค,
TfidfVector๋ก ๋ฒกํฐํํด ์ฃผ์๋ค.
#TFidfVectorizer๋ก transform()ํ ๊ฒฐ๊ณผ๋ ํฌ์ ํ๋ ฌ์ด๋ฏ๋ก ๋ฐ์ง ํ๋ ฌ๋ก ๋ณํ
feature_vect_dense = feature_vect_simple.todense()
#์ฒซ ๋ฒ์งธ ๋ฌธ์ฅ๊ณผ ๋ ๋ฒ์งธ ๋ฌธ์ฅ์ ํผ์ฒ ๋ฒกํฐ ์ถ์ถ
vect1 = np.array(feature_vect_dense[0]).reshape(-1, )
vect2 = np.array(feature_vect_dense[1]).reshape(-1, )
#์ฒซ ๋ฒ์งธ ๋ฌธ์ฅ๊ณผ ๋ ๋ฒ์งธ ๋ฌธ์ฅ์ ํผ์ฒ ๋ฒกํฐ๋ก ๋ ๊ฐ ๋ฌธ์ฅ์ ์ฝ์ฌ์ธ ์ ์ฌ๋ ์ถ์ถ
similarity_simple = cos_similarity(vect1,vect2)
print('๋ฌธ์ฅ 1,2์ Cosine ์ ์ฌ๋ : {0:.3f}'.format(similarity_simple))
์์์ ์์ฑํ ๊ฒฐ๊ณผ๋ ํฌ์ ํ๋ ฌ์ด๊ธฐ ๋๋ฌธ์ ๋ฐ์งํ๋ ฌ๋ก ๋ณํํด ์ค ๋ค,
3๊ฐ์ ๋ฌธ์์ค ์ฒซ๋ฒ์งธ์ ๋ ๋ฒ์งธ ๋ฌธ์ฅ์ ํผ์ฒ ๋ฒกํฐ๋ฅผ ์ถ์ถํ์ฌ ๋ ๋ฌธ์ฅ์ ์ฝ์ฌ์ธ ์ ์ฌ๋๋ฅผ ์ธก์ ํ์๋ค.
vect3 = np.array(feature_vect_dense[2]).reshape(-1, )
similarity_simple = cos_similarity(vect1,vect3)
print('๋ฌธ์ฅ 1,3์ Cosine ์ ์ฌ๋ : {0:.3f}'.format(similarity_simple))
similarity_simple = cos_similarity(vect2,vect3)
print('๋ฌธ์ฅ 2,3์ Cosine ์ ์ฌ๋ : {0:.3f}'.format(similarity_simple))
๋ฌธ์ฅ 1,2์ ๋์ผํ๊ฒ ๊ฐ ๋ฌธ์ฅ ๋ณ๋ก ์ ์ฌ๋ ๋น๊ต๋ฅผ ํด๋ณด์๋ค.
Sklearn๋ฅผ ํ์ฉํ ๋ฌธ์ ์ ์ฌ๋ ์ธก์
from sklearn.metrics.pairwise import cosine_similarity
similarity_simple_pair = cosine_similarity(feature_vect_simple[0],feature_vect_simple)
print(similarity_simple_pair)
cosine_similarity()๋ ํฌ์ ํ๋ ฌ, ๋ฐ์ง ํ๋ ฌ ๋ชจ๋๊ฐ ๊ฐ๋ฅํ๋ฉฐ ๋ฐฐ์ด ๋ํ ๊ฐ๋ฅํ๋ค.
๋ฐ๋ผ์ ๋ณ๋์ ๋ณํ ์์ ์ด ํ์ํ์ง ์๋ค.
์ฒซ๋ฒ์งธ ๋ฌธ์ฅ๊ณผ, ๋ฌธ์ฅ 3๊ฐ์ ๋ฌธ์ ์ ์ฌ๋ ์ธก์ ๊ฒฐ๊ณผ
1์ ์๊ธฐ ์์ ๊ณผ์ ์ ์ฌ๋ ์ธก์ ๊ฒฐ๊ณผ์ด๋ฉฐ,
๋ฌธ์ 1๊ณผ 2์ ์ ์ฌ๋๋ 0.402, ๋ฌธ์ 1๊ณผ 3์ ์ ์ฌ๋๋ 0.404๋ก ์ธก์ ๋์๋ค.
similarity_simple_pair = cosine_similarity(feature_vect_simple[0],feature_vect_simple[1:])
print(similarity_simple_pair)
์๊ธฐ ์์ ๊ณผ์ ๋ฌธ์ ์ ์ฌ๋๋ฅผ ์์ ๊ณ ์ถ๋ค๋ฉด
[1:]์ ์ถ๊ฐํ๋ฉด ์ ๊ฑฐํ ์ ์๋ค.
similarity_simple_pair = cosine_similarity(feature_vect_simple, feature_vect_simple)
print(similarity_simple_pair)
print('similarity_simple_pair shape : ',similarity_simple_pair.shape)
์ฒซ ๋ฒ์งธ ๋ก์ฐ๋ 1๋ฒ ๋ฌธ์์ 2,3๋ฒ์งธ ๋ฌธ์์์ ์ ์ฌ๋๋ฅผ ๋ํ๋ธ๋ค.
Opinion Reveiw ๋ฐ์ดํฐ ์ ์ ์ด์ฉํ ๋ฌธ์ ์ ์ฌ๋ ์ธก์
from nltk.stem import WordNetLemmatizer
import nltk
import string
remove_punct_dict = dict((ord(punct), None) for punct in string.punctuation)
lemmar = WordNetLemmatizer()
def LemTokens(tokens):
return [lemmar.lemmatize(token) for token in tokens]
def LemNormalize(text):
return LemTokens(nltk.word_tokenize(text.lower().translate(remove_punct_dict)))
Lemmatization์ ๊ตฌํํ๋ LemNormalize() ํจ์๋ฅผ ์์ฑํ์๋ค.
import pandas as pd
import glob ,os
from sklearn.feature_extraction.text import TfidfVectorizer
from sklearn.cluster import KMeans
path = r'C:\Users\OpinosisDataset1.0\OpinosisDataset1.0\topics'
all_files = glob.glob(os.path.join(path, "*.data"))
filename_list = []
opinion_text = []
for file_ in all_files:
df = pd.read_table(file_,index_col=None, header=0,encoding='latin1')
filename_ = file_.split('\\')[-1]
filename = filename_.split('.')[0]
filename_list.append(filename)
opinion_text.append(df.to_string())
document_df = pd.DataFrame({'filename':filename_list, 'opinion_text':opinion_text})
tfidf_vect = TfidfVectorizer(tokenizer=LemNormalize, stop_words='english' , \
ngram_range=(1,2), min_df=0.05, max_df=0.85 )
feature_vect = tfidf_vect.fit_transform(document_df['opinion_text'])
km_cluster = KMeans(n_clusters=3, max_iter=10000, random_state=0)
km_cluster.fit(feature_vect)
cluster_label = km_cluster.labels_
cluster_centers = km_cluster.cluster_centers_
document_df['cluster_label'] = cluster_label
๋ฌธ์ ๊ตฐ์งํ์ ๋์ผํ๊ฒ ๋๋ ํ ๋ฆฌ์ ํ์ผ๋ค์ ๋ชจ๋ ๋ถ๋ฌ์ ๋ฆฌ์คํธ๋ก ์ ์ฅํ๊ณ ,
n=3์ผ๋ก ์ค์ ํ์ฌ KMeans ๊ตฐ์งํ๋ฅผ ์งํํ์๋ค.
ํธํ ์ ์ฃผ์ ๋ก ๊ตฐ์งํ๋ ๋ฌธ์์ ๋ค๋ฅธ ๋ฌธ์์์ ์ ์ฌ๋ ์ธก์
from sklearn.metrics.pairwise import cosine_similarity
#ํธํ
๋ก ๊ตฐ์งํ๋ ๋ฌธ์์ ์ธ๋ฑ์ค ์ถ์ถ
hotel_indexes = document_df[document_df['cluster_label']==1].index
print("ํธํ
๋ก ๊ตฐ์งํ๋ ๋ฌธ์์ DataFrame Index : ",hotel_indexes)
#๊ทธ์ค ์ฒซ ๋ฒ์งธ ๋ฌธ์ ์ถ์ถํด ํ์ผ๋ช
ํ์
comparison_docname = document_df.iloc[hotel_indexes[0]]['filename']
print('๋น๊ต ๋ฌธ์๋ช
',comparison_docname, '์ ํ ๋ฌธ์ ์ ์ฌ๋')
#document_df์์ ์ถ์ถํ Index ๊ฐ์ฒด๋ฅผ feature_vect๋ก ์
๋ ฅํ์ฌ ํธํ
๊ตฐ์งํ๋ feature_vect ์ถ์ถ
similarity_pair = cosine_similarity(feature_vect[hotel_indexes[0]], feature_vect[hotel_indexes])
print(similarity_pair)
ํธํ ์ ์ฃผ์ ๋ก ๊ตฐ์งํ๋ ๋ฌธ์์ ์ธ๋ฑ์ค ์ถ์ถ -> TfidfVectorizer ๊ฐ์ฒด ๋ณ์์ธ feature_vect์์ ํธํ ๋ก ๊ตฐ์งํ๋ ๋ฌธ์์ ํผ์ฒ๋ฒกํฐ ์ถ์ถ
import seaborn as sns
import numpy as np
import matplotlib.pyplot as plt
%matplotlib inline
#์ฒซ ๋ฒ์งธ ๋ฌธ์์ ํ ๋ฌธ์ ๊ฐ ์ ์ฌ๋๊ฐ ํฐ ์์ผ๋ก ์ ๋ ฌํ ์ธ๋ฑ์ค๋ฅผ ์ถ์ถํ๋ ์๊ธฐ ์์ ์ ์ธ
sorted_index = similarity_pair.argsort()[:,::-1]
sorted_index = sorted_index[:,1:]
#์ ์ฌ๋๊ฐ ํฐ ์์ผ๋ก hotel_indexes ์ถ์ถํด ์ฌ์ ๋ ฌ
hotel_sorted_indexes = hotel_indexes[sorted_index.reshape(-1)]
#์ ์ฌ๋๊ฐ ํฐ ์์ผ๋ก ์ ์ฌ๋ ๊ฐ ์ฌ์ ๋ ฌ ํ๋ ์๊ธฐ ์์ ์ ์ธ
hotel_1_sim_value = np.sort(similarity_pair.reshape(-1))[::-1]
hotel_1_sim_value = hotel_1_sim_value[1:]
#์ ์ฌ๋๊ฐ ํฐ ์์ผ๋ก ์ ๋ ฌ๋ ์ธ๋ฑ์ค์ ์ ์ฌ๋ ๊ฐ์ ์ด์ฉํด ํ์ผ๋ช
๊ณผ ์ ์ฌ๋ ๊ฐ์ ๋ง๋ ๊ทธ๋ํ๋ก ์๊ฐํ
hotel_1_sim_df = pd.DataFrame()
hotel_1_sim_df['filename'] = document_df.iloc[hotel_sorted_indexes]['filename']
hotel_1_sim_df['similarity'] = hotel_1_sim_value
sns.barplot(x='similarity',y='filename',data = hotel_1_sim_df)
plt.title(comparison_docname)
์ ์ฌ๋๊ฐ ๋์ ์์ผ๋ก ์ ๋ ฌ ํ ์๊ฐํ
'๐ Machine Learning > ํ ์คํธ ๋ถ์' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[Python] ํ๊ธ ํ ์คํธ ์ฒ๋ฆฌ - ๋ค์ด๋ฒ ์ํ ํ์ ๊ฐ์ฑ ๋ถ์ (0) | 2022.02.26 |
---|---|
[Python] ๋ฌธ์ ๊ตฐ์งํ (0) | 2022.02.24 |
[Python] ํ ํฝ ๋ชจ๋ธ๋ง (20 ๋ด์ค๊ทธ๋ฃน) (0) | 2022.02.22 |
[Python] SentiWordNet, VADER์ ์ด์ฉํ ์ํ ๊ฐ์ํ ๊ฐ์ฑ ๋ถ์ (0) | 2022.02.21 |
[Python] ๊ฐ์ฑ๋ถ์ - ๋น์ง๋ ํ์ต (0) | 2022.02.20 |