Я использую твиты для создания вложений слов. Я уже удалил полные дубликаты, но теперь мне также нужно удалить почти дубликаты, допустим, что если 5 твитов в моем корпусе перекрываются на 80%, то следует сохранить только 1 из них. Я использую меру расстояния levenshtein.normalized_simility () от библиотеки textdistance для циклического просмотра моих твитов. Однако это занимает вечность ... Как я могу сделать это быстрее? Мы ценим любые предложения!
В приведенном ниже коде фрейм данных df состоит из идентификатора твита переменных (ID) и самого твита (SentimentText_Clean, type: string). На каждой итерации первый твит выбирается и сравнивается со всеми остальными оставшимися твитами. Затем выбранный твит удаляется из исходного кадра данных и добавляется в новый. Если сходство больше, чем пороговое значение, твиты удаляются из кадра данных. Индексы сбрасываются, и выбирается новый первый твит.
Я уже пробовал и другие меры расстояния, но, похоже, это работает не намного быстрее. Также я пытался удалить только ретвиты, но это не совсем то, что мне нужно. Кроме того, я попытался использовать списки вместо панд, но это, похоже, не намного быстрее.
import textdistance
def remove_near_duplicates(df, threshold = 0.8):
new_df = pd.DataFrame(columns=["ID", "SentimentText_Clean",
"Sim"])
while len(df) > 0:
comp = df["SentimentText_Clean"][0]
t_id = df["Tweet_ID"][0]
df["Sim"] = df["SentimentText_Clean"].apply(lambda x:
textdistance.levenshtein.normalized_similarity(comp, x))
new_df = new_df.append(df.iloc[[0]])
df = df.iloc[1:]
df = df.loc[df["Sim"] < threshold]
df.reset_index(drop = True, inplace = True)
return new_df