Normalized compression distance считается по довольно странной формуле:
https://en.wikipedia.org/wiki/Normalized_compression_distance#Normalized_compression_distanceЭто единственная дистанция, которая мне не дает покоя. Проблем тут много:
1. Я сейчас всё аккуратно почитал по арифметическому сжатию, и результаты совсем не такие, как должны быть при правильной работе формулы:
In [2]: textdistance.arith_ncd('test', 'test')
Out[2]: 0.75
In [3]: textdistance.arith_ncd('test', 'text')
Out[3]: 0.7Алгоритмически всё верно, я несколько раз перепроверил вручную.
2. Написано, что normalized, но по факту максимальное значение сверху не ограничено. Ну ок, его можно ограничить исходя из знаний о самом алгоритме сжатия, но для почти всех алгоритмов это переваливает за единицу.
3. Ну и если докопаться до формулы, то вообще-то
Z(xy) != Z(yx), а значит и
NCD(x, y) != NCD(y, x) по этой формуле. Ну я беру
min(Z(xy), Z(yx)).
Короче, надо придумать, как эту формулу пропатчить, видимо. Я без понятия, что делать.