Skip to Content
RozdziałyAlgorytmy wyrównywania sekwencji i podobieństwaAlgorytm Nilsimsa

Zadanie 4: Algorytm Nilsimsa - nilsims (3 pkt)

Zaimplementuj algorytm Nilsimsa do wykrywania podobnych tekstów:

class NilsimsHash: """Klasa implementująca algorytm Nilsimsa.""" def __init__(self): """Inicjalizuje hash Nilsimsa.""" pass def _rolling_hash(self, text: str) -> list[int]: """ Oblicza rolling hash dla tekstu. Args: text: Tekst do przetworzenia Returns: Lista wartości rolling hash """ pass def _trigrams(self, text: str) -> list[str]: """ Generuje trigramy z tekstu. Args: text: Tekst do przetworzenia Returns: Lista trigramów """ pass def compute_hash(self, text: str) -> bytes: """ Oblicza hash Nilsimsa dla tekstu. Args: text: Tekst do zahashowania Returns: 256-bitowy hash jako bytes """ pass def compare_hashes(self, hash1: bytes, hash2: bytes) -> float: """ Porównuje dwa hashe Nilsimsa i zwraca stopień podobieństwa. Args: hash1: Pierwszy hash hash2: Drugi hash Returns: Stopień podobieństwa w zakresie [0, 1] """ pass def nilsims_similarity(text1: str, text2: str) -> float: """ Oblicza podobieństwo między dwoma tekstami używając algorytmu Nilsimsa. Args: text1: Pierwszy tekst text2: Drugi tekst Returns: Stopień podobieństwa w zakresie [0, 1] """ pass def find_similar_texts(target: str, candidates: list[str], threshold: float = 0.7) -> list[tuple[int, float]]: """ Znajduje teksty podobne do tekstu docelowego. Args: target: Tekst docelowy candidates: Lista kandydatów threshold: Próg podobieństwa Returns: Lista krotek (indeks, podobieństwo) dla tekstów powyżej progu """ pass

Twoje zadanie:

  1. Zaimplementuj klasę NilsimsHash z metodami do obliczania hash
  2. Zaimplementuj generowanie trigramów i rolling hash
  3. Zaimplementuj porównywanie hashów i obliczanie podobieństwa
  4. Zaimplementuj funkcje pomocnicze do znajdowania podobnych tekstów
  5. Przetestuj algorytm na różnych typach tekstów

Przykład:

text1 = "To jest przykładowy tekst do testowania" text2 = "To jest przykładowy tekst dla testów" similarity = nilsimsa_similarity(text1, text2) # powinno zwrócić wartość bliską 0.8-0.9
Last updated on