уменьшить список строковых значений по показателю сходства - PullRequest
0 голосов
/ 12 сентября 2018

Я столкнулся с проблемой машинного обучения; Учебные данные состоят из числовых, категориальных и дат. Я начал тренироваться только на основе чисел и дат (которые я конвертировал в числа, используя эпоху, день недели, часы и т. Д.). Помимо плохой оценки, показатели очень хорошие (секунды обучения на миллион входов).

Проблема в категориях, у которых большинство значений до тысяч.

Значения состоят из марок оборудования, комментариев и т. Д. И вводятся по-человечески, поэтому я предполагаю, что есть много сходств. Я могу пожертвовать немного представлением о реальном мире через данные (оценка Хенсе) для возможности (время обучения).

Задача программирования: я придумал это из этого хорошего анализа производительности

import difflib

def gcm1(strings):
    clusters = {}
    co = 0
    for string in (x for x in strings):
        if(co % 10000 == 0 ):
            print(co)
        co = co +1    
        if string in clusters:
            clusters[string].append(string)
        else:
            match = difflib.get_close_matches(string, clusters.keys(), 1, 0.90)
            if match:
                clusters[match[0]].append(string)
            else:
                clusters[string] = [ string ]
    return clusters

def reduce(lines_):
    clusters = gcm1(lines_)
    clusters = dict( (v,k) for k in clusters for v in clusters[k] )
    return [clusters.get(item,item) for item in lines_]

Пример этого похож на:

reduce(['XHSG11', 'XHSG8', 'DOIIV', 'D.OIIV ', ...] 
=> ['XHSG11', 'XHSG11', 'DOIIV', 'DOIIV ', ...] 

Я очень привязан к Python, поэтому не смог запустить другой реализованный код на C. Очевидно, что функция difflib.get_close_matches в каждой итерации является самой жадной.

Есть ли лучшая альтернатива? или лучший метод моего алгоритма?

Как я уже говорил о миллионах записей, скажем, о 10 столбцах, я даже не могу оценить, когда алгоритм остановится (более 3 часов и все еще работает на моих 16 гигабайтах оперативной памяти и процессоре i7 4790k)

Данные как (извлечение):

    Comments:  [nan '1er rdv' '16H45-VE' 'VTE 2016 APRES 9H'
     'ARM : SERENITE DV. RECUP.CONTRAT. VERIF TYPE APPAREIL. RECTIF TVA SI NECESSAIRE']
    422227 different values

    MODELE_CODE:  ['VIESK02534' 'CMA6781031' 'ELMEGLM23HNATVMC' 'CMACALYDRADELTA2428FF'
     'FBEZZCIAO3224SVMC']
    10206 values

    MARQUE_LIB:  ['VIESSMANN' 'CHAFFOTEAUX ET MAURY' 'ELM LEBLANC' 'FR BG' 'CHAPPEE']
    167 values 
... more columns
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...