Advertisement
elcocodrilotito

Práctica 1 (casi completa)

Mar 20th, 2017
93
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 4.12 KB | None | 0 0
  1. #Daniel Bedialauneta y Athenea Beltrán
  2. #Práctica 1
  3. from string import punctuation
  4. from math import sqrt
  5. def histograma(email):
  6.     letras="abcdefghijklmnopqrstuvwxyz"
  7.     d=dict()
  8.     fp=open(email,"r",encoding='utf-8')
  9.     linea=fp.readline()
  10.     while linea!="\n":
  11.         linea=fp.readline()
  12.     linea=fp.readline()
  13.     while linea:
  14.         for i in linea.split():
  15.             i=i.lower().strip(punctuation)
  16.             if i=="":
  17.                 continue
  18.             bien=True
  19.             for j in i:
  20.                 if j not in letras:
  21.                     bien=False
  22.                     break
  23.             if bien:
  24.                 if i in d:
  25.                     d[i]+=1
  26.                 else:
  27.                     d[i]=1
  28.         linea=fp.readline()
  29.     return d
  30.  
  31. def suma_histogramas(dp,d): #dp=diccionario principal (diccionario suma), d=diccionario parcial
  32.     for i in d:
  33.         if i in dp:
  34.             dp[i]+=d[i]
  35.         else:
  36.             dp[i]=d[i]
  37.     return dp
  38.  
  39. def normalizacion(d): #d=diccionario
  40.     sumatorio=0
  41.     for i in d:
  42.         sumatorio+=d[i]
  43.     for i in d:
  44.         d[i]=d[i]/sumatorio
  45.     return d
  46.  
  47. def frecuentes(d):
  48.     media=0
  49.     sumatorio=0
  50.     for i in d:
  51.         sumatorio+=d[i]
  52.     media=sumatorio/len(d)
  53.     lista=[]
  54.     for i in d:
  55.         if d[i]>=100*media:
  56.             lista.append(i)
  57.     return lista
  58.    
  59. def raras(d,n=20):
  60.     lista=[]
  61.     for i in d:
  62.         if d[i]<=n:
  63.             lista.append(i)
  64.     return lista
  65.  
  66. def borrar_palabras(d,lista1,lista2):
  67.     for i in lista1+lista2:
  68.         if i in d:
  69.             del d[i]
  70.     return d
  71.  
  72. def d_euclidea(hx,hc,suma):
  73.     for w in hx:
  74.         if w in c:
  75.             suma-=hc[w]**2
  76.             suma+=(hx[w]-hc[w])**2
  77.         else:
  78.             suma+=hx[w]**2
  79.     return sqrt(suma)
  80. lista_suma=[173094429, 68890073, 47569535, 65950099, 56031643, 169909208, 15011217, 95788370,
  81.             71886356, 74615685, 126235440, 306731854, 77798688, 156315425, 159248355, 360304117,
  82.             242212166, 562274514, 281795723, 117932586] #Es la suma que hay que introducir como argumento en d_euclidea
  83.  
  84. def d_superposicion(hx,hc):
  85.     suma=0
  86.     for w in hx:
  87.         if w in hc:
  88.             suma=suma+min(hx[w],hc[w])
  89.     return 1-suma
  90.  
  91. def d_correlacion(hx,hc):
  92.     suma=0
  93.     for w in hx:
  94.         if w in hc:
  95.             suma+=hx[w]*hc[w]
  96.     return 1-suma
  97.  
  98. #Programa
  99. fp=open("metalista_train.txt","r")
  100. d_clases=dict()
  101. for clase in fp:
  102.     fp2=open(clase[:-1],"r")
  103.     d_clase=dict()
  104.     for linea2 in fp2:
  105.         d_parcial=histograma(linea2[:-1])
  106.         d_clase=suma_histogramas(d_clase,d_parcial)
  107.     d_clases[clase[:-1]]=d_clase
  108.     fp2.close()
  109. fp.close()
  110. d_lengua=dict()
  111. for clase in d_clases:
  112.     d_lengua=suma_histogramas(d_lengua,d_clases[clase])
  113. lista1=frecuentes(d_lengua)
  114. lista2=raras(d_lengua)
  115. del d_lengua
  116. for clase in d_clases:
  117.     d_clases[clase]=normalizacion(borrar_palabras(d_clases[clase],lista1,lista2))
  118. #Hasta aquí obtenemos el diccionario de cada clase, d_clases[clase], guardados en un diccionario de cada clase llamado d_clases
  119.    
  120. fp=open("metalista_test.txt","r")
  121. contador=0
  122. break1=False
  123. errores=[0 for i in range(5)]
  124. for clase_email in fp:
  125.     fp2=open(clase_email[:-1],"r")
  126.     for email in fp2:
  127.         contador+=1
  128.         lista=[]
  129.         d_email=histograma(email[:-1])
  130.         for clase_parcial in d_clases:
  131.             lista.append((d_superposicion(d_email,d_clases[clase_parcial]),clase_parcial[12:])) #1.1
  132.         lista.sort()
  133.         for i in range(len(errores)):
  134.             if clase_email[11:-1]!=lista[i][1]: #1.1 y 1.2.
  135.                 errores[i]+=1
  136.             else:
  137.                 break
  138.            
  139. for i in range(len(errores)):
  140.     errores[i]=(errores[i]/contador)*100
  141. print(errores)
  142. print(contador)
  143. #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,
  144. #que es de la forma listas_test/alt.atheism.txt, no haya problemas entre las palabras "train" y "test".
  145.  
  146. #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