如何使用python从文本文件中删除类似的副本?

如何使用python从文本文件中删除类似的副本?,python,Python,我编写了以下python代码来删除重复项: lines_seen = set() outfile = open("out.txt", "w") for line in open("file.txt", "r"): if line not in lines_seen: outfile.write(line) lines_seen.add(line) outfile.close() 上面的代码正常工作并删除完全相同的副本,但我希望能够从一行中删除具有3个或

我编写了以下python代码来删除重复项:

lines_seen = set()
outfile = open("out.txt", "w")
for line in open("file.txt", "r"):
    if line not in lines_seen: 
        outfile.write(line)
        lines_seen.add(line)
outfile.close()
上面的代码正常工作并删除完全相同的副本,但我希望能够从一行中删除具有3个或更多精确单词匹配的副本。例如:

The apple is red
The apple red
The banana is yellow
The apple is red
当前代码的输出为:

The apple is red
The apple red
The banana is yellow

但我想删除短语“苹果红”,因为它有3个匹配的单词。我希望这是有道理的。我如何用python编写这个

看看字符串距离函数:

  • 汉明距离
  • Levenshtein距离
  • Jaro–Winkler距离

  • 还有一些Python包,我相信这个包实现了方法2。这些函数不会像您提到的那样进行单词匹配,但字符串距离可能是实现目标的更可靠的方法。

    看看字符串距离函数:

  • 汉明距离
  • Levenshtein距离
  • Jaro–Winkler距离

  • 还有一些Python包,我相信这个包实现了方法2。这些方法不会像您提到的那样进行单词匹配,但字符串距离可能是实现目标的一种更可靠的方法。

    一种非常简单的方法,可以实现您想要的功能,即迭代到目前为止在每行中看到的单词集列表:

    lines_seen = []
    outfile = open("out.txt", "w")
    for line in open("file.txt", "r"):
        words = set(line.split())
        for word_set in lines_seen:
            if len(words.intersection(word_set)) >= 3:
                break
        else:
            outfile.write(line)
            lines_seen.append(words)
    outfile.close()
    
    屈服

    The apple is red
    The banana is yellow
    

    当然,这忽略了对你问题的评论中提到的一些微妙之处。您最好使用一个专门的库,例如。

    一个非常简单的方法可以实现您想要的功能,即迭代到目前为止在每一行中看到的单词集列表:

    lines_seen = []
    outfile = open("out.txt", "w")
    for line in open("file.txt", "r"):
        words = set(line.split())
        for word_set in lines_seen:
            if len(words.intersection(word_set)) >= 3:
                break
        else:
            outfile.write(line)
            lines_seen.append(words)
    outfile.close()
    
    屈服

    The apple is red
    The banana is yellow
    

    当然,这忽略了对你问题的评论中提到的一些微妙之处。您最好使用专门的库,例如。

    行是否总是这样?或者它们包含标点符号等?我可以想办法做到这一点,但发生的是你有这样的线条:“苹果是红色的”和“草莓是红色的”-从技术上来说,它们都有3个匹配的单词,是否也应该排除在外?@AntonvBR对于像我这样的初学者来说,这些线条总是那样,没有标点符号。那么[“苹果是红色的”,“苹果是”,“苹果是黄色的”]?线条总是这样吗?或者它们包含标点符号等吗?我可以想办法做到这一点,但发生的是,你有像“苹果是红色的”和“草莓是红色的”这样的线条“-从技术上讲,它们都有3个匹配的单词,是否也应该排除?@AntonvBR对于像我这样的初学者来说,线条总是那样,没有标点符号。那么[“苹果是红色的”、“苹果是红色的”、“苹果是黄色的”]?我同意字符串距离可能更好,但所有这些都可以在单词级别上完成,例如,来自fuzzyfuzzy导入fuzz的
    ;打印(fuzz.ratio(“苹果是红色的”.split(),”苹果是.split())
    。我同意字符串距离可能更好,但所有这些都可以在单词级别上完成,例如,来自fuzzywuzzy import fuzz的
    ;打印(fuzz.ratio(“苹果是红色的”.split(),”苹果是.split())