Задача для самостоятельного решения

Напишите программу, которая измеряет сходство двух текстов, подсчитывая коэффициент Жаккара по множествам N-грамм.

N-граммы

N-граммой назовем последовательность из N слов, приведенных к нижнему регистру. Будем говорить, что N-грамма встретилась в тексте, если все ее слова встречаются последовательно друг за другом в одном предложении.

В данной задаче считайте, что предложения всегда отделяются друг от друга точкой одним или несколькими следующими символами: .!?()[]{}. Другие символы учитывать не нужно. То есть фразу "А. С. Пушкин был... [самым] настоящим (!) поэтом" в рамках этой задачи стоит считать шестью предложениями: "А", "C", "Пушкин был", "самым", "настоящим", "поэтом".

При разбиении текста на слова, считайте, что слова могут состоять лишь из символов, входящих в категорию L (Letter) в таблице Unicode. Конструкции \p и \P в регулярных выражениях могут оказаться полезными в этой задаче.

Коэффициент Жаккара

Меру сходства двух текстов можно определить с помощью так называемого коэффициента Жаккара следующим образом:

freq(g,T) — это количество вхождений граммы g в текст T.

G — множество всех различных N-грамм, встречающихся хотя бы в одном текстов.

\displaystyle common(T_1, T_2) = \sum_{g \in G} \min(freq(g, T_1), freq(g, T_2))
\displaystyle total(T_1, T_2) = \sum_{g \in G} \max(freq(g, T_1), freq(g, T_2))
\displaystyle J(T_1, T_2) = \frac{common(T_1, T_2)}{total(T_1, T_2)}

Требование к оформлению

Считайте, что все тексты в кодировке UTF-8.

Выполните решение в виде консольного приложения, принимающего три аргумента командной строки:

  • путь до файла с текстом T_1,
  • путь до файла со текстом T_2,
  • число N — размер N-грамм.

Программа должна выводить на консоль три числа по одному в строке:

  • количество различных N-грамм в первом тексте,
  • количество различных N-грамм во втором тексте,
  • значение коэффициента Жаккара J(T_1,T_2).

Примеры

echo a b c. a b c > text1.txt
echo a b c. x y z > text2.txt
program.exe text1.txt text2.txt 3
1
2
0.5

echo a b c > text1.txt
echo a b > text2.txt
program.exe text1.txt text2.txt 2
2
1
0.5

Пример работы на текстах произведений Стругацких "Улитка на склоне" и "Беспокойство"

program.exe ulitka_na_sklone.txt bespokoystvo.txt 3
47624
23739
0.188947385958482
Комментарии отключены
Работает форматирование: **жирный текст**, __курсивный текст__, `код`, ```многострочный код```.