File size: 2,693 Bytes
565e754
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
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"]]