Spaces:
Sleeping
Sleeping
| 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"]] | |