import re
from transformers import BertTokenizer
from collections import Counter

# Lista de palabras comunes en español (stopwords)
stopwords = [
    "de", "la", "que", "el", "en", "y", "a", "los", "del", "se", "las", "por", "un", "para", "con",
    "no", "una", "su", "al", "es", "lo", "como", "más", "pero", "sus", "le", "ya", "o", "fue", "este",
    "ha", "sí", "porque", "esta", "son", "entre", "cuando", "muy", "sin", "sobre", "también", "me",
    "hasta", "hay", "donde", "quien", "desde", "todo", "nos", "durante", "todos", "uno", "les", "ni",
    "contra", "otros", "ese", "eso", "ante", "ellos", "e", "esto", "mí", "antes", "algunos", "qué",
    "unos", "yo", "otro", "otras", "otra", "él", "tanto", "esa", "estos", "mucho", "quienes", "nada",
    "muchos", "cual", "poco", "ella", "estar", "estas", "algunas", "algo", "nosotros", "mi", "mis",
    "tú", "te", "ti", "tu", "tus", "ellas", "nosotras", "vosotros", "vosotras", "os", "mío", "mía",
    "míos", "mías", "tuyo", "tuya", "tuyos", "tuyas", "suyo", "suya", "suyos", "suyas", "nuestro",
    "nuestra", "nuestros", "nuestras", "vuestro", "vuestra", "vuestros", "vuestras", "esos", "esas",
    "estoy", "estás", "está", "estamos", "estáis", "están", "esté", "estés", "estemos", "estéis",
    "estén", "estaré", "estarás", "estará", "estaremos", "estaréis", "estarán", "estaría", "estarías",
    "estaríamos", "estaríais", "estarían", "estaba", "estabas", "estábamos", "estabais", "estaban",
    "estuve", "estuviste", "estuvo", "estuvimos", "estuvisteis", "estuvieron", "estuviera", "estuvieras",
    "estuviéramos", "estuvierais", "estuvieran", "estuviese", "estuvieses", "estuviésemos", "estuvieseis",
    "estuviesen", "estando", "estado", "estada", "estados", "estadas", "estad"
]

# Función para limpiar el texto
def limpiar_texto(texto):
    texto = texto.lower()
    texto = re.sub(r'[^\w\s]', '', texto)  # Elimina signos de puntuación
    palabras = texto.split()
    palabras_limpias = [palabra for palabra in palabras if palabra not in stopwords]
    return ' '.join(palabras_limpias)

# Tokenizer BERT
tokenizer = BertTokenizer.from_pretrained('dccuchile/bert-base-spanish-wwm-cased')

# Función para tokenizar y guardar en archivo
def tokenizar_y_guardar(texto, nombre_archivo):
    tokens = tokenizer.tokenize(texto)
    with open(nombre_archivo, 'w') as f:
        for token in tokens:
            f.write(token + '\n')
    return tokens

# Leer noticias desde archivos de texto
with open('noticia1.txt', 'r') as f:
    noticia1 = f.read()

with open('noticia2.txt', 'r') as f:
    noticia2 = f.read()

# Paso 1: Limpiar textos
noticia1_limpia = limpiar_texto(noticia1)
noticia2_limpia = limpiar_texto(noticia2)

# Paso 2: Tokenizar y guardar en archivos
tokens_noticia1 = tokenizar_y_guardar(noticia1_limpia, 'tokens_noticia1.txt')
tokens_noticia2 = tokenizar_y_guardar(noticia2_limpia, 'tokens_noticia2.txt')

# Paso 3: Contar palabras y comparar similitud
def contar_palabras(nombre_archivo):
    with open(nombre_archivo, 'r') as f:
        palabras = f.read().split()  # Lee el archivo y divide el texto en palabras
    return Counter(palabras)  # Cuenta la frecuencia de cada palabra y la devuelve como un Counter

conteo_noticia1 = contar_palabras('tokens_noticia1.txt')
conteo_noticia2 = contar_palabras('tokens_noticia2.txt')

palabras_comunes = set(conteo_noticia1.keys()) & set(conteo_noticia2.keys())
num_palabras_comunes = sum(min(conteo_noticia1[p], conteo_noticia2[p]) for p in palabras_comunes)
num_palabras_totales = sum(conteo_noticia1.values()) + sum(conteo_noticia2.values())

# Paso 4: Calcular porcentaje de similitud
porcentaje_similitud = (num_palabras_comunes / num_palabras_totales) * 100

print(f"Porcentaje de similitud: {porcentaje_similitud:.2f}%")
