Это очень похоже на то, как Lucene ранжирует документы по заданному поисковому запросу. Они используют метрику, называемую TF-IDF, где TF - это термин «частота», а «idf» - обратная частота документа. Первый ранжирует документ тем выше, чем больше терминов запроса появляются в этом документе, а второй ранжирует документ тем выше, если в нем есть термины из запроса, которые встречаются нечасто во всех документах. Конкретным способом их вычисления является журнал (количество документов / количество документов с термином), т. Е. Обратная частота появления термина.
Итак, в вашем примере эти фразы являются SIP-файлами относительно книги Джоэла, потому что они являются редкими фразами (встречаются в нескольких книгах) и встречаются в его книге несколько раз.
Редактировать : в ответ на вопрос о 2 и 3 граммах перекрытие не имеет значения. Рассмотрим предложение «мои две собаки коричневые». Здесь список из 2 граммов - [«мои двое», «две собаки», «собаки есть», «коричневые»], а список из 3 граммов - [«мои две собаки», «две собаки ", собаки коричневые"]. Как я уже упоминал в своем комментарии, с перекрытием вы получаете N-1 2 грамма и N-2 3 грамма за поток из N слов. Поскольку 2 грамма могут равняться только другим 2 граммам, а также 3 граммам, вы можете обрабатывать каждый из этих случаев отдельно. При обработке 2 грамма каждое «слово» будет 2 граммом и т. Д.