예제 #1
0
def preprocesar_newInst(tfidf_path, train_path, newData_path, vocabulario_path, lista_temas_path):
    """
        Dado el dataset y las nuevas instancias se obtiene un nuevo dataset y sus pesos correspondientes en tf-idf
        Pre: Los pesos tf-idf anteriores, el path de los datos anteriores, los datos nuevos, el path del nuevo dataset y el paz de todos los temas
        Post: Se genera otro dataset tf-idf con las nuevas instancias
    """
    #directorio = 'testing'
    print('\nGenerando los vectores de las instancias')
    newData = escanear_docs(newData_path)
    #tfidf = util.cargar(os.getcwd()+ tfidf_path)
    n_new_inst = len(newData)
    lista_temas = util.cargar(os.getcwd()+lista_temas_path)
    nuevos_temas = crearListaTemasTotales(newData)
    #lista = list(nuevos_temas & set(lista_temas))
    lista = list(nuevos_temas | set(lista_temas)) # equivale a lista= set(lista_temas).symmetric_difference(nuevos_temas)

    util.guardar(os.getcwd()+'/preproceso/new_lista_temas.txt', lista)
    for doc in newData:
        doc.asignarTemaNumerico(lista)
    train = util.cargar(os.getcwd()+train_path)
    n_docs = len(train)
    documentos = train + newData
    util.guardar(os.getcwd()+"/preproceso/new_lista_articulos.txt", documentos)
    listaVocabulario = util.cargar(os.getcwd()+vocabulario_path)
    tfidf = Tf_Idf()
    tfidf.generar_vector_tupla_pesos(newData)
    selector = SelectorAtributos(tfidf.vector,documentos,"newInst")
    selector.crear_dataset_especifico(tfidf.vector, documentos, "test", vocabulario_path)
    util.guardar(os.getcwd()+"/preproceso/new_tfidf.txt", selector.espacio_vectorial)
    print('Preproceso completado!')
    return selector.espacio_vectorial, n_docs, n_new_inst
예제 #2
0
def preprocesar_test(tfidf_path, train_path, test_path, vocabulario_path, lista_temas_path):
    """
        Dado el dataset y las nuevas instancias se obtiene un nuevo dataset y sus pesos correspondientes en tf-idf
        Pre: Los pesos tf-idf anteriores, el path de los datos anteriores, los datos nuevos, el path del nuevo dataset y el paz de todos los temas
        Post: Se genera otro dataset tf-idf con las nuevas instancias
    """
    print("generar test tfidf")
    test = util.cargar(os.getcwd()+ test_path)
    tfidf = util.cargar(os.getcwd()+ tfidf_path)
    tfidf.generar_vector_tupla_pesos(test)
    selector_test = SelectorAtributos(tfidf.vector, test, "test")
    selector_test.crear_dataset_especifico(tfidf.vector, test, "test", vocabulario_path)
    util.guardar(os.getcwd()+"/preproceso/test_tfidf.txt", selector_test.espacio_vectorial)
    print('\nGenerando los vectores de las instancias')
    n_docs = len(tfidf.vector)
    n_new_inst = len(test)
    lista = list(crearListaTemasTotales(test) | set(util.cargar(os.getcwd()+lista_temas_path)))
    util.guardar(os.getcwd()+'/preproceso/all_lista_temas', lista)
    for doc in test:
        doc.asignarTemaNumerico(lista)

    """
    train = util.cargar(os.getcwd()+train_path)
    documentos = train + test
    util.guardar(os.getcwd()+"/preproceso/all_lista_articulos.txt", documentos)
    listaVocabulario = util.cargar(os.getcwd()+vocabulario_path)
    tfidf = tfidf.generar_vector_tupla_pesos_newInst(test, listaVocabulario)
    selector = SelectorAtributos(tfidf.vector,documentos,"allInst")
    util.guardar(os.getcwd()+"/preproceso/all_tfidf.txt", selector.espacio_vectorial)
    """
    print('Preproceso completado!')
    return selector_test.espacio_vectorial, n_docs, n_new_inst
