Jaccard-Sim manuell

Jaccard-Sim manuell#

t = [ "Hallo Welt!", "Hallo Johannes", "Hallo Hallo", "Wie geht es Dir?" ]
t
['Hallo Welt!', 'Hallo Johannes', 'Hallo Hallo', 'Wie geht es Dir?']
def ngram3(x, n=3):
    """Gibt alle 3-Gramme des Strings x zurück"""
    
    ergebnis = []
    for i in range(len(x)-n+1):
        a = x[i:i+n]
        #print( a )
        ergebnis.append( a )

    return set(ergebnis)
ngram3("Hallo")
{'Hal', 'all', 'llo'}
t2 = [ ngram3(z)  for z in t      ]
print( t2 )
[{'lt!', 'all', 'llo', 'Wel', 'o W', 'lo ', 'elt', ' We', 'Hal'}, {'all', 'llo', ' Jo', 'Joh', 'nes', 'nne', 'oha', 'o J', 'lo ', 'han', 'ann', 'Hal'}, {'all', 'llo', 'lo ', ' Ha', 'o H', 'Hal'}, {'ir?', 'geh', 'e g', ' es', 'eht', 'ie ', 'Dir', 't e', 's D', 'ht ', 'Wie', ' ge', ' Di', 'es '}]
x = "Hallo"
n = 3

ergebnis = []
for i in range(len(x)-3+1):
    a = x[i:i+n]
    #print( a )
    ergebnis.append( a )

ergebnis
['Hal', 'all', 'llo']
def sim(x, y):
    return len(x) / len(y)

def jsim(x, y):
    """jaccard sim, mit x und y ist eine Menge"""
    return len( x.intersection(y) ) / len( x.union(y) )
import pandas as pd
import numpy as np

# Initialisieren Sie eine leere Matrix (Liste von Listen)
n = len(t)
similarity_matrix_data = []

# Berechnen Sie die Ähnlichkeiten für jedes Paar (i, j)
for i in range(n):
    row = []
    for j in range(n):
        # Die Ähnlichkeit ist sim(t[i], t[j])
        similarity_value = jsim(t2[i], t2[j])
        row.append(similarity_value)
    similarity_matrix_data.append(row)
similarity_matrix_data
[[1.0, 0.23529411764705882, 0.36363636363636365, 0.0],
 [0.23529411764705882, 1.0, 0.2857142857142857, 0.0],
 [0.36363636363636365, 0.2857142857142857, 1.0, 0.0],
 [0.0, 0.0, 0.0, 1.0]]
df = pd.DataFrame(similarity_matrix_data)
df
0 1 2 3
0 1.000000 0.235294 0.363636 0.0
1 0.235294 1.000000 0.285714 0.0
2 0.363636 0.285714 1.000000 0.0
3 0.000000 0.000000 0.000000 1.0