Как проверить схожесть текстов?

Вчера пытался релизовать проверку похожести текстов с помощью метода десятисловных шинглов. Для этого текст нормализуется: все символы приводятся к нижнему регистру, спецсимволы преобразуются в пробелы, а лишние пробелы удаляются. Затем текст разбивается на шинглы длиной по 10 слов. Шинглы идут внахлест, так что первое слово второго шингла является вторым словом первого шингла, а второе соответственно третьим. Количество шинглов, как вы понимаете, на 1 меньше, чем количество слов в тексте. После этого для каждого из шинглов подсчитывается контрольная сумма (CRC32). Для шинглов одинакового размера сходство двух текстов определяется как отношение числа одинаковых для обеих текстов шинглов к общему количеству различных шинглов. Но, судя по всему, я делаю что-то не так, так что изменение лишь одного слова из 67 дает результат в 85%, что, конечно же, не так.
Continue reading »