Учитывая произвольную строку, каков эффективный метод поиска повторяющихся фраз? Можно сказать, что для включения фразы должны быть длиннее определенной длины.
В идеале вы должны указать количество вхождений каждой фразы.





Суффиксные деревья - хороший способ реализовать это. Внизу статьи есть ссылки на реализации на разных языках.
Как сказал jmah, для этого вы можете использовать суффиксные деревья / суффиксные массивы.
Есть описание алгоритма, который вы могли бы использовать здесь (см. Раздел 3.1).
Вы можете найти более подробное описание в цитируемой ими книге (Gusfield, 1997), которая называется в гугл книгах.
Как и ранее, люди упоминали, что суффиксное дерево - лучший инструмент для работы. Мой любимый сайт для деревьев суффиксов - http://www.allisons.org/ll/AlgDS/Tree/Suffix/. Он перечисляет все изящные варианты использования суффиксных деревьев на одной странице и имеет встроенное тестовое приложение js для тестирования строк и работы с примерами.
В теории
На практике
Я предполагаю, что вы анализируете документ, состоящий из слов на естественном языке (например, английского), и на самом деле хотите что-то сделать с собранными вами данными.
В этом случае вы можете просто провести быстрый анализ н-грамм для небольшого числа n, такого как n = 2 или 3. Например, вы можете разметить свой документ в виде списка слов, удалив знаки препинания, заглавные буквы и перевод строки. слова (работает, запускает оба -> «запустить») для увеличения семантических совпадений. Затем просто создайте хеш-карту (например, hash_map в C++, словарь в python и т.д.) каждой смежной пары слов с учетом ее количества появлений на данный момент. В итоге вы получаете очень полезные данные, которые очень быстро кодировались, а запускались не очень медленно.
Это кажется интуитивно понятным (исключить n-граммы вместо предложений), хотя я видел некоторые работы, которые на самом деле говорят об обратном - возможно, поскольку вы все же можете охарактеризовать документ в некоторой степени просто типами переходов, используемых между предложениями.
Простое построение массива суффиксов O (n): springerlink.com/content/0nyb22e5amj4rac4… это решенная проблема. - Более того, даже наивный алгоритм O (n log n) довольно хорошо работает на практике.
предположим, вам дан отсортированный массив A с n записями (i = 1,2,3, ..., n)
Algo(A(i))
{
while i<>n
{
temp=A[i];
if A[i]<>A[i+1] then
{
temp=A[i+1];
i=i+1;
Algo(A[i])
}
else if A[i]==A[i+1] then
mark A[i] and A[i+1] as duplicates
}
}
Этот алгоритм выполняется за время O (n).
Обратите внимание, что вам придется разбивать предложения, прежде чем разбивать их на слова, иначе появятся ложные n-граммы, которые пересекают границы предложения.