File size: 2,340 Bytes
e6e7585
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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
from underthesea import word_tokenize
import re

# Một số từ cảm xúc / miêu tả sản phẩm thường gặp 
SENTIMENT_KEYWORDS = {
    "tệ", "xấu", "dở", "kém", "chán", "đắt", "lừa", "giả", "thất vọng",
    "tuyệt", "đẹp", "xịn", "rẻ", "ổn", "tốt", "ngon", "chất lượng",
    "ok", "hài lòng", "ưng", "đáng tiền", "cực kỳ", "quá", "rất", "hơi",
    "ghê", "gớm", "xấu", "dễ thương", "xịn sò", "xịn xò", "thích",
    "ghét", "chán", "mệt", "vui", "buồn", "tuyệt vời", "đáng mua", "khuyên dùng"
}

# Một số viết tắt phổ biến trong review
ABBREVIATIONS = {
    "ko": "không", "k": "không", "khum": "không", "hok": "không",
    "đc": "được", "dc": "được", "okie": "ok", "ok": "ok",
    "sp": "sản phẩm", "tp": "thành phần", "nv": "nhân viên",
    "gt": "giá tiền", "mn": "mọi người", "rep": "trả lời", "rat": "rất"
}

def preprocess_text(text: str) -> str:
    """Tiền xử lý tiếng Việt tập trung cho sentiment & mô tả sản phẩm."""
    text = text.strip().lower()

    # Xóa link, mention, hashtag
    text = re.sub(r"http\S+|www\S+|@\w+|#\w+", " ", text)

    # Loại bỏ ký tự không phải chữ (trừ dấu câu cơ bản)
    text = re.sub(r"[^a-zàáạảãâầấậẩẫăằắặẳẵèéẹẻẽêềếệểễ"
                  r"ìíịỉĩòóọỏõôồốộổỗơờớợởỡùúụủũưừứựửữ"
                  r"ỳýỵỷỹđ\s\!\?\.]", " ", text)

    # Chuẩn hóa khoảng trắng
    text = re.sub(r"\s+", " ", text)

    # Chuẩn hóa từ viết tắt
    words = text.split()
    words = [ABBREVIATIONS.get(w, w) for w in words]
    text = " ".join(words)

    segmented = word_tokenize(text, format="text")

    # Giữ lại các từ quan trọng cho cảm xúc
    tokens = segmented.split()
    filtered = [
        w for w in tokens
        if len(w) > 1 and (
            w in SENTIMENT_KEYWORDS or
            re.match(r"[a-zàáạảãâầấậẩẫăằắặẳẵèéẹẻẽêềếệểễìíịỉĩòóọỏõôồốộổỗơờớợởỡùúụủũưừứựửữỳýỵỷỹđ]", w)
        )
    ]

    return " ".join(filtered)