예제 #3
0
def agruparInstanciasPorCluster(
        path, instancias, numClus, instsAClasif, vectoresTest,
        datosTest):  #instAClasificar debera ser posicion o id
    #vectoresTest = ut.cargar('/preproceso/new_tfidf')
    #datosTest=ut.cargar('/preproceso/new_lista_articulos')
    centroides = clustersIteracion(path, instancias, numClus)
    agrupacion = []
    cAct = 0
    c = 0
    "Indice centroide"
    for inst in instsAClasif:  #Recorrer instancias a clasificar
        vecInst = vectoresTest[inst]  #Coger el vector de la instancia TODO
        mindist = 999999
        c = 0
        for cent in centroides:  #Por cada centroide...
            distancia = ut.calcularDistancia(
                cent, vecInst,
                1)  #Buscar menor distancia manhattan centroide e instancia
            if distancia < mindist:
                mindist = distancia
                centAct = cent
                cAct = c  #Indice del centroide/cluster dentro de la lista de centroides/clusters
            c += 1

        iteraciones = ut.cargar(os.getcwd() + path)
        clusters = iteraciones[len(instancias) - numClus]
        "Sabiendo la posicion se que cluster llevarme"
        tema = temaMasComunEnInstancia(clusters[cAct], vecInst)
        "Pasar instancias del cluster del cent, el id y vector de instAClasif"
        temaReal = datosTest[inst].tema_numerico
        agrupacion.append(
            (inst, cent, tema,
             temaReal))  #Instancia, centroide, tema agrupado, tema real

    return agrupacion
예제 #4
0
def preprocesar_test(tfidf_path, train_path, test_path, vocabulario_path,
                     lista_temas_path):
    """
        Dado el dataset y las nuevas instancias se obtiene un nuevo dataset y sus pesos correspondientes en tf-idf
        Pre: Los pesos tf-idf anteriores, el path de los datos anteriores, los datos nuevos, el path del nuevo dataset y el paz de todos los temas
        Post: Se genera otro dataset tf-idf con las nuevas instancias
    """
    print("generar test tfidf")
    test = util.cargar(os.getcwd() + test_path)
    tfidf = util.cargar(os.getcwd() + tfidf_path)
    print('\nGenerando los vectores de las instancias')
    tfidf.generar_vocab_npalabras(test)
    util.guardar(os.getcwd() + "/preproceso/test_tfidf.txt", tfidf.vPesos)
    util.guardar(os.getcwd() + "/preproceso/raw_tfidf_test", tfidf)
    print('Preproceso completado!')
    return tfidf.vPesos, tfidf
예제 #5
0
def temaMasComunEnInstancia(
        instCluster,
        vecInst):  #instCluster son posiciones, instancia es vector
    "Recorrer instancias de cluster, coger las 10 mas cercanas a la instancia daba y devolver el maximo de los temas"
    i = 1
    temas = []
    vectoresTrain = ut.cargar(os.getcwd() + '/preproceso/train_tfidf.txt')
    datosTrain = ut.cargar(os.getcwd() +
                           '/preproceso/lista_articulos_train.txt')
    listaTemas = ut.cargar(os.getcwd() + '/preproceso/new_lista_temas.txt')
    j = 0
    while j < len(listaTemas):
        temas.append([j, 0])  #(TemaNumerico,Contador)
        j = j + 1
    instancias = []  #Lista de 10 instancias mas cercanas a la instancia test
    distancias = [
    ]  #Lista de distancias de instancias cluster a instancia test
    for instCl in instCluster:  #Instancias del cluster
        vecInstCl = vectoresTrain[instCl]
        distancias.append([
            instCl, ut.calcularDistancia(vecInstCl, vecInst, 2)
        ])  #Coger la menor (Instancia cluster, distancia)
    while i <= 10:
        actual = min(
            distancias, key=lambda t: t[1]
        )  #Devuelve la tupla con la instancia del cluster y la distancia minima a la distancia a clasificar.
        distancias.remove(actual)
        instancias.append(actual[0])
        i += 1

    "Buscar tema mayor entre las 10 instancias y ese sera el de la instancia a clasificar."
    for posInst in instancias:
        indTema = datosTrain[posInst].tema_numerico
        t = 0
        while t < len(listaTemas):
            if t in indTema:
                temas[t][1] += 1
            t += 1
    tema = max(
        temas,
        key=lambda t: t[1])  #Devuelve el tema que mas veces ha aparecido
    #print(tema)
    return tema[0]
