Пара строк на основе уникальных подстрок - PullRequest
0 голосов
/ 07 марта 2012

У меня есть два набора строк, которые мне нужно сопоставить, если это возможно, по идентичным подстрокам в каждой паре (жирный шрифт в примерах ниже; жирный шрифт / заглавные буквы сделаны здесь только для выделения, нет способа определить ключевую подстроку, посмотрев на элемент списка самостоятельно), которые являются уникальными в каждом списке. Оставшаяся часть (lorem ipsum) текста может быть общей для многих элементов или может быть совершенно уникальной.

Список один:

  1. "Lorem ipsum dolor sit amet, CANDY BAR Концертный концерт elit, "
  2. "sed do eiusmod CANDY CANE tempor incididunt ut labore et dolore магна "
  3. "sed do eiusmod tempor ГОМЕР Инцидент ут Лаборе и Долоре магна "
  4. "Lorem ipsum dolor sit amet, adipisicing, организатор" PICKUP ГРУЗОВИК элит, "
  5. "ullamco labourisisisisis aliquip ex ea кассовый след. Duis aute"

Список два:

  1. "sed do eiusmod tempor incididunt HOMER ut labore et dolore magna"
  2. "Аликва. Ut enim ad minim veniam, CANDY BAR Quis Nostrud упражнение"
  3. "Аликва. Ut enim ad minim veniam, quis nostrud CANDY CANE упражнение"
  4. "irure dolor в предеэндерите в волюте Velit esse cillum dolore"
  5. "Lorem ipsum dolor sit amet, adipisicing" мастер-класс " Пикап elit"

Из приведенного ниже образца текста совпадают: 1-2; 2-3; 3-1; 4-5

элемент 5 в списке один и элемент 4 в списке 2 не совпадают ни с чем.

Ответы [ 2 ]

2 голосов
/ 07 марта 2012

Если общий объем данных, с которыми вы работаете, относительно невелик, то уже предложенные решения (с использованием .contains() или регулярных выражений), вероятно, наиболее практичны. Ниже приведен способ сделать это, когда объем данных намного больше.

Ключевой частью решения является использование массивов суффиксов. Массив суффиксов представляет собой лексикографически отсортированный список всех суффиксов (в смысле концов строк, а не лингвистических суффиксов) текста (или объединение нескольких текстов).

В примере, который вы описали, это будет связано с созданием суффиксного массива объединенных текстов одного из двух наборов . Я предполагаю, что мы делаем это для set 2 , поэтому мы объединяем все предложения, используя уникальный символ разделения (я выбрал хеш-символ # ниже):

 sed do eiusmod tempor incididunt HOMER ut labore et dolore magna#aliqua. Ut enim ad minim veniam, CANDY BAR quis nostrud exercitation#aliqua. Ut enim ad minim veniam, quis nostrud CANDY CANE exercitation#....

Далее вы должны создать массив суффиксов этой строки вместе с массивом самых длинных префиксов (LCP). Обе структуры данных могут быть построены с использованием грубой силы подход, если объем текста не очень большой. Кроме того, существуют библиотеки для более эффективного их построения, например, jSuffixArrays .

Наконец, вы перебираете предложения set 1 , а в каждом предложении - кандидатские начальные позиции соответствующих токенов (возможно, только слова, которые следуют за пробелом или пунктуацией) и ищите массив суффиксов набора 2 для них. Поиск в массиве суффиксов , когда массив LCP доступен, можно выполнить за O (n + m) раз (n - длина объединенной строки набора 2, m - длина строки-кандидата, которой вы являетесь ищем) используя классический алгоритм поиска Манбера и Майерса , но если он все еще слишком медленный, то доступны усовершенствованные методы, например описанный Наварро и Мякиненом 2007 .

Для каждого найденного совпадения массив суффиксов может легко предоставить информацию о том, как часто встречается строка в наборе 2 и сколько разных предложений. Я могу уточнить, как это сделать, отредактировать этот пост, если это необходимо.

1 голос
/ 07 марта 2012

Как я понимаю, у вас есть список строк, которые уникальны в каждом списке.Эти строки затем являются частью (подстрокой) строк в списках.Я бы создал список таких подстрок, а затем сравнил бы их с помощью регулярных выражений (а не подстроки java, так как в этом случае вам нужно знать начальный индекс).

...