Мой ввод - это строка в этом (spintax) формате,
"The {PC|Personal Computer|Desktop} is in {good|great|fine|excellent} condition"
Затем, используя itertools, я генерирую все возможные комбинации.например,
"The PC is in good condition"
"The PC is in great condition"
.
.
.
"The Desktop is in excellent condition"
Из этих строк я хочу сохранить только самые уникальные из них на основе порога сходства, например, только для строк, имеющих сходство менее 60%.Я использовал библиотеку SequenceMatcher , но она не очень хорошо работает с большими наборами данных (250K + элементы) из-за циклических циклов.Вот текущая реализация:
def filter_descriptions(descriptions):
MAX_SIMILAR_ALLOWED = 0.6 #40% unique and 60% similar
i = 0
while i < len(descriptions):
print("Processing {}/{}...".format(i + 1, len(descriptions)))
desc_to_evaluate = descriptions[i]
j = i + 1
while j < len(descriptions):
similarity_ratio = SequenceMatcher(None, desc_to_evaluate, descriptions[j]).ratio()
if similarity_ratio > MAX_SIMILAR_ALLOWED:
del descriptions[j]
else:
j += 1
i += 1
return descriptions
Я сокращаю список (почти) каждую итерацию, чтобы ускорить процесс.Но мне определенно нужен более быстрый алгоритм для решения этой проблемы.Я тоже попробовал Cosine Similarity, но столкнулся с проблемами масштабирования.Он работал нормально около 10 тыс. Пунктов, но выше этого просто застрял мою машину.Вот реализация,
from sklearn.metrics.pairwise import cosine_similarity
tfidf_vectorizer = TfidfVectorizer()
tfidf_matrix = tfidf_vectorizer.fit_transform(descriptions)
val = cosine_similarity(tfidf_matrix[:10000], tfidf_matrix[:10000])
Любое оптимизированное решение для этого?Все, что я хочу, это выбрать n самых уникальных строк из списка.