2019独角兽企业重金招聘Python工程师标准>>>

需求,一个csv文件中有很多行,每行是个id,字符串,每个字符串可能两两相似(是相似,不是相同),怎样去重,保留两两相似度小于0.8的id。

做法,用diff库计算两两相似度,每次计算结果,这里可以用(进程/线程/协程加速),然后将相似度大于0.8的结果放到set中,最后set中取任意一个加非集合中成员,可以返回去重结果。

import sys, os
from HTMLParser import HTMLParser
from multiprocessing import Queue
wait_set=Queue()class HTMLStripper(HTMLParser):def __init__(self):self.reset()self.fed = []def handle_data(self, d):self.fed.append(d)def get_data(self):return ''.join(self.fed)def strip_tags(html):s = HTMLStripper()s.feed(html.decode('UTF-8'))return s.get_data()def distance(s1, s2):import difflibreturn difflib.SequenceMatcher(None, s1, s2).ratio()class CSV():def __init__(self, csvfile, delimiter=',', quotechar='"'):self.csvfile = csvfileself.delimiter = delimiterself.quotechar = quotecharself.items = []import csvcsv.field_size_limit(sys.maxsize)#this line is limited in linux,if run in windows will rasise#csv.field_size_limit(131072)with open(csvfile, 'rU') as f:for item in csv.reader(f, delimiter=delimiter, quotechar=quotechar):self.items.append(item)f.close()def diff(self, threshold=None, strip=None, truncate=None, start=0, end=None):i = startfor item in self.items[start:end]:i = i + 1id = item[0]text = item[1]if strip:text = strip_tags(text)# Skip the items already diffed or itselffor c_item in self.items[i:]:c_id = c_item[0]c_text = c_item[1]if strip:c_text = strip_tags(c_text)if truncate:d = distance(text[0:truncate], c_text[0:truncate])else:d = distance(text, c_text)if (threshold and d < threshold):continuewait_set.put(id)# because the subprocesswait_set.put(c_id)def output(self, data):print ','.join(data)sys.stdout.flush()def analysis(self):print "%s items, %s bytes." % ( len(self.items), os.path.getsize(self.csvfile) )print '%6s %32s %32s %32s' % ('No', 'UUID', 'Length(after strip)', 'Length(before strip)')i = 0for item in self.items:print '%6s %32s %32s %32s' % (i, item[0], len(strip_tags(item[1])), len(item[1]))i = i + 1;def wrapper(args):CSV.diff(*args)def main():csvfile = sys.argv[1]threshold = 0.8threads = 4strip = Truetruncate = 256action = 'diff'if len(sys.argv) > 2:if sys.argv[2] == '-a':action = 'analysis'else:threshold = float(sys.argv[2])if len(sys.argv) > 3:threads = int(sys.argv[3])if len(sys.argv) > 4:strip = bool(int(sys.argv[4]))if len(sys.argv) > 5:truncate = int(sys.argv[5])c = CSV(csvfile)if action == 'analysis':c.analysis()elif action == 'diff':if threads > 1:batch = len(c.items) / threadstail = len(c.items) % threadsfrom multiprocessing import Poolpool = Pool()args = []i = 0while (i < threads):start = batch * iend = start + batch# Last loopif i == (threads - 1):end = end + tailargs.append( (c, threshold, strip, truncate, start, end) )i = i + 1pool.map(wrapper, args)else:c.diff(threshold, strip, truncate)wait_list=[x[0] for x in c.items[1:]]if wait_set.qsize:queue_list=list(set([wait_set.get() for x in range(wait_set.qsize())]))for x in range(len(queue_list)-1):#left one elementele = queue_list[x]if ele in wait_list:wait_list.remove(ele)print wait_listelse:return wait_listsys.stdout.flush()if __name__ == '__main__':main()

转载于:https://my.oschina.net/u/2950272/blog/1475591

