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