首页 > 解决方案 > 删除同一列中的部分重复项,同时保留较长的文本?

问题描述

所以我是 Python 新手,我希望在同一列中删除部分相似的条目。例如,这些是数据框中的一列中的条目-

第 1 行 - “我有你的沐浴露,我想知道它是否含有动物成分。另外,哪些动物成分?我不喜欢使用含有动物成分的产品。”

第 2 行 - “这上面也没有 ADA。这是假牙膏模仿你的吗?”

第 3 行 - “我有你的沐浴露,我想知道它是否含有动物成分。我不喜欢使用含有动物成分的产品。”

第 4 行 - “我没有看到这个盒子上的 ADA 印章。我只是想确保它仍然可以安全使用?”

第 5 行 - “您好,我只是想知道新牙膏是否获得 ADA 批准?包装上没有说明”

第 6 行 - “您好,我只是想知道新牙膏是否获得 ADA 批准?盒子上没有写明。”

所以在这一列中,第 1 行和第 3 行以及第 5 行和第 6 行是相似的(部分重复)。我希望 python 将这些识别为重复,保留较长的句子并删除较短的句子并将新数据导出到 csv 文件。

预期输出 - 第 1 行 - “我有你的沐浴露,我想知道它是否含有动物成分。另外,哪些动物成分?我不喜欢使用含有动物成分的产品。”

第 2 行 - “这上面也没有 ADA。这是假牙膏模仿你的吗?”

第 3 行 - “我没有看到这个盒子上的 ADA 印章。我只是想确保它仍然可以安全使用?”

第 4 行 - “您好,我只是想知道新牙膏是否获得 ADA 批准?包装上没有说明”

我尝试使用 FuzzyWuzzy,其中我使用了相似性排序功能,但它没有给我预期的输出。有没有更简单的代码?

标签: pythonduplicatesdata-cleaningfuzzywuzzy

解决方案


这是我的方法,希望评论是不言自明的。

from fuzzywuzzy import fuzz,process

rows = ["I have your Body Wash and I wonder if it contains animal ingredients. Also, which animal ingredients? I prefer not to use product with animal ingredients.","This also doesn't have the ADA on there. Is this a fake toothpaste an imitation of yours?","I have your Body Wash and I wonder if it contains animal ingredients. I prefer not to use product with animal ingredients.","I didn't see the ADA stamp on this box. I just want to make sure it was still safe to use?","Hello, I was just wondering if the new toothpaste is ADA approved? It doesn’t say on the packaging","Hello, I was just wondering if the new toothpaste is ADA approved? It doesn’t say on the box."]

clean = []
threshold = 80 # this is arbitrary
for row in rows:
    # score each sentence against each other sentence
    # [('string', score),..]
    scores = process.extract(row, rows, scorer=fuzz.token_set_ratio)
    # basic idea is if there is a close second match we want to evaluate 
    # and keep the longer of the two
    if scores[1][1] > threshold:
        clean.append(max([x[0] for x in scores[:2]],key=len))
    else:
        clean.append(scores[0][0])
# remove dupes
clean = set(clean)

推荐阅读