import numpy as np
import pandas as pd
import matplotlib.pyplot as plt

df=pd.read_csv("documents.csv")
df["clean"]=df.document.str.lower().str.replace(r"[^a-z0-9\s]","",regex=True)

def words(x): return set(x.split())

labels,scores=[],[]

for i in range(len(df)):
    for j in range(i+1,len(df)):
        a,b=words(df.clean[i]),words(df.clean[j])
        c,u=a&b,a|b
        s=len(c)/len(u)
        labels.append(f"{df.id[i]}-{df.id[j]}")
        scores.append(s)
        print(f"\n{df.id[i]} = Document {i+1}\n{df.id[j]} = Document {j+1}")
        print(f"Common Words: {', '.join(sorted(c)) or 'None'}")
        print(f"Common Count: {len(c)} | Unique Count: {len(u)}")
        print(f"Jaccard Similarity = {len(c)}/{len(u)} = {s:.2f}")

plt.bar(labels,scores)
plt.ylabel("Jaccard Similarity")
plt.xticks(rotation=90)
plt.title("Document Lexical Similarity")
plt.tight_layout()
plt.show()