一个根据相似度的去重方法相关推荐

  1. 600度近视眼恢复方法_近视眼了怎么办?试试这几种方法,或许能奏效

    眼睛可以说是心灵的窗户,但是有时这扇心灵之窗也容易出现问题.近视已经成为了困扰现在众多朋友的主要问题之一.一旦出现了近视问题,就会感到特别的头痛,不知道近视眼怎么办?事实上,不同程度的近视眼有着不同的 ...

  2. java string 连续字符_Java中字符串中连续相同字符去重方法

    导读 正文 最近参加了一个面试,问到了如何在一个字符串中连续相同字符去重,想了想用正则表达式应该可以轻松实现.可是由于长时间没有编码了,而且由于原先的工作用到的比较少.具体的自己就不会写正则表达式用到 ...

  3. php 文件扫描去重,PHP中的去重方法详解和文件下载

    本文主要和大家分享PHP中的去重方法详解和文件下载,在php中文件导入过程中,经常会遇到重复事件,那么就需要我们去重,然后进行下载. 1.思想 先设置一个存储主键数组,和一个空数组.解析文件,然后看要 ...

  4. JS数组去重方法记录

    js数组去重方法 1.遍历数组,建立新数组,利用indexOf判断是否存在于新数组中,不存在则push到新数组,最后返回新数组 代码如下(示 例): function getArray(ar) {va ...

  5. JS数组去重方法小结

    JS数组去重 看了网上很多数组去重方法,用的比较常见的大概就几种,今天想自己来做一个总结. 部分内容参考该博客 1 . 在原数组上操作(基本方法) 思路:利用循环嵌套,判断数组中每个元素与其后面的元素 ...

  6. Java List<T>去重方法,引用类型集合去重

    前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家.点击跳转到教程. 一.实体类中要重写比较方法equals,最好也重写hashcode方法 public class W ...

  7. php数组是有序,php判断一个数组是否为有序的方法

    php判断一个数组是否为有序的方法 本文实例讲述了php判断一个数组是否为有序的方法.分享给大家供大家参考.具体分析如下: 这段代码的时间复杂度为O(n) function JudegSortArra ...

  8. python将矩阵顺时针旋转90度_python 二维数组90度旋转的方法

    如下所示: #!/usr/bin/env python #-*- coding: utf-8 -*- """ [0, 1, 2, 3] [0, 1, 2, 3] [0, ...

  9. java 相同字符不连续_Java中字符串中连续相同字符去重方法

    搜索热词 最近参加了一个面试,问到了如何在一个字符串中连续相同字符去重,想了想用正则表达式应该可以轻松实现.可是由于长时间没有编码了,而且由于原先的工作用到的比较少.具体的自己就不会写正则表达式用到的 ...

最新文章

  1. 控制寄存器和系统地址寄存器
  2. linux pcl 转图片,PCL转图片工具Mgosoft PCL To Image Converter
  3. pojo java,什么是java pojo类,java bean,普通类?
  4. 被遗忘的图灵:计算机、神经网络、人工智能……他是这一切之父
  5. UVa 10603 Fill (BFS+优先队列)
  6. feign调用多个服务_Spring Cloud 快速入门系列之feign–微服务之间的调用
  7. php 枚举类型比较,PHP 枚举类型的管理与设计知识点总结
  8. 洛谷 P1054 等价表达式
  9. java常量表达式区别_java编译器对string常量表达式的处理和优化
  10. 酒店opera系统服务器故障,【干货】酒店人必学的Opera系统中英讲解(值得收藏)...
  11. 【Codecs系列】HEVC标准(三):大尺寸四叉树分割技术
  12. 中兴配置dhcp服务器,在中兴接入层交换机上配置DHCP Snooping
  13. ltsc教育许可激活_教育部征求有关开放许可要求的意见
  14. 记一次大量499http状态码问题出现与处理
  15. 我国台湾地区智慧城市建设的实践与启示
  16. Linux service之自定义服务
  17. 网页报错:You don't have permission to access
  18. android 监听wifi的连接状态,Android判断wifi状态 监听wifi连接
  19. Java核心技术·卷二·第一章笔记
  20. Web服务下载zip文件

热门文章

  1. VB 写文件关联程序
  2. 超值买卖?惠普企业收购头部超算制造商Cray,仅13亿美元
  3. 海外同行首次大规模声援996.ICU,微软和GitHub员工签署联名信,一夜4700星
  4. CV还要更热闹!旷视刚宣布4.6亿美元融资,商汤:新一轮年内完成
  5. Python将字符串转为字典最佳实践
  6. PHP Web Shell in browser
  7. CentOS下通过postfix使用自己的gmail邮箱发送邮件
  8. Django模板系统(非常详细)
  9. 仿新浪微盾客户端项目简介四
  10. Ural_1586. Threeprime Numbers (DP)