示例#1
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
示例#2
0
    def clustering(self, dist):
        iteracion = 1
        centroides = self.inicializarCentroides()
        print('Centroides calculados')
        distancias = dis.Distancias(dist)
        distancias.inicializarDist(centroides)
        print('Distancias calculada')

        while len(self.clust.keys()) != 1:
            print(iteracion)

            cl1, cl2, dist = distancias.minimaDist()

            vector1 = self.clust[cl1]
            vector2 = self.clust[cl2]

            del self.clust[cl2]
            del centroides[cl2]

            self.clust[cl1] = vector1 + vector2
            centroides[cl1] = ut.calcularCentro(self.clust[cl1], self.vect)

            distancias.actualizarDist(centroides, cl1, cl2)

            self.dist[dist] = copy(self.clust)
            self.iter[iteracion] = copy(self.clust)

            self.guardarIteracion(iteracion, dist, self.clust)

            iteracion += 1

        ut.guardar('resultados\dist.txt', self.dist)
        ut.guardar('resultados\iter.txt', self.iter)
示例#3
0
 def generar_vocab_npalabras(self, docs, listaVocab):
     """
     Dados los documentos y un path se genera los tf-idf de todas las palabras que se incluyen en el articulo, titulo y cuerpo
     Pre: Los documentos y el path para guardar todos los tokens totales (no se van a usar todos)
     Post: Se guardan todos los tokens y se devuelve los pesos de cada token de cada instancia
     """
     palabras_dicc = dict([])
     for i, doc in enumerate(docs):
         palabras_dicc[i] = ' '.join(doc.palabras.titulo + doc.palabras.cuerpo)
     listaVocab.update(palabras_dicc)
     util.guardar(os.getcwd()+"/preproceso/todas_las_palabras.txt" ,listaVocab)
     pesos = self.tfidf.fit_transform(listaVocab.values())
     palabras = self.tfidf.get_feature_names()
     print("Espacio vectorial analizado y valores tf_idf calculados")
     return palabras, pesos
示例#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 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
示例#6
0
    def clustering(self, dist):
        iteracion = 1
        "Calculamos los centroides"
        centroides = self.inicializarCentroides()
        print('Centroides calculados')
        "Inicializamos las distancias"
        distancias = dis.Distancias(len(self.vect), dist)
        distancias.inicializarDist(centroides)
        print('Distancias calculada')

        while len(self.clust) != 1:
            print(iteracion)

            cl1, cl2, dist = distancias.minimaDist()

            "Recogemos ambos clusters y actualizamos"
            vector1 = self.clust[cl1]
            vector2 = self.clust[cl2]

            self.clust[cl1] = vector1 + vector2
            centroides[cl1] = ut.calcularCentro(self.clust[cl1], self.vect)

            distancias.actualizarDist(centroides, cl1, cl2)

            del self.clust[cl2]
            del centroides[cl2]

            "Guardamos las nuevas iteraciones"
            self.dist[dist] = copy(self.clust)
            self.iter[iteracion] = copy(self.clust)

            self.guardarIteracion(iteracion, dist, self.clust)

            iteracion += 1

        "Guardamos las estructuras de datos para utilizarlas mas tarde"
        ut.guardar(os.getcwd() + "/resultados/dist.txt", self.dist)
        ut.guardar(os.getcwd() + "/resultados/iter.txt", self.iter)
示例#7
0
def preprocesar_train(directorio_ruta):
    """
        Dada una ruta de datos se genera el dataset de las instancias nuevas
        Pre: El directorio de los datos
        Post: La lista de instancias con tuplas de pesos tf-idf de cada instancia
    """
    #directorio = 'datos'
    print('\nGenerando los vectores de las instancias')
    train, test = shuffle_split(directorio_ruta)
    lista = list(crearListaTemasTotales(train) | crearListaTemasTotales(test))
    print("Hay " + str(len(lista)) + " temas totales en el conjunto de datos analizados")
    for doc in train:
        doc.asignarTemaNumerico(lista)
    util.guardar(os.getcwd()+"/preproceso/lista_temas.txt", lista)
    tfidf = Tf_Idf()
    tfidf.generar_vector_tupla_pesos(train)
    selector = SelectorAtributos(tfidf.vector, train, "train")
    util.guardar(os.getcwd()+"/preproceso/lista_articulos_train.txt", train)
    util.guardar(os.getcwd()+"/preproceso/lista_articulos_test.txt", test)
    util.guardar(os.getcwd()+"/preproceso/train_tfidf.txt", selector.espacio_vectorial)
    util.guardar(os.getcwd()+"/preproceso/raw_tfidf", tfidf)
    print('Preproceso completado!')
    return selector.espacio_vectorial, train
示例#8
0
    def elegirAtributos(self, pesos, name):
        """ 
            genera un vector reducido de atributos
            Pre: los pesos de tf_idf.vector
            Post: una lista ordenada de el par de atributos (atributo y peso)
        """
        atributos = set()
        tfidf_score = dict([])
        for articulo, documento_scores in pesos.items():
            mas = dict(sorted(documento_scores.items(), key=itemgetter(1), reverse=True)[:5])
            for palabra, score in mas.items():
                if score > 0.0:
                    atributos.add(palabra)
                    tfidf_score[palabra] = score

        # reducir el vetor hasta un 10%
        longitud = int(len(atributos) / 10)
        atributo_pareado = dict(sorted(tfidf_score.items(), key=itemgetter(1), reverse=True)[:longitud])
        #self.atributos.append(sorted(atributos))
        #print(sorted(atributos))
        self.atributos.append(sorted(atributo_pareado))
        util.guardar(os.getcwd()+"/preproceso/vocabulario_" + name + ".txt" ,self.atributos)
        #self.atributos.append(sorted(atributo_pareado))
        print("Se ha reducido el espacio vectorial en un 90%")
示例#9
0
def preprocesar(directorio_ruta):
    """
        Dada una ruta de datos se genera el dataset de las instancias nuevas
        Pre: El directorio de los datos
        Post: La lista de instancias con tuplas de pesos tf-idf de cada instancia
    """
    #directorio = 'datos'
    print('\nGenerando los vectores de las instancias')
    documentos = escanear_docs(directorio_ruta)
    random.shuffle(documentos)
    tfidf = Tf_Idf()
    tfidf.generar_vocab_npalabras(documentos)
    util.guardar(os.getcwd() + "/preproceso/full_lista_articulos.txt",
                 documentos)
    util.guardar(os.getcwd() + "/preproceso/full_tfidf.txt", tfidf.vPesos)
    util.guardar(os.getcwd() + "/preproceso/raw_full_tfidf", tfidf)
    print('Preproceso completado!')
    return tfidf.vPesos, documentos
示例#10
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")