Почти одинаковые дубликаты, но разной длины - PullRequest
0 голосов
/ 21 мая 2018

Я хочу удалить почти те же дубликаты, но оставить только самый длинный.Я думаю сначала сравнить первое слово или первые несколько слов, чтобы отфильтровать кандидата для сравнения.Затем сравните длину оставшихся элементов.Если он самый длинный, я запишу его в новый текстовый файл.Вот тестовый файл 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()

Ответы [ 3 ]

0 голосов
/ 21 мая 2018

С наименьшим усилием:

Хитрость заключается в том, чтобы не вычислять полную длину новой строки (или строки), а использовать начинается с (), чтобы соответствовать уже проверенномуте, в качестве префикса.С помощью этой функции вы останавливаетесь в тот момент, когда получаете строку, даже немного более длинную (+1), чем предыдущие, что и имеет значение.

ListofLine=["I am Harry.",
"I am Harry. I like to eat apple.",
"I am Garry.",
"I am Garry. I am Happy."]
list=[]   # to contain the longest ones

for line in ListofLine:  # ListofLine are basically the input lines
    found = False
    for k in list:  
        if line.startswith(k):
            list.remove(k)  # removes relatively smaller one
            list.append(line) # add the longer one instead
            found= True
            break
    if found == False: list.append(line)
for item in list:
    print item

Наконец, список будет содержать элементы, которые являются самыми длинными.

https://www.jdoodle.com/embed/v0/vIG

отпечатки:

I am Harry. I like to eat apple.
I am Garry. I am Happy.
0 голосов
/ 21 мая 2018

Если вы можете определить функцию, которая отображает каждую строку в отдельный класс, вы можете использовать itertools.groupby.

Например, предположим, что две строки похожи, если они имеют одинаковые 10 начальных символов.

data = """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.""".split('\n')

from itertools import groupby
criterion = lambda s: s[:10]

result = [max(g[1], key=len) for g in groupby(data, criterion)]
# ['I am Harry. I like to eat apple.', 'I am Garry. I am Happy.']
0 голосов
/ 21 мая 2018

Вам нужно определить критерии, чтобы найти то, что вы называете общей частью.Это может быть первое предложение, например «Я - Гарри».

Для разбора предложения вы можете использовать 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

Здесь find_all_sentences - это функция.Это результат функции re.compile findall .Это помощник для поиска всех предложений в строке.

Как только эта функция определена, вы можете использовать ее для разбора строк и извлечения первого предложения, которое считается общей частью для проверки.

Каждый раз, когда вы подходите к предложению, вы можете сохранить его в dict (здесь я использовал OrdererdDict , чтобы сохранить порядок строк).Конечно, если вы найдете более длинную строку, вы можете заменить существующую строку следующей:

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)

Чтобы написать файл, используйте с оператором:

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)
...