예제 #6
0
def clustersIteracion(path, instancias, numclus):
    iteraciones = ut.cargar(path)
    clusters = iteraciones[len(instancias) - numclus]
    print(len(clusters.keys()))
    centroides = {}

    for each in clusters.keys():
        centroide = ut.calcularCentro(clusters[each], instancias)
        centroides[each] = centroide

    return centroides
예제 #7
0
def clustersIteracion(path, instancias, numclus):
    iteraciones = ut.cargar(os.getcwd() + path)
    clusters = iteraciones[len(instancias) - numclus]
    centroides = ut.generarLista(len(clusters))
    i = 0

    while i < len(clusters):
        centroide = ut.calcularCentro(clusters[i], instancias)
        centroides[i] = centroide
        i += 1

    return centroides
예제 #8
0
def clusterDist(path, instancias, dist):
    distancias = ut.cargar(path)
    nivel = 0

    for each in distancias.keys():
        if each <= dist and each > nivel: nivel = each

    clusters = distancias[nivel]
    lista = ut.generarLista(len(instancias))
    asig = ut.listaClusters(instancias, clusters, lista)
    i = 0

    while i < len(instancias):
        guardarAsig(instancias[i], asig[i])
        i += 1
예제 #9
0
    def evaluar(self, path, instancias):
        res = ut.cargar(path)
        labels = ut.generarLista(len(instancias))
        i = 0
        parar = False
        scoreMax = 0
        hasta = len(res.keys()) * 0.9

        for each in res.keys():
            if i != 0 and i % 10 == 0 and i <= hasta and not parar:
                agrup = res[each]
                labels = ut.listaClusters(instancias, agrup, labels)
                score = self.daviesBouldin(instancias, labels)
                self.guardarScore(len(agrup.keys()), score)
                if score > scoreMax: scoreMax = score
                elif score < scoreMax:
                    parar = True
                    print(score)

            i += 1
예제 #10
0
 def crear_dataset_especifico(self,pesos,documentos, name, path_vocabulario):
     """
         Dado la tabla de pesos, datos a analizar y atributos seleccionados, se crea una lista de tuplas para el calculo de distancias para generar un cluster
         Pre: La tabla de pesos, los docmumentos a entrenar y los atributos seleccionados
         Post: Se crea un dataset para el calculo de distancias y creacion de cluster
     """
     #cambiar a vector de tuplas
     self.atributos = util.cargar(os.getcwd()+path_vocabulario)
     self.espacio_vectorial = []
     for atributos_doc in self.atributos:
         for i, documento in enumerate(documentos):
             doc = list()
             for atributo in atributos_doc:
                 try:
                     doc.append(pesos[i][atributo])
                 except KeyError as e:
                     doc.append(0.0)
             self.espacio_vectorial.append(tuple(doc))
     print("\nLista de tuplas de vectores " + name+  "_tf-idf generada")
     print("Se han procesado " + str(len(self.espacio_vectorial)) + " instancias")
