删除同一列中的部分重复项,同时保留较长的文本?
Removing partial duplicates within the same column, while retaining the longer text?
所以我是 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,其中我使用了相似性排序功能,但它没有给我预期的输出。有没有更简单的代码?
这是我的方法,希望评论是不言自明的。
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)
所以我是 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,其中我使用了相似性排序功能,但它没有给我预期的输出。有没有更简单的代码?
这是我的方法,希望评论是不言自明的。
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)