A model finetuned with the
NoticIA Dataset. This model can generate summaries of clickbait headlines
1import torch # pip install torch
2from newspaper import Article #pip3 install newspaper3k
3from transformers import AutoTokenizer, AutoModelForCausalLM, GenerationConfig # pip install transformers
4
5article_url ="https://www.huffingtonpost.es/virales/le-compra-abrigo-abuela-97nos-reaccion-fantasia.html"
6article = Article(article_url)
7article.download()
8article.parse()
9headline=article.title
10body = article.text
11
12def prompt(
13 headline: str,
14 body: str,
15) -> str:
16 """
17 Generate the prompt for the model.
18
19 Args:
20 headline (`str`):
21 The headline of the article.
22 body (`str`):
23 The body of the article.
24 Returns:
25 `str`: The formatted prompt.
26 """
27
28 return (
29 f"Ahora eres una Inteligencia Artificial experta en desmontar titulares sensacionalistas o clickbait. "
30 f"Tu tarea consiste en analizar noticias con titulares sensacionalistas y "
31 f"generar un resumen de una sola frase que revele la verdad detrás del titular.\n"
32 f"Este es el titular de la noticia: {headline}\n"
33 f"El titular plantea una pregunta o proporciona información incompleta. "
34 f"Debes buscar en el cuerpo de la noticia una frase que responda lo que se sugiere en el título. "
35 f"Siempre que puedas cita el texto original, especialmente si se trata de una frase que alguien ha dicho. "
36 f"Si citas una frase que alguien ha dicho, usa comillas para indicar que es una cita. "
37 f"Usa siempre las mínimas palabras posibles. No es necesario que la respuesta sea una oración completa. "
38 f"Puede ser sólo el foco de la pregunta. "
39 f"Recuerda responder siempre en Español.\n"
40 f"Este es el cuerpo de la noticia:\n"
41 f"{body}\n"
42 )
43
44prompt = prompt(headline=headline, body=body)
45
46tokenizer = AutoTokenizer.from_pretrained("Iker/ClickbaitFighter-7B")
47model = AutoModelForCausalLM.from_pretrained(
48 "Iker/ClickbaitFighter-7B", torch_dtype=torch.bfloat16, device_map="auto"
49)
50
51formatted_prompt = tokenizer.apply_chat_template(
52 [{"role": "user", "content": prompt}],
53 tokenize=False,
54 add_generation_prompt=True,
55)
56
57model_inputs = tokenizer(
58 [formatted_prompt], return_tensors="pt", add_special_tokens=False
59)
60
61model_output = model.generate(**model_inputs.to(model.device), generation_config=GenerationConfig(
62 max_new_tokens=32,
63 min_new_tokens=1,
64 do_sample=False,
65 num_beams=1,
66 use_cache=True
67))
68
69summary = tokenizer.batch_decode(model_output,skip_special_tokens=True)[0]
70
71print(summary.strip().split("\n")[-1]) # Get only the summary, without the prompt.
1import torch # pip install torch
2from datasets import load_dataset # pip install datasets
3from transformers import AutoTokenizer, AutoModelForCausalLM, GenerationConfig # pip install transformers
4
5dataset = load_dataset("Iker/NoticIA")
6example = dataset["test"][0]
7headline = example["web_headline"]
8body = example["web_text"]
9
10def prompt(
11 headline: str,
12 body: str,
13) -> str:
14 """
15 Generate the prompt for the model.
16
17 Args:
18 headline (`str`):
19 The headline of the article.
20 body (`str`):
21 The body of the article.
22 Returns:
23 `str`: The formatted prompt.
24 """
25
26 return (
27 f"Ahora eres una Inteligencia Artificial experta en desmontar titulares sensacionalistas o clickbait. "
28 f"Tu tarea consiste en analizar noticias con titulares sensacionalistas y "
29 f"generar un resumen de una sola frase que revele la verdad detrás del titular.\n"
30 f"Este es el titular de la noticia: {headline}\n"
31 f"El titular plantea una pregunta o proporciona información incompleta. "
32 f"Debes buscar en el cuerpo de la noticia una frase que responda lo que se sugiere en el título. "
33 f"Siempre que puedas cita el texto original, especialmente si se trata de una frase que alguien ha dicho. "
34 f"Si citas una frase que alguien ha dicho, usa comillas para indicar que es una cita. "
35 f"Usa siempre las mínimas palabras posibles. No es necesario que la respuesta sea una oración completa. "
36 f"Puede ser sólo el foco de la pregunta. "
37 f"Recuerda responder siempre en Español.\n"
38 f"Este es el cuerpo de la noticia:\n"
39 f"{body}\n"
40 )
41
42prompt = prompt(headline=headline, body=body)
43
44tokenizer = AutoTokenizer.from_pretrained("Iker/ClickbaitFighter-7B")
45model = AutoModelForCausalLM.from_pretrained(
46 "Iker/ClickbaitFighter-7B", torch_dtype=torch.bfloat16, device_map="auto"
47)
48
49formatted_prompt = tokenizer.apply_chat_template(
50 [{"role": "user", "content": prompt}],
51 tokenize=False,
52 add_generation_prompt=True,
53)
54
55model_inputs = tokenizer(
56 [formatted_prompt], return_tensors="pt", add_special_tokens=False
57)
58
59model_output = model.generate(**model_inputs.to(model.device), generation_config=GenerationConfig(
60 max_new_tokens=32,
61 min_new_tokens=1,
62 do_sample=False,
63 num_beams=1,
64 use_cache=True
65))
66
67summary = tokenizer.batch_decode(model_output,skip_special_tokens=True)[0]
68
69print(summary.strip().split("\n")[-1]) # Get only the summary, without the prompt.
1@misc{noticia2024,
2 title={NoticIA: A Clickbait Article Summarization Dataset in Spanish},
3 author={Iker García-Ferrero and Begoña Altuna},
4 year={2024},
5 eprint={2404.07611},
6 archivePrefix={arXiv},
7 primaryClass={cs.CL}
8}