예제 #11
0
def runClusteringPruebas(argumentos):
    import __main__
    comienzo = time.time()
    print('\n')
    ##########################################################################################
    if not argumentos.all:
        print('-----------Ejecucion completa-----------')
        argumentos.skip_preproceso = argumentos.skip_jerarquico = argumentos.skip_kmeans = argumentos.skip_reglas = False
    ##########################################################################################
    if not argumentos.skip_preproceso:
        print('1: Preprocessing')
        tfidf_vecs, documentos = preproceso.preprocesar(argumentos.preproceso)
        print('Ha tardado en preprocesar ', calc_tiempo_trans(comienzo),
              'segundos!')

    ##########################################################################################
    if not argumentos.skip_jerarquico:
        print('2: Cluster aglomerativo')
        vector_dataset = util.cargar(os.getcwd() + argumentos.vector_tupla)
        documentos = util.cargar(os.getcwd() + argumentos.backup_datos)
        print('Se ha cargado los vectores tf-idf, del directorio: ' +
              str(len(documentos)))
        cluster = AgglomerativeClustering(n_clusters=3,
                                          affinity='euclidean',
                                          linkage='ward')
        miCluster = cluster.fit_predict(vector_dataset.toarray())
        etiquetas = cluster.labels_
        print('Ha tardado en hacer el cluster jerarquico',
              calc_tiempo_trans(comienzo), ' segundos!')
        miEtiquetaElegida = util.etiquetaClusterTema(documentos, etiquetas)
        print('Ha tardado en escoger un label para el cluster ',
              calc_tiempo_trans(comienzo), ' segundos!')
        file2csv.guardar_csv(argumentos.path_jerarquico, documentos, etiquetas,
                             miEtiquetaElegida)
        print('Ha tardado en guardar en csv ', calc_tiempo_trans(comienzo),
              ' segundos!')
        plt.figure(figsize=(10, 7))
        plt.scatter(vector_dataset.toarray()[:, 0],
                    vector_dataset.toarray()[:, 1],
                    c=cluster.labels_,
                    cmap='rainbow')
        plt.show()
        print('Guardando en csv')
    ##########################################################################################
    if not argumentos.skip_kmeans:
        print('3: Cluster k-means')
        vector_dataset = util.cargar(os.getcwd() + argumentos.vector_tupla)
        docs = util.cargar(os.getcwd() + argumentos.backup_datos)
        print("Se han cargado: " + str(len(docs)) + " instancias")
        miCluster = KMeans(n_clusters=3)
        miCluster.fit_predict(vector_dataset)
        etiquetas = miCluster.labels_
        print('Ha tardado en hacer el cluster k-means ',
              calc_tiempo_trans(comienzo), ' segundos!')
        miEtiquetaElegida = util.etiquetaClusterTema(docs, etiquetas)
        print('Ha tardado en escoger un label para el cluster ',
              calc_tiempo_trans(comienzo), ' segundos!')
        file2csv.guardar_csv(argumentos.path_kmeans, docs, etiquetas,
                             miEtiquetaElegida)
        print('Ha tardado en guardar en csv ', calc_tiempo_trans(comienzo),
              ' segundos!')
        plt.figure(figsize=(10, 7))
        plt.scatter(vector_dataset.toarray()[:, 0],
                    vector_dataset.toarray()[:, 1],
                    c=miCluster.labels_,
                    cmap='rainbow')
        plt.show()
        print('Ha tardado el cluster k-means', calc_tiempo_trans(comienzo),
              ' segundos!')

        print('Guardando en csv')
    ##########################################################################################
    if not argumentos.skip_reglas:
        print('4: Reglas')
        vector_dataset = util.cargar(os.getcwd() + argumentos.vector_tupla)
        docs = util.cargar(os.getcwd() + argumentos.backup_datos)
        res = asociacion.reglasApriori(argumentos.path_jerarquico)
        util.guardar(os.getcwd() + "reglas", res)
        asociacion.print_bonito(res)
        asociacion.out_txt_reglas(res)
    ##########################################################################################
    if not argumentos.all:
        if sorted(cluster.labels_) == sorted(miCluster.labels_):
            print("El cluster jerarquico y k-means han sido iguales")

    print('\nFin del programa: ', calc_tiempo_trans(comienzo), 'segundos!')
    print("Gracias por utilizar nuestro programa\n")
예제 #12
0
                labels = ut.listaClusters(instancias, agrup, labels)
                score = self.daviesBouldin(instancias, labels)
                self.guardarScore(len(agrup.keys()), score)
                if score > scoreMax: scoreMax = score
                elif score < scoreMax:
                    parar = True
                    print(score)

            i += 1

    def daviesBouldin(self, inst, labels):
        score = davies_bouldin_score(inst, labels)
        return score

    def calinskiHarabasz(self, inst, labels):
        score = calinski_harabasz_score(inst, labels)
        return score

    def guardarScore(self, num, score):
        string = ' Agrupaciones: {}   '.format(num)
        string += 'Score: {}'.format(round(score, 4))
        string += '\n'
        with open('resultados\score.txt', "a") as res:
            res.write(string)

        res.close()


clust = ut.cargar('resultados\datosAL.txt')
ev = Evaluador()
ev.evaluar('resultados\dist.txt', clust)