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