import argparse import csv import gzip import sys def domains(path): with gzip.open(path, "rt", encoding="utf-8") as source: for line in source: domain = line.strip().lower().rstrip(".") if domain: yield domain def one_edit(a, b): if abs(len(a) - len(b)) > 1: return False if len(a) == len(b): return sum(x != y for x, y in zip(a, b)) == 1 short, long = sorted((a, b), key=len) i = j = edits = 0 while i < len(short) and j < len(long): if short[i] == long[j]: i += 1 else: edits += 1 if edits > 1: return False j += 1 return True parser = argparse.ArgumentParser(description="Screen domain labels for brand variants") parser.add_argument("file") parser.add_argument("--brand", required=True) args = parser.parse_args() brand = args.brand.strip().lower() if not brand: parser.error("brand must not be empty") writer = csv.writer(sys.stdout) writer.writerow(["domain", "reason"]) for domain in domains(args.file): labels = domain.split(".")[:-1] if any(brand in label for label in labels): writer.writerow([domain, "brand mention"]) elif any(one_edit(brand, label) for label in labels): writer.writerow([domain, "one-edit label"])