Как получить только одну из группы похожих строк в списке строк в java.Как получить только одну из группы похожих строк в списке строк в java
У меня есть список текстовых данных (длина списка ~ 60000) (хранится как строки), в которых есть группы текста, которые очень похожи друг на друга. Из этого списка я хотел бы создать новый список, который имеет только 1 элемент для каждой группы однородных элементов списка
Упрощенный пример:
the boy ate an apple
boy ate apple
the boy ate apple
Если только один из указанных выше в новом списке
Мой общий подход заключается в 2 списка: первоначальный список и новый список, который будет содержать уникальный список
For each text in original_list
for each utext in the unique list
if similarity(text, utext) > threshold (threshold can be 90%)
break
else
is_similar = false
end for
if is_similar = false
add text to unique list
end for
Для функции подобия я использовал симметрию библиотеки java lvenshtein. Однако я в конечном итоге столкнулся с проблемами с кучей пространства Java, даже когда я увеличиваю память jre до 6 ГБ.
Я также удалил стоп-слова и преобразовывал в векторы-термины с использованием разреженных матриц. Однако это очень медленно.
Я действительно думаю, что я могу использовать переопределение equals()
и hashcode()
вариант, как так как я нечеткое соответствие я не могу гарантировать, что hashcode()
будет одинаковым для строк, которые только похожи.
Может ли кто-нибудь предложить более эффективный подход к моему алгоритму, пожалуйста? Я немного ржався с структурами данных, и у меня мозги и поиск в Интернете для решения.
Надеюсь, мой вопрос ясен. Спасибо
Вы можете использовать [Lucene] (http://stackoverflow.com/questions/17746476/fuzzy-search-with-lucene). – approxiblue
Спасибо user880772. Люцен блестяще. – morrk