news_verification / src /application /formatting_ordinary_user.py
pmkhanh7890's picture
fix bug of showing forensic
5842223
raw
history blame
3.6 kB
from pandas import DataFrame
from src.application.config import WORD_BREAK
from src.application.image.helper import encode_image
from src.application.image.image import ImageDetector
from src.application.text.helper import replace_leading_spaces
from src.application.text.text import TextDetector
def create_ordinary_user_table(
aligned_sentences_df: DataFrame,
text: TextDetector,
image: ImageDetector,
) -> str:
"""
Creates an HTML table comparing input news with source news
for ordinary users.
Args:
aligned_sentences_df (DataFrame): Aligned sentence data.
text (TextDetector): Text comparison data.
image (ImageDetector): Image comparison data.
Returns:
A string representing the HTML table.
"""
rows = []
if image.input is not None:
rows.append(format_image_ordinary_user_row(image))
if text.input is not None:
rows.append(format_text_ordinary_user_row(aligned_sentences_df, text))
table = "\n".join(rows)
return f"""
<h5>Comparison between input news and source news:</h5>
<table border="1" style="width:100%; text-align:left;">
<col style="width: 340px;">
<col style="width: 30px;">
<col style="width: 75px;">
<thead>
<tr>
<th>Input news</th>
<th>Forensic</th>
<th>Originality</th>
</tr>
</thead>
<tbody>
{table}
</tbody>
</table>
"""
def format_text_ordinary_user_row(
aligned_sentences_df,
text,
) -> str:
"""
Formats a row for the text in the ordinary user table.
Args:
aligned_sentences_df (DataFrame): Aligned sentence data.
text (TextDetector): Text comparison data.
Returns:
A string representing the HTML table row for the text.
"""
input_sentences = ""
source_text_html = ""
urls = []
for _, row in aligned_sentences_df.iterrows():
if row["input"] is None:
continue
input_sentences += replace_leading_spaces(row["input"]) + "<br>"
url = row["url"]
if url not in urls:
urls.append(url)
source_text_html += f"""<a href="{url}">{url}</a><br>"""
return f"""
<tr>
<td>{input_sentences}</td>
<td>{text.prediction_label[0]}<br>
({text.prediction_score[0] * 100:.2f}%)</td>
<td style="{WORD_BREAK}";>{source_text_html}</td>
</tr>
"""
def format_image_ordinary_user_row(image: ImageDetector) -> str:
"""
Formats a row for the image in the ordinary user table.
Args:
image: Image comparison data.
Returns:
A string representing the HTML table row for the image.
"""
if image.input is None:
return ""
# Put image, label, and score into html tag
if image.referent_url is not None or image.referent_url != "":
if "http" in image.input:
input_image = (
f"""<a href="{image.input}">{image.input}</a>""" # noqa: E501
)
else:
base64_image = encode_image(image.input)
input_image = f"""<img src="data:image/jpeg;base64,{base64_image}" width="100" height="150">""" # noqa: E501
source_image_html = f"""<a href="{image.referent_url}">{image.referent_url}</a>""" # noqa: E501
else:
source_image_html = ""
return f"""
<tr>
<td>{input_image}</td>
<td>{image.prediction_label}<br>({image.prediction_score:.2f}%)</td>
<td style="{WORD_BREAK}";>{source_image_html}</td>
</tr>
"""