Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Add articles clickbait_score as factor in final feed ordering #20493

Merged
merged 4 commits into from
Jan 5, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
1 change: 1 addition & 0 deletions app/controllers/concerns/api/articles_controller.rb
Original file line number Diff line number Diff line change
Expand Up @@ -151,6 +151,7 @@ def article_params
:published_at
]
allowed_params << :organization_id if params.dig("article", "organization_id") && allowed_to_change_org_id?
allowed_params << :clickbait_score if @user.super_admin?
params.require(:article).permit(allowed_params)
end

Expand Down
1 change: 1 addition & 0 deletions app/models/article.rb
Original file line number Diff line number Diff line change
Expand Up @@ -178,6 +178,7 @@ def self.unique_url_error
validates :video_source_url, url: { allow_blank: true, schemes: ["https"] }
validates :video_state, inclusion: { in: %w[PROGRESSING COMPLETED] }, allow_nil: true
validates :video_thumbnail_url, url: { allow_blank: true, schemes: %w[https http] }
validates :clickbait_score, numericality: { greater_than_or_equal_to: 0.0, less_than_or_equal_to: 1.0 }
validate :future_or_current_published_at, on: :create
validate :correct_published_at?, on: :update, unless: :admin_update

Expand Down
10 changes: 9 additions & 1 deletion app/models/articles/feeds.rb
Original file line number Diff line number Diff line change
Expand Up @@ -92,7 +92,15 @@ def self.lever_catalog
order_by_lever(:final_order_by_feed_success_score,
label: "Order by feed success score",
order_by_fragment: "articles.feed_success_score DESC")

order_by_lever(:final_order_by_feed_success_score_minus_clickbait_score,
label: "Order by feed success score minus clickbait score",
order_by_fragment: "articles.feed_success_score - articles.clickbait_score DESC")
order_by_lever(:final_order_by_feed_success_score_minus_half_of_clickbait_score,
label: "Order by feed success score minus half of clickbait score",
order_by_fragment: "articles.feed_success_score - (articles.clickbait_score / 2) DESC")
order_by_lever(:final_order_by_feed_success_score_minus_one_tenth_of_clickbait_score,
label: "Order by feed success score minus one tenth of clickbait score",
order_by_fragment: "articles.feed_success_score - (articles.clickbait_score / 10) DESC")
order_by_lever(:final_order_by_feed_success_score_and_primary_score,
label: "Order by feed success score and primary score",
order_by_fragment: "((articles.feed_success_score + 0.01) * (articles.score / 10)) DESC")
Expand Down
2 changes: 1 addition & 1 deletion app/services/articles/attributes.rb
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
module Articles
class Attributes
ATTRIBUTES = %i[archived body_markdown canonical_url description
edited_at main_image organization_id user_id published
edited_at main_image organization_id user_id published clickbait_score
title video_thumbnail_url published_at co_author_ids_list].freeze

