代码之家  ›  专栏  ›  技术社区  ›  Curcuma_

通过相似度得分减少字符串值列表

  •  0
  • Curcuma_  · 技术社区  · 7 年前

    问题在于大多数类别的值高达数千。

    价值观包括设备品牌、评论等等,而且都是人工输入的,所以我认为它们有很多相似之处。为了可行性(训练时间),我可以通过数据(hense分数)牺牲一些真实世界的表现。

    编程挑战:我是从这个 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 ', ...] 
    

    显然,在每次迭代中difflib.get_close_匹配的函数是最贪婪的。

    有更好的选择吗?或者我的算法有更好的方法?

    数据如下(摘录):

        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 回复  |  直到 7 年前