File size: 1,732 Bytes
21a6064 3b25244 21a6064 ec88281 01fd84f a73e92a 21a6064 a73e92a 3b25244 a73e92a 3b25244 a73e92a ec88281 a73e92a |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 |
import streamlit as st
from sentence_transformers import SentenceTransformer, util
import pandas as pd
import numpy as np
from ast import literal_eval
st.title("Mining Potential Legitimate Domains from a Typosquatted Domain")
# model_choice = st.selectbox("Select the embedding model:", ["", "Embedder-typosquat-detect-Canine", "Embedder-typosquat-detect"], index=0)
model_choice= "Embedder-typosquat-detect-Canine"
if model_choice:
model = SentenceTransformer(f"./{model_choice}")
domains_df = pd.read_csv(f'./{model_choice}/domains_embs.csv')
domains_df.embedding = domains_df.embedding.apply(literal_eval)
corpus_domains = domains_df.domain.to_list()
corpus_embeddings = np.stack(domains_df.embedding.values).astype(np.float32) # Ensure embeddings are float32
st.write("Enter a potential typosquatted domain and select the number of top results to retrieve.")
domain = st.text_input("Potential Typosquatted Domain")
top_k = st.number_input("Top K Results", min_value=1, max_value=50, value=5, step=1)
if st.button("Search for Legitimate Domains"):
if domain:
# Perform Semantic Search
query_emb = model.encode(domain).astype(np.float32) # Ensure query embedding is also float32
semantic_res = util.semantic_search(query_emb, corpus_embeddings, top_k=top_k)[0]
ids = [r['corpus_id'] for r in semantic_res]
scores = [r['score'] for r in semantic_res]
res_df = domains_df.loc[ids, ['domain']].copy()
res_df['score'] = scores
st.write("Mined Domains:")
st.dataframe(res_df)
else:
st.warning("Please enter a domain to perform the search.")
|