↓ Chuyển đến nội dung chính

Content Ranking Metrics SEO

Thuật toán xếp hạng nội dung: những tín hiệu ngoài lượt xem và lượt thích

Thuật toán xếp hạng nội dung (content ranking) làm gì, vì sao chỉ xếp theo lượt xem và lượt thích thì bài nổi càng thêm nổi, và những tín hiệu nào đáng gộp vào một điểm số chung.

Thuật toán xếp hạng nội dung: những tín hiệu ngoài lượt xem và lượt thích

Thuật toán xếp hạng nội dung (content ranking algorithm) là thứ quyết định một bảng tin (feed), một trang kết quả tìm kiếm hay một danh sách “bài nổi bật” sẽ hiện cái gì trước, cái gì sau. Nó chấm cho mỗi nội dung một điểm số dựa trên nhiều tín hiệu (người dùng phản ứng với nội dung ra sao, bản thân nội dung thế nào, mới và liên quan đến đâu), rồi sắp xếp theo điểm số đó. Nhưng nếu chỉ xếp hạng theo lượt xem và lượt thích, bạn sẽ rơi vào vòng lặp “giàu càng thêm giàu”: bài nào nằm trên cùng thì được nhiều người thấy, nên gom thêm lượt xem và lượt thích, nên lại tiếp tục nằm trên cùng.

Đó chính là khuyết điểm dễ thấy của lượt xem và lượt bình chọn (upvote): chúng chỉ thưởng cho những gì vốn đã nổi. Nội dung mới thì chết đói dưới đáy bảng tin, và dần dần nền tảng biến thành một kênh chiếu lại. Ở chỗ tôi làm, xếp hạng bảng tin cho tốt là một trong những bài toán khó mà ít ai để ý, nên tôi đã dành khá nhiều thời gian nghĩ xem còn những tín hiệu nào khác đáng tin.

Nhìn vào việc người ta làm, đừng chỉ nhìn chỗ họ bấm
#

Người dùng hiếm khi chủ động góp ý, mà có góp ý thì cũng thiên lệch; ngược lại, dữ liệu hành vi thì có rất nhiều. Thời gian ở lại trang và độ sâu cuộn cho biết người ta có đọc thật hay bỏ đi ngay sau đoạn đầu. Lượt quay lại còn tốt hơn nữa — quay lại đọc một bài là lời khen mạnh hơn bất kỳ lượt bình chọn nào. Còn thoát ra nhanh là một tín hiệu tiêu cực đáng giá: nội dung đã hứa hẹn một điều mà người đọc không nhận được.

Tín hiệu nằm sẵn trong chính nội dung
#

Nội dung tốt không phải lúc nào cũng gom được lượt thích ngay từ đầu, nhưng thường nó thể hiện chất lượng theo những cách khác. Tính mới là một — bài này có nói về điều gì mà nền tảng chưa từng có không? Cấu trúc là một yếu tố nữa; trình bày gọn gàng, ngữ pháp ổn và diễn đạt rõ ràng đi đôi với chất lượng nhiều hơn ta muốn thừa nhận. Lịch sử của tác giả cũng là một điểm xuất phát hợp lý, miễn là xét theo khả năng giữ chân người đọc của các bài cũ chứ không phải số lượt thích thô. Bình luận sớm cũng có ích: ba bình luận tích cực thật lòng đáng giá hơn ba mươi lượt bình chọn bấm theo phản xạ, và chỉ cần phân tích ngữ nghĩa một chút là đã có thể đánh dấu những nội dung lấp được khoảng trống mà nền tảng đang thiếu.

Mượn tín hiệu từ bên ngoài
#

