2015-07-25 3 views
1

Как получить только одну из группы похожих строк в списке строк в 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() будет одинаковым для строк, которые только похожи.

Может ли кто-нибудь предложить более эффективный подход к моему алгоритму, пожалуйста? Я немного ржався с структурами данных, и у меня мозги и поиск в Интернете для решения.

Надеюсь, мой вопрос ясен. Спасибо

+0

Вы можете использовать [Lucene] (http://stackoverflow.com/questions/17746476/fuzzy-search-with-lucene). – approxiblue

+0

Спасибо user880772. Люцен блестяще. – morrk

ответ

2

Я использовал Lucene, как и предлагалось, для индексации каждой строки, и это сделало общую производительность проверки подобия намного лучше!

Я столкнулся с другой предложенной альтернативой here, которая выглядит так, как будто она сработала, но не пробовала, поскольку я получил то, что мне нужно от Lucene.

Спасибо!

 Смежные вопросы

  • Нет связанных вопросов^_^