|
|
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"]] |
|
|
|