def Segmentacao(SegmentosCaracteristicas, LocalizacoesCaracteristicas, caminhosdict, diA, tamanho=1): print(f'segmentacao caracteristicas: {SegmentosCaracteristicas}') nomes = tuple([f_d.caminho_nome(x, ['.p']) for x in caminhosdict]) chavearquivo = (nomes, tuple(SegmentosCaracteristicas)) try: segmentacoes = f_d.le_pickle(diA + '\\_segmentacoes_.p') sorecorrencias = segmentacoes[chavearquivo] print(f'resgatada do arquivo:') print('quantidade so recorrencias:') dadosseg(sorecorrencias) print() return sorecorrencias except FileNotFoundError: sorecorrencias = gerandotamanhos(SegmentosCaracteristicas, LocalizacoesCaracteristicas, caminhosdict, tamanho) segmentacoes = dict() segmentacoes.setdefault(chavearquivo, sorecorrencias) f_d.escreve_pickle(diA, segmentacoes, '_segmentacoes_', trunca=True) return sorecorrencias except KeyError: del (segmentacoes) sorecorrencias = gerandotamanhos(SegmentosCaracteristicas, LocalizacoesCaracteristicas, caminhosdict, tamanho) segmentacoes = f_d.le_pickle(diA + '\\_segmentacoes_.p') segmentacoes.setdefault(chavearquivo, sorecorrencias) f_d.escreve_pickle(diA, segmentacoes, '_segmentacoes_', trunca=True) return sorecorrencias
def segdur_sodotamanho(caminhosdict, janela): aDicio = defaultdict(list) for caminho in caminhosdict: musD = f_d.le_pickle(caminho) nome = musD.pop('nome') print(f'analisando {nome}, ', caminhosdict.index(caminho) + 1, ' de ', len(caminhosdict)) for parte in musD: for voz, caracteristicas in musD[parte].items(): if 'intDia' in caracteristicas: p1 = 0 while p1 + janela <= len(caracteristicas['intDia']): p2 = p1 + janela aDicio[( tuple(caracteristicas['intDia'][p1:p2]), tuple(caracteristicas['duracao'][p1:p2]))].append( (nome, parte, voz, (p1, p2), (caracteristicas['Ncompasso'][p1], caracteristicas['Pcompasso'][p1]), (caracteristicas['Ncompasso'][p2 - 1], caracteristicas['Pcompasso'][p2 - 1]))) p1 += 1 aDicio = sorted([(k, v) for k, v in aDicio.items() if len(v) > 1], key=lambda x: (len(x[0][0]), len(x[1])), reverse=True) return aDicio
def segdur_maisdeumamusica(caminhosdict): aDiciopronto = [] for caminho in caminhosdict: musD = f_d.le_pickle(caminho) nome = musD.pop('nome') print('analisando', caminhosdict.index(caminho) + 1, ' de ', len(caminhosdict)) aDiciopronto = segdur_todasasrecorrenciaspormusica( musD, nome, aDiciopronto) aDiciopronto = [(k, v) for k, v in aDiciopronto if len(v) > 1] return aDiciopronto
def gerandotamanhos(SegmentosCaracteristicas, LocalizacoesCaracteristicas, caminhosdict, tamanho): start = time.perf_counter() SegmentosLocalizacoes = dict() while True: SegmentosDoTam = defaultdict(list) for caminho in caminhosdict: musD = f_d.le_pickle(caminho) nome = musD.pop('nome') for parte in musD: for voz, caracteristicas in musD[parte].items(): if 'intDia' in caracteristicas and len( caracteristicas['intDia']) >= tamanho: p1 = 0 while p1 + tamanho <= len(caracteristicas['intDia']): p2 = p1 + tamanho segmento = [] for caracteristica in SegmentosCaracteristicas: if caracteristica[1] == 'p1': segmento.append( tuple(caracteristicas[ caracteristica[0]][p1:p1 + 1])) elif caracteristica[1] == 'p1p2': segmento.append( tuple(caracteristicas[ caracteristica[0]][p1:p2])) elif caracteristica[1] == 'p2': segmento.append( tuple(caracteristicas[ caracteristica[0]][p2 - 1:p2])) else: raise ValueError( 'caracteristica deve ser p1, p1p2 ou p2' ) segmento = tuple(segmento) localizacao = [nome, parte, voz, (p1, p2)] for caracteristica in LocalizacoesCaracteristicas: if caracteristica[1] == 'p1': localizacao.append( tuple(caracteristicas[ caracteristica[0]][p1:p1 + 1])) elif caracteristica[1] == 'p1p2': localizacao.append( tuple(caracteristicas[ caracteristica[0]][p1:p2])) elif caracteristica[1] == 'p2': localizacao.append( tuple(caracteristicas[ caracteristica[0]][p2 - 1:p2])) else: raise ValueError( 'caracteristica deve ser p1, p1p2 ou p2' ) localizacao = tuple(localizacao) SegmentosDoTam[segmento].append(localizacao) p1 += 1 tamanho += 1 for localizacoes in SegmentosDoTam.values(): if len(localizacoes) > 1: SegmentosLocalizacoes.update(SegmentosDoTam) break else: stop = time.perf_counter() print(f'gerados segmentos até tamanho: {tamanho-1} ') print('quantidade tudo:') dadosseg(SegmentosLocalizacoes) t = stop - start start = time.perf_counter() SegmentosLocalizacoes = [(c, v) for c, v in SegmentosLocalizacoes.items() if len(v) > 1] stop = time.perf_counter() t = t + stop - start print('quantidade so recorrencias:') dadosseg(SegmentosLocalizacoes) print(f'{t} segundos\n') return SegmentosLocalizacoes