attr_reader :attributes, :article_user
Expand Down
146 changes: 146 additions & 0 deletions config/feed-variants/20240104-variant-a.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,146 @@
{
"max_days_since_published": 15,
"description": "Built off 20231127-variant-c but minus clickbait score for final order.",
"order_by": "final_order_by_feed_success_score_minus_clickbait_score",
"reseed_randomizer_on_each_request": false,
"levers": {
"daily_decay": {
"cases": [
[0, 1],
[1, 0.99],
[2, 0.905],
[3, 0.7],
[4, 0.6],
[5, 0.5],
[6, 0.3],
[7, 0.2],
[8, 0.02],
[9, 0.01],
[10, 0.009],
[11, 0.008],
[12, 0.007],
[13, 0.006],
[14, 0.0025]
],
"fallback": 0.01
},
"comments_count": {
"cases": [
[0, 0.15],
[1, 0.3],
[2, 0.66],
[3, 0.7],
[4, 0.75],
[5, 0.8],
[6, 0.85],
[7, 0.88],
[8, 0.9],
[9, 0.92],
[12, 1.0],
[18, 1.0],
[22, 1.0],
[25, 1.0],
[30, 1.0],
[35, 1.0],
[40, 1.0],
[45, 1.0]
],
"fallback": 0.99
},
"following_author": {
"cases": [
[0, 0.7],
[1, 1]
],
"fallback": 0.7
},
"featured_article": { "cases": [[1, 1]], "fallback": 0.15 },
"matching_negative_tags_intersection_count": {
"cases": [
[0, 1],
[1, 0.2],
[2, 0.15],
[3, 0.1],
[4, 0.05]
],
"fallback": 0
},
"experience": {
"cases": [
[0, 1],
[1, 0.97],
[2, 0.95],
[3, 0.88],
[4, 0.77],
[5, 0.55],
[6, 0.35],
[7, 0.3]
],
"default_user_experience_level": 5,
"fallback": 0.2
},
"matching_positive_tags_intersection_count": {
"cases": [
[0, 0.001],
[1, 0.97]
],
"fallback": 1
},
"matching_positive_tags_intersection_points": {
"cases": [
[0, 0.01],
[1, 0.45],
[2, 0.5],
[3, 0.7],
[4, 0.75],
[5, 0.8],
[6, 0.85],
[7, 0.9],
[8, 0.93],
[9, 0.95]
],
"fallback": 1
},
"privileged_user_reaction": {
"cases": [
[-1, 0.2],
[1, 1]
],
"fallback": 0.95,
"negative_reaction_threshold": -9,
"positive_reaction_threshold": 4
},
"public_reactions_score": {
"cases": [
[0, 0.3],
[1, 0.4],
[2, 0.45],
[3, 0.5],
[4, 0.55],
[5, 0.6],
[6, 0.61],
[7, 0.62],
[8, 0.7],
[9, 0.8],
[10, 0.85],
[11, 0.9],
[12, 0.95]
],
"fallback": 1.0
},
"language_match": {
"cases": [
[0, 0.1],
[1, 1]
],
"fallback": 1
},
"recommended_articles_match": {
"cases": [
[0, 0.001],
[1, 1]
],
"fallback": 1
}
}
}
146 changes: 146 additions & 0 deletions config/feed-variants/20240104-variant-b.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,146 @@
{
"max_days_since_published": 15,
"description": "Built off 20231127-variant-c but minus clickbait score.",
"order_by": "final_order_by_feed_success_score_minus_clickbait_score",
"reseed_randomizer_on_each_request": false,
"levers": {
"daily_decay": {
"cases": [
[0, 1],
[1, 0.99],
[2, 0.905],
[3, 0.7],
[4, 0.6],
[5, 0.5],
[6, 0.3],
[7, 0.2],
[8, 0.02],
[9, 0.01],
[10, 0.009],
[11, 0.008],
[12, 0.007],
[13, 0.006],
[14, 0.0025]
],
"fallback": 0.01
},
"comments_count": {
"cases": [
[0, 0.15],
[1, 0.3],
[2, 0.66],
[3, 0.7],
[4, 0.75],
[5, 0.8],
[6, 0.85],
[7, 0.88],
[8, 0.9],
[9, 0.92],
[12, 1.0],
[18, 1.0],
[22, 1.0],
[25, 1.0],
[30, 1.0],
[35, 1.0],
[40, 1.0],
[45, 1.0]
],
"fallback": 0.99
},
"following_author": {
"cases": [
[0, 0.7],
[1, 1]
],
"fallback": 0.7
},
"featured_article": { "cases": [[1, 1]], "fallback": 0.15 },
"matching_negative_tags_intersection_count": {
"cases": [
[0, 1],
[1, 0.2],
[2, 0.15],
[3, 0.1],
[4, 0.05]
],
"fallback": 0
},
"experience": {
"cases": [
[0, 1],
[1, 0.97],
[2, 0.95],
[3, 0.88],
[4, 0.77],
[5, 0.55],
[6, 0.35],
[7, 0.3]
],
"default_user_experience_level": 5,
"fallback": 0.2
},
"matching_positive_tags_intersection_count": {
"cases": [
[0, 0.001],
[1, 0.97]
],
"fallback": 1
},
"matching_positive_tags_intersection_points": {
"cases": [
[0, 0.01],
[1, 0.45],
[2, 0.5],
[3, 0.7],
[4, 0.75],
[5, 0.8],
[6, 0.85],
[7, 0.9],
[8, 0.93],
[9, 0.95]
],
"fallback": 1
},
"privileged_user_reaction": {
"cases": [
[-1, 0.2],
[1, 1]
],
"fallback": 0.95,
"negative_reaction_threshold": -9,
"positive_reaction_threshold": 4
},
"public_reactions_score": {
"cases": [
[0, 0.3],
[1, 0.4],
[2, 0.45],
[3, 0.5],
[4, 0.55],
[5, 0.6],
[6, 0.61],
[7, 0.62],
[8, 0.7],
[9, 0.8],
[10, 0.85],
[11, 0.9],
[12, 0.95]
],
"fallback": 1.0
},
"language_match": {
"cases": [
[0, 0.1],
[1, 1]
],
"fallback": 1
},
"recommended_articles_match": {
"cases": [
[0, 0.001],
[1, 1]
],
"fallback": 1
}
}
}