Собесов

alexeygrigorev/data-science-interviews: Jaccard similarity

PythonМетрики сходстваЛёгкаяJunior

Условие

Реализуйте функцию 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)

Подводные камни

  1. Если входы — списки с повторами, переход в set теряет частоты. Для частотного сравнения нужен взвешенный Жаккар или косинус по TF-векторам.
  2. На пустых множествах формула даёт 0/0 — нужно зафиксировать договорённость.
  3. Жаккар нечувствителен к размеру: маленькие тексты с одинаковыми токенами дают такой же 1.0, как и идентичные документы.

Эталонный ответ

|A∩B| / |A∪B| через множества; обработать случай двух пустых множеств отдельно.

Хочешь увидеть разбор?

Зарегистрируйся бесплатно — откроется развёрнутое решение этой задачи и ещё 4 на выбор.

Зарегистрироваться и увидеть разбор
Уже есть аккаунт? Войти