Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #Daniel Bedialauneta y Athenea Beltrán
- #Práctica 1
- from string import punctuation
- from math import sqrt
- def histograma(email):
- letras="abcdefghijklmnopqrstuvwxyz"
- d=dict()
- fp=open(email,"r",encoding='utf-8')
- linea=fp.readline()
- while linea!="\n":
- linea=fp.readline()
- linea=fp.readline()
- while linea:
- for i in linea.split():
- i=i.lower().strip(punctuation)
- if i=="":
- continue
- bien=True
- for j in i:
- if j not in letras:
- bien=False
- break
- if bien:
- if i in d:
- d[i]+=1
- else:
- d[i]=1
- linea=fp.readline()
- return d
- def suma_histogramas(dp,d): #dp=diccionario principal (diccionario suma), d=diccionario parcial
- for i in d:
- if i in dp:
- dp[i]+=d[i]
- else:
- dp[i]=d[i]
- return dp
- def normalizacion(d): #d=diccionario
- sumatorio=0
- for i in d:
- sumatorio+=d[i]
- for i in d:
- d[i]=d[i]/sumatorio
- return d
- def frecuentes(d):
- media=0
- sumatorio=0
- for i in d:
- sumatorio+=d[i]
- media=sumatorio/len(d)
- lista=[]
- for i in d:
- if d[i]>=100*media:
- lista.append(i)
- return lista
- def raras(d,n=20):
- lista=[]
- for i in d:
- if d[i]<=n:
- lista.append(i)
- return lista
- def borrar_palabras(d,lista1,lista2):
- for i in lista1+lista2:
- if i in d:
- del d[i]
- return d
- def d_euclidea(hx,hc,suma):
- for w in hx:
- if w in c:
- suma-=hc[w]**2
- suma+=(hx[w]-hc[w])**2
- else:
- suma+=hx[w]**2
- return sqrt(suma)
- lista_suma=[173094429, 68890073, 47569535, 65950099, 56031643, 169909208, 15011217, 95788370,
- 71886356, 74615685, 126235440, 306731854, 77798688, 156315425, 159248355, 360304117,
- 242212166, 562274514, 281795723, 117932586] #Es la suma que hay que introducir como argumento en d_euclidea
- def d_superposicion(hx,hc):
- suma=0
- for w in hx:
- if w in hc:
- suma=suma+min(hx[w],hc[w])
- return 1-suma
- def d_correlacion(hx,hc):
- suma=0
- for w in hx:
- if w in hc:
- suma+=hx[w]*hc[w]
- return 1-suma
- #Programa
- fp=open("metalista_train.txt","r")
- d_clases=dict()
- for clase in fp:
- fp2=open(clase[:-1],"r")
- d_clase=dict()
- for linea2 in fp2:
- d_parcial=histograma(linea2[:-1])
- d_clase=suma_histogramas(d_clase,d_parcial)
- d_clases[clase[:-1]]=d_clase
- fp2.close()
- fp.close()
- d_lengua=dict()
- for clase in d_clases:
- d_lengua=suma_histogramas(d_lengua,d_clases[clase])
- lista1=frecuentes(d_lengua)
- lista2=raras(d_lengua)
- del d_lengua
- for clase in d_clases:
- d_clases[clase]=normalizacion(borrar_palabras(d_clases[clase],lista1,lista2))
- #Hasta aquí obtenemos el diccionario de cada clase, d_clases[clase], guardados en un diccionario de cada clase llamado d_clases
- fp=open("metalista_test.txt","r")
- contador=0
- break1=False
- errores=[0 for i in range(5)]
- for clase_email in fp:
- fp2=open(clase_email[:-1],"r")
- for email in fp2:
- contador+=1
- lista=[]
- d_email=histograma(email[:-1])
- for clase_parcial in d_clases:
- lista.append((d_superposicion(d_email,d_clases[clase_parcial]),clase_parcial[12:])) #1.1
- lista.sort()
- for i in range(len(errores)):
- if clase_email[11:-1]!=lista[i][1]: #1.1 y 1.2.
- errores[i]+=1
- else:
- break
- for i in range(len(errores)):
- errores[i]=(errores[i]/contador)*100
- print(errores)
- print(contador)
- #1.1. El nombre de clase_parcial es listas_train/alt.atheism.txt, le quito la parte de listas_train/ ([12:]) para que luego al compararla con clase_email,
- #que es de la forma listas_test/alt.atheism.txt, no haya problemas entre las palabras "train" y "test".
- #1.2. Pongo clase_email[11:-1] hasta -1 sin contarlo para que no me cuente el \n
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement