Test / src /data /clean.py
Архипов Дмитрий
test
565e754
import pandas as pd
def strip_edges_allow_punct(s: str):
allowed_punct = set(".,!?;:-–—") # можно расширять
# Левый указатель — пока не буква/цифра
left = 0
while left < len(s) and not s[left].isalnum():
left += 1
# Правый указатель — пока не буква/цифра/пунктуация
right = len(s) - 1
while right >= 0 and not (s[right].isalnum() or s[right] in allowed_punct):
right -= 1
# Если всё мусор
if right < left:
return ""
return s[left:right+1]
def process_str(s: str):
# Чистка статьи от мусора
s = "\n".join(strip_edges_allow_punct(p) for p in s.split("\n") if p)
for suf in [
"Слушать прямой эфир",
"Читать РБК Стиль в Telegram",
"РБК Events, 18",
"Подписаться | Онлайн-сомелье",
"Читать РБК в Telegram",
"Следить за новостями РБК в Telegram",
"Следить за новостями РБК в МАХ",
"Другие видео этого дня — в телеграм-канале РБК",
"РБК в Telegram и MAX",
"РБК в Telegram | MAX",
"Подписаться на «РБК Спорт",
"Картина дня — в телеграм-канале РБК",
"Самые важные новости — в канале РБК в МАХ",
"Больше инфографики — в телеграм-канале РБК",
"Подписаться на «Сам ты инвестор!",
"Читать РБК Недвижимость в Telegram"
]:
s = s.removesuffix(suf).strip()
parts = [p for p in s.split("\n") if p]
prev_parts = [0] * 1000
while len(prev_parts) != len(parts) and len(parts) != 0:
prev_parts = parts
if "Фото:" in parts[-1] or "Данные:" in parts[-1]:
parts = parts[:-1]
return "\n".join(parts)
def is_advertisement(s: str):
# Проверка рекламных объявлений
last_part = [p for p in s.split("\n") if p][-1]
return any(v in last_part for v in ["Реклама.", "Реклама,"])
def clean_df(df: pd.DataFrame):
df["message_dt"] = pd.to_datetime(df["message_dt"]).dt.date
df["content"] = df["content"].apply(lambda x: process_str(x))
df["views"] = df["views"].astype(int)
df = df[~df["content"].apply(is_advertisement)]
return df[["message_id", "channel_id", "message_dt", "views", "content"]]