Как сделать так, чтобы код удаления почти дубликатов шел быстрее? - PullRequest
1 голос
/ 21 апреля 2019

Я использую твиты для создания вложений слов. Я уже удалил полные дубликаты, но теперь мне также нужно удалить почти дубликаты, допустим, что если 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...