-
Notifications
You must be signed in to change notification settings - Fork 0
/
similarity.py
67 lines (50 loc) · 1.92 KB
/
similarity.py
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
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
# -*- coding: utf-8 -*-
from sklearn.feature_extraction.text import CountVectorizer
from sklearn.metrics.pairwise import cosine_similarity
import unicodedata
count_vectorizer = CountVectorizer()
outputFile = open('output-similarity.txt','w')
# converte csv para lista
def buldingDB(db):
database = list()
dbFile = open(db,'r').readlines()
[database.append(i.rstrip().split(',')) for i in dbFile]
return database
# gera arquivo de saída
def output(similarity,tag1,tag2,usuario,tp_tag):
string = 'Usuário: ' + usuario +'\t'+ 'Foto: ' + tp_tag + '\n'
string += 'Não recomendado: ' + tag2 + '\n'
string += 'Recomendado: ' + tag1 + '\n'
string += 'Similaridade: ' + str(similarity[0][0]) + '\n\n'
outputFile.write(string)
return True
# remove acento de todos as tags
def removeAccents(tag):
return unicodedata.normalize('NFD', unicode(tag, 'utf-8')).encode('ascii','ignore')
# Analisa a similaridade entre as fotos, desconsiderando o usuário
def byPhoto():
return None
# Analisa por usuário a similaridade entre tags utilizadas
def byUser():
for i in notRecommendedDB:
tag = []
for j in recommendedDB:
if i[0] == j[0]: # verifica se é o mesmo usuário
if i[2] == j[3]: # verifica se é a mesma foto
tag.append(j[1].lower())
tag1 = removeAccents(' '.join(tag))
tag2 = removeAccents(i[1].lower())
tags = (tag1,tag2)
similarity = cosine(tags)
output(similarity,tag1,tag2,i[0],i[2])
return None
# cálcula a similaridade entre duas tags
def cosine(tagSet):
count_matrix = count_vectorizer.fit_transform(tagSet)
return cosine_similarity(count_matrix[0], count_matrix[1])
if __name__ == '__main__':
recommendedDB = buldingDB('files/recommended.csv')
notRecommendedDB = buldingDB('files/not-recommended.csv')
byUser()
#byPhoto()
outputFile.close()