我想删除几乎相同的副本,但只保留最长的一个。我想首先比较第一个词或前几个词,以便筛选出要比较的候选词。然后比较其余元素的长度。如果是最长的,我会把它写进一个新的文本文件。
这是测试文件https://drive.google.com/file/d/1tdewlNtIqBMaldgrUr02kbCKDyndXbSQ/view?usp=sharing
输入

I am Harry.
I am Harry. I like
I am Harry. I like to eat apple.
I am Garry.
I am Garry. I am Hap
I am Garry. I am Happy.

输出
I am Harry. I like to eat apple.
I am Garry. I am Happy.

我是用Python做的,但这件事就是行不通。
代码
f1 = open('a.txt','r') # Read from file
ListofLine = f1.readlines() # Read the line into list
f2 = open('n.txt','w') # Open new file to write

# Iterate all the sentences to compare
for x in len(ListofLine):
    # Comparing first word of the sentences
    if(ListofLine[x].split()[0] = ListofLine[x+1].split()[0]):
        # Comparing the length and keep the longest length sentences
        if(len(ListofLine[x])>len(ListofLine[x+1])):
            f2.write(ListofLine[x])

f1.close()
f2.close()

最佳答案

你需要定义一个标准来找到你所说的公共部分。它可以是第一句话,例如“我是哈里”
要分析句子,可以使用RegEx,例如:

import re


# match a sentence finishing by a dot
re_sentence = r'((?:(?!\.|$).)+\.?)\s*'
find_all_sentences = re.compile(re_sentence, flags=re.DOTALL).findall

这里所有的句子都是一个函数。这是findall函数的结果。它是一个帮助你找到一行中所有句子的工具。
一旦定义了这个函数,就可以使用它来解析行并提取第一个被认为是要检查的公共部分的句子。
任何时候匹配一个句子,你都可以把它存储在一个dict中(这里我使用orderddict来保持行的顺序)。当然,如果你找到一条更长的线,你可以用这条线替换现有的线:
import collections

lines = [
    "I am Harry. I like to eat apple",
    "I am Harry.",
    "I am Garry.",
    "I am Garry. I am Happy."]

longuest = collections.OrderedDict()
for line in lines:
    sentences = find_all_sentences(line)
    first = sentences[0]
    if first in longuest:
        longuest[first] = max([longuest[first], line], key=lambda l: len(l))
    else:
        longuest[first] = line

最后,可以将结果序列化为文件。或者打印出来:
for line in longuest.values():
    print(line)

要写入文件,请使用with语句:
import io


out_path = 'path/to/sentences.txt'

with io.open(out_path, mode='w', encoding='utf-8') as f:
    for line in longuest.values():
        print(line, file=f)

10-08 06:17