Условие
Реализуйте функцию jaccard(a, b), считающую коэффициент Жаккара для двух списков (или множеств). По определению J(A,B) = |A ∩ B| / |A ∪ B|. Особо опишите поведение, когда оба множества пусты.
Решение
Подход
Превращаем входные списки в set. Если оба множества пусты — по соглашению возвращаем 1.0 (полное совпадение «ничего с ничем») либо 0.0/NaN — обязательно уточняем у заказчика. Иначе делим длину пересечения на длину объединения.
Реализация
def jaccard(a, b) -> float:
a, b = set(a), set(b)
if not a and not b:
return 1.0 # convention
return len(a & b) / len(a | b)Подводные камни
- Если входы — списки с повторами, переход в
setтеряет частоты. Для частотного сравнения нужен взвешенный Жаккар или косинус по TF-векторам. - На пустых множествах формула даёт
0/0— нужно зафиксировать договорённость. - Жаккар нечувствителен к размеру: маленькие тексты с одинаковыми токенами дают такой же
1.0, как и идентичные документы.
Эталонный ответ
|A∩B| / |A∪B| через множества; обработать случай двух пустых множеств отдельно.