news_verification / src /application /content_generation.py
pmkhanh7890's picture
refactor code + fix bug of label after grouping url
00b1038
raw
history blame
4.63 kB
import json
from typing import Optional
import openai
import pandas as pd
from src.application.config import (
AZUREOPENAI_CLIENT,
GPT_IMAGE_MODEL,
)
def generate_fake_text(
text_generation_model: str,
title: str = None,
content: str = None,
) -> tuple[str, str]:
"""
Generates fake news title and content using an Azure OpenAI model.
Args:
text_generation_model: The name of the Azure OpenAI model to use.
title: Optional title to use as context for fake text generation.
content: Optional content to use as context for fake text generation.
Returns:
A tuple containing the generated fake title and content (both strings).
Returns empty strings if generation fails.
"""
# Generate text using the selected models
prompt = """Generate a random fake news tittle in this format:
---
# Title: [Fake Title]
# Content:
[Fake Content]
---
"""
if title and content:
prompt += """base on the following context:
# Title: {news_title}:\n# Content: {news_content}"""
elif title:
prompt += """base on the following context:
# Title: {news_title}:\n"""
elif content:
prompt += """base on the following context:
# Content: {news_content}"""
# Generate text using the text generation model
# Generate text using the selected model
try:
response = AZUREOPENAI_CLIENT.chat.completions.create(
model=text_generation_model,
messages=[{"role": "system", "content": prompt}],
)
print(
"Response from OpenAI API: ",
response.choices[0].message.content,
)
fake_text = response.choices[0].message.content
except openai.OpenAIError as e:
print(f"Error interacting with OpenAI API: {e}")
fake_text = ""
if fake_text != "":
fake_title, fake_content = extract_title_content(fake_text)
return fake_title, fake_content
def extract_title_content(fake_news: str) -> tuple[str, str]:
"""
Extracts the title and content from the generated fake text.
Args:
fake_news: The generated fake text string.
Returns:
A tuple containing the extracted title and content.
"""
title = ""
content = ""
try:
# Extract the title and content from the generated fake news
title_start = fake_news.find("# Title: ") + len("# Title: ")
title_end = fake_news.find("\n", title_start)
if title_start != -1 and title_end != -1:
title = fake_news[title_start:title_end] # .strip()
title_start = fake_news.find("\n# Content: ") + len(
"\n# Content: ",
)
content = fake_news[title_start:].strip()
except Exception as e:
print(f"Error extracting title and content: {e}")
return title, content
def generate_fake_image(
title: str,
model: str = GPT_IMAGE_MODEL,
) -> Optional[str]:
"""
Generates a fake image URL using Azure OpenAI's image generation API.
Args:
title: The title to use as a prompt for image generation.
model: The name of the Azure OpenAI image generation model to use.
Returns:
The URL of the generated image, or None if an error occurs.
"""
try:
if title:
image_prompt = f"Generate a random image about {title}"
else:
image_prompt = "Generate a random image"
result = AZUREOPENAI_CLIENT.images.generate(
model=model,
prompt=image_prompt,
n=1,
)
image_url = json.loads(result.model_dump_json())["data"][0]["url"]
return image_url
except Exception as e:
print(f"Error generating fake image: {e}")
return None # Return None if an error occurs
def replace_text(
news_title: str,
news_content: str,
replace_df: pd.DataFrame,
) -> tuple[str, str]:
"""
Replaces occurrences in the input title and content
based on the provided DataFrame.
Args:
news_title: The input news title.
news_content: The input news content.
replace_df: A DataFrame with two columns:
"Find what:" and "Replace with:".
Returns:
A tuple containing the modified news title and content.
"""
for _, row in replace_df.iterrows():
find_what = row["Find what:"]
replace_with = row["Replace with:"]
news_content = news_content.replace(find_what, replace_with)
news_title = news_title.replace(find_what, replace_with)
return news_title, news_content