通过相似性分数减少字符串值列表

时间:2018-09-12 17:38:18

标签: python machine-learning categorical-data sentence-similarity

我正面临机器学习问题;学习数据包括数字,分类和日期。我仅根据数字和日期开始训练(我使用纪元,星期几,小时等将其转换为数字)。除了得分很低之外,性能也非常好(接受一百万次培训的秒数)。

问题出在分类器上,大多数分类值高达数千。

值包括设备品牌,注释等,并且是人为输入的,因此我认为它们之间有很多相似之处。为了获得可行性(训练时间),我可以通过数据(高分)牺牲一些真实世界的表现。

编程挑战:我从这个nice performance analysis

想到了这一点
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 gig RAM和i7 4790k CPU上运行)

数据就像(提取)一样:

    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

0 个答案:

没有答案