Internet rộng lớn ngoài kia cho bạn biết cái gì đang được quan tâm ngay lúc này. Nội dung khớp với những từ khoá tìm kiếm đang lên thì đã có sẵn độ liên quan, và bài nào đăng nhanh về một chủ đề đang nóng thì xứng đáng được đẩy lên. Những gì đang rôm rả trên Twitter hay Reddit thường là bản xem trước cho những gì người dùng của bạn sẽ muốn tiếp theo — chỉ cần dự đoán một chút, bạn có thể đẩy nội dung mới phù hợp lên trước khi con sóng tới, thay vì chạy theo sau. Ô tìm kiếm ngay trên nền tảng của bạn cũng hay bị đánh giá thấp: nếu người dùng cứ tìm mãi một chủ đề, hay một bài đều đặn kéo lưu lượng truy cập (traffic) từ công cụ tìm kiếm về, thì đó là độ liên quan mà bạn chẳng cần phải đoán.

Gộp các tín hiệu thành một điểm số
#

Dưới đây là ý tưởng đó viết thành vài dòng Python. Đây chỉ là ví dụ minh họa, không phải một hệ thống chạy thật trên môi trường production. Mỗi tín hiệu được chuẩn hóa (normalise) về khoảng 0 đến 1 để tín hiệu nào có con số thô lớn cũng không lấn át phần còn lại, tổng có trọng số gộp chúng thành một điểm duy nhất, và hệ số suy giảm theo thời gian (time decay) cho bài mới một cơ hội sòng phẳng để cạnh tranh với bài “hot” của tháng trước.

WEIGHTS = {"read_depth": 0.3, "revisits": 0.25, "quality": 0.25, "early_comments": 0.2}
HALF_LIFE_HOURS = 48  # a post loses half its score every two days

def normalise(values):
    lo, hi = min(values), max(values)
    return [(v - lo) / (hi - lo) if hi > lo else 0.0 for v in values]

def rank(items):
    """items: dicts holding raw signal values plus "age_hours"."""
    norm = {name: normalise([item[name] for item in items]) for name in WEIGHTS}
    scores = []
    for i, item in enumerate(items):
        base = sum(weight * norm[name][i] for name, weight in WEIGHTS.items())
        scores.append(base * 0.5 ** (item["age_hours"] / HALF_LIFE_HOURS))
    order = sorted(range(len(items)), key=lambda i: scores[i], reverse=True)
    return [items[i] for i in order]

Các trọng số chỉ là phỏng đoán cho tới khi những thử nghiệm ở phần dưới chứng minh điều ngược lại. Lượt xem và lượt thích vẫn có thể đưa vào; chỉ là chúng trở thành một đầu vào trong số nhiều đầu vào, chứ không còn là toàn bộ điểm số. Chu kỳ bán rã (half-life) quyết định bài cũ chìm xuống nhanh đến đâu, và đó là cả một chủ đề riêng: tôi đã viết kỹ về nó trong bài thuật toán xếp hạng bảng tin quyết định khi nào bài cũ bị dìm xuống. Các hệ thống thật thường để mô hình tự học trọng số thay vì chọn bằng tay, nhưng hình dạng thì vẫn vậy: nhiều tín hiệu đi vào, một con số đi ra, rồi sắp xếp.

Rồi kiểm thử cho sòng phẳng
#

Tín hiệu có khéo đến đâu cũng phải đem đi thử nghiệm A/B (A/B test) — cho một nhóm nhỏ người dùng xem nội dung mới rồi so mức tương tác với những bài đang giữ vị trí. Và để ý xem nội dung lan ra thế nào: lượt chia sẻ, lượt nhắc đến và lượt nhúng, cả trong lẫn ngoài nền tảng, nói lên giá trị nhiều hơn hẳn cái bộ đếm lượt xem.

Không chỉ số đơn lẻ nào trụ nổi khi va chạm với thực tế. Những cách xếp hạng thật sự hiệu quả đều pha trộn hành vi người dùng, chất lượng nội tại, tính thời sự và những thử nghiệm sòng phẳng, và không tín hiệu nào được quyền quyết định sau cùng.