Дублирующиеся строки в списке не удаляются, если самые похожие не находятся в подсписке - PullRequest
0 голосов
/ 20 мая 2019

Список, содержащий текстовые строки (полные тексты газетных статей), не может быть успешно дедуплицирован. Единственное решение - найти наиболее распространенные предложения, выбрать элементы списка, содержащие эти предложения, а затем выполнить дедупликацию на уровне этих подсписков.

После прочтения множества подобных вопросов у меня все еще нет решения.

Вот четыре различных метода, которые я попробовал:

1] x = list(dict.fromkeys(lst))
2] x = set(lst)
3] from iteration_utilities import unique_everseen
   x = list(unique_everseen(lst))
4] using pandas
   df = df.drop_duplicates(subset=['article_body'], keep='first')

Все они возвращают одинаковое количество элементов списка.

Однако, когда я проверяю распределение частот наиболее распространенных «предложений» и ищу их. Я все еще нахожу около 45 обращений, так как это предложение встречается в нескольких текстах, некоторые из них идентичны когда все эти тексты объединены в один список, я могу использовать список x = (dict.fromkeys (lst)). Это приводит только к 9 элементам списка.

Как это возможно?

df = pd.read_json('UK data/2010-11.json')
len(df)
13288

df = df.drop_duplicates(subset=['article_body'], keep='first')
len(df)
6118

lst = df['article_body'].tolist()
len(lst)
6118

# taking this solution as a reference point, here it returns 6118 at the level
# of the whole list

len(list(dict.fromkeys(lst)))
6118

from nltk.tokenize import sent_tokenize

searchStr = 'Lines close at midnight.'
found = []

for text in lst:
    sentences = sent_tokenize(text)
    for sentence in sentences:
        if sentence == searchStr:
            found.append(text)

len(found)
45

# when the function is used only on a subset of the full-texts, it can suddenly 
# identify more duplicates

len(list(dict.fromkeys(found)))
9

РЕДАКТИРОВАТЬ: Пожалуйста, проверьте полную демонстрацию в блокноте Jupyter доступны здесь: https://colab.research.google.com/drive/1EF6PL8aduZIO--Ok0hGMzLWFIquz6F_L

Я ожидаю, что использование той же функции в полном списке приведет к удалению ВСЕХ дубликатов, но это явно не так. Почему я не могу удалить дубликаты из всего списка? Как я могу убедиться, что каждый элемент списка сравнивается со всеми остальными?

1 Ответ

1 голос
/ 20 мая 2019

Похоже, что пробел может быть проблемой.

import re

x = list(set(map(lambda string: re.sub(r'\s+', ' ', string), lst)))

или что-то подобное может работать.

...