the-algorithm/src/scala/com/twitter/timelines/prediction/features/common/CombinedFeatures.scala

537 lines
23 KiB
Scala

package com.twitter.timelines.prediction.features.common
import com.twitter.dal.personal_data.thriftjava.PersonalDataType._
import com.twitter.ml.api.Feature
import com.twitter.ml.api.FeatureType
import com.twitter.ml.api.Feature.Binary
import java.lang.{Boolean => JBoolean}
import scala.collection.JavaConverters._
object CombinedFeatures {
val IS_CLICKED =
new Binary("timelines.engagement.is_clicked", Set(TweetsClicked, EngagementsPrivate).asJava)
val IS_DWELLED =
new Binary("timelines.engagement.is_dwelled", Set(TweetsViewed, EngagementsPrivate).asJava)
val IS_DWELLED_IN_BOUNDS_V1 = new Binary(
"timelines.engagement.is_dwelled_in_bounds_v1",
Set(TweetsViewed, EngagementsPrivate).asJava)
val IS_FAVORITED = new Binary(
"timelines.engagement.is_favorited",
Set(PublicLikes, PrivateLikes, EngagementsPrivate, EngagementsPublic).asJava)
val IS_FOLLOWED = new Binary(
"timelines.engagement.is_followed",
Set(EngagementsPrivate, EngagementsPublic, Follow).asJava)
val IS_IMPRESSED =
new Binary("timelines.engagement.is_impressed", Set(TweetsViewed, EngagementsPrivate).asJava)
val IS_OPEN_LINKED = new Binary(
"timelines.engagement.is_open_linked",
Set(EngagementsPrivate, LinksClickedOn).asJava)
val IS_PHOTO_EXPANDED = new Binary(
"timelines.engagement.is_photo_expanded",
Set(MediaEngagementActivities, EngagementsPrivate).asJava)
val IS_PROFILE_CLICKED = new Binary(
"timelines.engagement.is_profile_clicked",
Set(ProfilesViewed, ProfilesClicked, EngagementsPrivate).asJava)
val IS_QUOTED = new Binary(
"timelines.engagement.is_quoted",
Set(PublicRetweets, PrivateRetweets, EngagementsPrivate, EngagementsPublic).asJava)
val IS_REPLIED = new Binary(
"timelines.engagement.is_replied",
Set(PublicReplies, PrivateReplies, EngagementsPrivate, EngagementsPublic).asJava)
val IS_RETWEETED = new Binary(
"timelines.engagement.is_retweeted",
Set(PublicRetweets, PrivateRetweets, EngagementsPrivate, EngagementsPublic).asJava)
val IS_RETWEETED_WITHOUT_QUOTE = new Binary(
"timelines.enagagement.is_retweeted_without_quote",
Set(PublicRetweets, PrivateRetweets, EngagementsPrivate, EngagementsPublic).asJava)
val IS_SHARE_DM_CLICKED =
new Binary("timelines.engagement.is_tweet_share_dm_clicked", Set(EngagementsPrivate).asJava)
val IS_SHARE_DM_SENT =
new Binary("timelines.engagement.is_tweet_share_dm_sent", Set(EngagementsPrivate).asJava)
val IS_VIDEO_PLAYBACK_25 = new Binary(
"timelines.engagement.is_video_playback_25",
Set(MediaEngagementActivities, EngagementsPrivate).asJava)
val IS_VIDEO_PLAYBACK_50 = new Binary(
"timelines.engagement.is_video_playback_50",
Set(MediaEngagementActivities, EngagementsPrivate).asJava)
val IS_VIDEO_PLAYBACK_75 = new Binary(
"timelines.engagement.is_video_playback_75",
Set(MediaEngagementActivities, EngagementsPrivate).asJava)
val IS_VIDEO_PLAYBACK_95 = new Binary(
"timelines.engagement.is_video_playback_95",
Set(MediaEngagementActivities, EngagementsPrivate).asJava)
val IS_VIDEO_PLAYBACK_COMPLETE = new Binary(
"timelines.engagement.is_video_playback_complete",
Set(MediaEngagementActivities, EngagementsPrivate).asJava)
val IS_VIDEO_PLAYBACK_START = new Binary(
"timelines.engagement.is_video_playback_start",
Set(MediaEngagementActivities, EngagementsPrivate).asJava)
val IS_VIDEO_VIEWED = new Binary(
"timelines.engagement.is_video_viewed",
Set(MediaEngagementActivities, EngagementsPrivate).asJava)
val IS_VIDEO_QUALITY_VIEWED = new Binary(
"timelines.engagement.is_video_quality_viewed",
Set(MediaEngagementActivities, EngagementsPrivate).asJava
)
// v1: post click engagements: fav, reply
val IS_GOOD_CLICKED_CONVO_DESC_V1 = new Binary(
"timelines.engagement.is_good_clicked_convo_desc_favorited_or_replied",
Set(
TweetsClicked,
PublicLikes,
PrivateLikes,
PublicReplies,
PrivateReplies,
EngagementsPrivate,
EngagementsPublic).asJava)
// v2: post click engagements: click
val IS_GOOD_CLICKED_CONVO_DESC_V2 = new Binary(
"timelines.engagement.is_good_clicked_convo_desc_v2",
Set(TweetsClicked, EngagementsPrivate).asJava)
val IS_GOOD_CLICKED_WITH_DWELL_SUM_GTE_60S = new Binary(
"timelines.engagement.is_good_clicked_convo_desc_favorited_or_replied_or_dwell_sum_gte_60_secs",
Set(
TweetsClicked,
PublicLikes,
PrivateLikes,
PublicReplies,
PrivateReplies,
EngagementsPrivate,
EngagementsPublic).asJava)
val IS_GOOD_CLICKED_CONVO_DESC_FAVORITED = new Binary(
"timelines.engagement.is_good_clicked_convo_desc_favorited",
Set(PublicLikes, PrivateLikes, EngagementsPrivate, EngagementsPublic).asJava)
val IS_GOOD_CLICKED_CONVO_DESC_REPLIED = new Binary(
"timelines.engagement.is_good_clicked_convo_desc_replied",
Set(PublicReplies, PrivateReplies, EngagementsPrivate, EngagementsPublic).asJava)
val IS_GOOD_CLICKED_CONVO_DESC_RETWEETED = new Binary(
"timelines.engagement.is_good_clicked_convo_desc_retweeted",
Set(PublicRetweets, PrivateRetweets, EngagementsPrivate, EngagementsPublic).asJava)
val IS_GOOD_CLICKED_CONVO_DESC_CLICKED = new Binary(
"timelines.engagement.is_good_clicked_convo_desc_clicked",
Set(TweetsClicked, EngagementsPrivate).asJava)
val IS_GOOD_CLICKED_CONVO_DESC_FOLLOWED = new Binary(
"timelines.engagement.is_good_clicked_convo_desc_followed",
Set(EngagementsPrivate).asJava)
val IS_GOOD_CLICKED_CONVO_DESC_SHARE_DM_CLICKED = new Binary(
"timelines.engagement.is_good_clicked_convo_desc_share_dm_clicked",
Set(EngagementsPrivate).asJava)
val IS_GOOD_CLICKED_CONVO_DESC_PROFILE_CLICKED = new Binary(
"timelines.engagement.is_good_clicked_convo_desc_profile_clicked",
Set(EngagementsPrivate).asJava)
val IS_GOOD_CLICKED_CONVO_DESC_UAM_GT_0 = new Binary(
"timelines.engagement.is_good_clicked_convo_desc_uam_gt_0",
Set(EngagementsPrivate, EngagementsPublic).asJava)
val IS_GOOD_CLICKED_CONVO_DESC_UAM_GT_1 = new Binary(
"timelines.engagement.is_good_clicked_convo_desc_uam_gt_1",
Set(EngagementsPrivate, EngagementsPublic).asJava)
val IS_GOOD_CLICKED_CONVO_DESC_UAM_GT_2 = new Binary(
"timelines.engagement.is_good_clicked_convo_desc_uam_gt_2",
Set(EngagementsPrivate, EngagementsPublic).asJava)
val IS_GOOD_CLICKED_CONVO_DESC_UAM_GT_3 = new Binary(
"timelines.engagement.is_good_clicked_convo_desc_uam_gt_3",
Set(EngagementsPrivate, EngagementsPublic).asJava)
val IS_TWEET_DETAIL_DWELLED = new Binary(
"timelines.engagement.is_tweet_detail_dwelled",
Set(TweetsClicked, EngagementsPrivate).asJava)
val IS_TWEET_DETAIL_DWELLED_8_SEC = new Binary(
"timelines.engagement.is_tweet_detail_dwelled_8_sec",
Set(TweetsClicked, EngagementsPrivate).asJava)
val IS_TWEET_DETAIL_DWELLED_15_SEC = new Binary(
"timelines.engagement.is_tweet_detail_dwelled_15_sec",
Set(TweetsClicked, EngagementsPrivate).asJava)
val IS_TWEET_DETAIL_DWELLED_25_SEC = new Binary(
"timelines.engagement.is_tweet_detail_dwelled_25_sec",
Set(TweetsClicked, EngagementsPrivate).asJava)
val IS_TWEET_DETAIL_DWELLED_30_SEC = new Binary(
"timelines.engagement.is_tweet_detail_dwelled_30_sec",
Set(TweetsClicked, EngagementsPrivate).asJava)
val IS_PROFILE_DWELLED = new Binary(
"timelines.engagement.is_profile_dwelled",
Set(ProfilesViewed, ProfilesClicked, EngagementsPrivate).asJava)
val IS_PROFILE_DWELLED_10_SEC = new Binary(
"timelines.engagement.is_profile_dwelled_10_sec",
Set(ProfilesViewed, ProfilesClicked, EngagementsPrivate).asJava)
val IS_PROFILE_DWELLED_20_SEC = new Binary(
"timelines.engagement.is_profile_dwelled_20_sec",
Set(ProfilesViewed, ProfilesClicked, EngagementsPrivate).asJava)
val IS_PROFILE_DWELLED_30_SEC = new Binary(
"timelines.engagement.is_profile_dwelled_30_sec",
Set(ProfilesViewed, ProfilesClicked, EngagementsPrivate).asJava)
val IS_FULLSCREEN_VIDEO_DWELLED = new Binary(
"timelines.engagement.is_fullscreen_video_dwelled",
Set(MediaEngagementActivities, EngagementTypePrivate, EngagementsPrivate).asJava)
val IS_FULLSCREEN_VIDEO_DWELLED_5_SEC = new Binary(
"timelines.engagement.is_fullscreen_video_dwelled_5_sec",
Set(MediaEngagementActivities, EngagementTypePrivate, EngagementsPrivate).asJava)
val IS_FULLSCREEN_VIDEO_DWELLED_10_SEC = new Binary(
"timelines.engagement.is_fullscreen_video_dwelled_10_sec",
Set(MediaEngagementActivities, EngagementTypePrivate, EngagementsPrivate).asJava)
val IS_FULLSCREEN_VIDEO_DWELLED_20_SEC = new Binary(
"timelines.engagement.is_fullscreen_video_dwelled_20_sec",
Set(MediaEngagementActivities, EngagementTypePrivate, EngagementsPrivate).asJava)
val IS_FULLSCREEN_VIDEO_DWELLED_30_SEC = new Binary(
"timelines.engagement.is_fullscreen_video_dwelled_30_sec",
Set(MediaEngagementActivities, EngagementTypePrivate, EngagementsPrivate).asJava)
val IS_LINK_DWELLED_15_SEC = new Binary(
"timelines.engagement.is_link_dwelled_15_sec",
Set(MediaEngagementActivities, EngagementTypePrivate, EngagementsPrivate).asJava)
val IS_LINK_DWELLED_30_SEC = new Binary(
"timelines.engagement.is_link_dwelled_30_sec",
Set(MediaEngagementActivities, EngagementTypePrivate, EngagementsPrivate).asJava)
val IS_LINK_DWELLED_60_SEC = new Binary(
"timelines.engagement.is_link_dwelled_60_sec",
Set(MediaEngagementActivities, EngagementTypePrivate, EngagementsPrivate).asJava)
val IS_HOME_LATEST_VISITED =
new Binary("timelines.engagement.is_home_latest_visited", Set(EngagementsPrivate).asJava)
val IS_BOOKMARKED =
new Binary("timelines.engagement.is_bookmarked", Set(EngagementsPrivate).asJava)
val IS_SHARED =
new Binary("timelines.engagement.is_shared", Set(EngagementsPrivate).asJava)
val IS_SHARE_MENU_CLICKED =
new Binary("timelines.engagement.is_share_menu_clicked", Set(EngagementsPrivate).asJava)
// Negative engagements
val IS_DONT_LIKE = new Binary("timelines.engagement.is_dont_like", Set(EngagementsPrivate).asJava)
val IS_BLOCK_CLICKED = new Binary(
"timelines.engagement.is_block_clicked",
Set(Blocks, TweetsClicked, EngagementsPrivate, EngagementsPublic).asJava)
val IS_BLOCK_DIALOG_BLOCKED = new Binary(
"timelines.engagement.is_block_dialog_blocked",
Set(Blocks, EngagementsPrivate, EngagementsPublic).asJava)
val IS_MUTE_CLICKED = new Binary(
"timelines.engagement.is_mute_clicked",
Set(Mutes, TweetsClicked, EngagementsPrivate).asJava)
val IS_MUTE_DIALOG_MUTED =
new Binary("timelines.engagement.is_mute_dialog_muted", Set(Mutes, EngagementsPrivate).asJava)
val IS_REPORT_TWEET_CLICKED = new Binary(
"timelines.engagement.is_report_tweet_clicked",
Set(TweetsClicked, EngagementsPrivate).asJava)
val IS_CARET_CLICKED =
new Binary("timelines.engagement.is_caret_clicked", Set(EngagementsPrivate).asJava)
val IS_NOT_ABOUT_TOPIC =
new Binary("timelines.engagement.is_not_about_topic", Set(EngagementsPrivate).asJava)
val IS_NOT_RECENT =
new Binary("timelines.engagement.is_not_recent", Set(EngagementsPrivate).asJava)
val IS_NOT_RELEVANT =
new Binary("timelines.engagement.is_not_relevant", Set(EngagementsPrivate).asJava)
val IS_SEE_FEWER =
new Binary("timelines.engagement.is_see_fewer", Set(EngagementsPrivate).asJava)
val IS_UNFOLLOW_TOPIC =
new Binary("timelines.engagement.is_unfollow_topic", Set(EngagementsPrivate).asJava)
val IS_FOLLOW_TOPIC =
new Binary("timelines.engagement.is_follow_topic", Set(EngagementsPrivate).asJava)
val IS_NOT_INTERESTED_IN_TOPIC =
new Binary("timelines.engagement.is_not_interested_in_topic", Set(EngagementsPrivate).asJava)
val IS_NEGATIVE_FEEDBACK =
new Binary("timelines.engagement.is_negative_feedback", Set(EngagementsPrivate).asJava)
val IS_IMPLICIT_POSITIVE_FEEDBACK_UNION =
new Binary(
"timelines.engagement.is_implicit_positive_feedback_union",
Set(EngagementsPrivate).asJava)
val IS_EXPLICIT_POSITIVE_FEEDBACK_UNION =
new Binary(
"timelines.engagement.is_explicit_positive_feedback_union",
Set(EngagementsPrivate).asJava)
val IS_ALL_NEGATIVE_FEEDBACK_UNION =
new Binary(
"timelines.engagement.is_all_negative_feedback_union",
Set(EngagementsPrivate).asJava)
// Reciprocal engagements for reply forward engagement
val IS_REPLIED_REPLY_IMPRESSED_BY_AUTHOR = new Binary(
"timelines.engagement.is_replied_reply_impressed_by_author",
Set(EngagementsPrivate).asJava)
val IS_REPLIED_REPLY_FAVORITED_BY_AUTHOR = new Binary(
"timelines.engagement.is_replied_reply_favorited_by_author",
Set(EngagementsPrivate, EngagementsPublic, PrivateLikes, PublicLikes).asJava)
val IS_REPLIED_REPLY_QUOTED_BY_AUTHOR = new Binary(
"timelines.engagement.is_replied_reply_quoted_by_author",
Set(EngagementsPrivate, EngagementsPublic, PrivateRetweets, PublicRetweets).asJava)
val IS_REPLIED_REPLY_REPLIED_BY_AUTHOR = new Binary(
"timelines.engagement.is_replied_reply_replied_by_author",
Set(EngagementsPrivate, EngagementsPublic, PrivateReplies, PublicReplies).asJava)
val IS_REPLIED_REPLY_RETWEETED_BY_AUTHOR = new Binary(
"timelines.engagement.is_replied_reply_retweeted_by_author",
Set(EngagementsPrivate, EngagementsPublic, PrivateRetweets, PublicRetweets).asJava)
val IS_REPLIED_REPLY_BLOCKED_BY_AUTHOR = new Binary(
"timelines.engagement.is_replied_reply_blocked_by_author",
Set(Blocks, EngagementsPrivate, EngagementsPublic).asJava)
val IS_REPLIED_REPLY_FOLLOWED_BY_AUTHOR = new Binary(
"timelines.engagement.is_replied_reply_followed_by_author",
Set(EngagementsPrivate, EngagementsPublic, Follow).asJava)
val IS_REPLIED_REPLY_UNFOLLOWED_BY_AUTHOR = new Binary(
"timelines.engagement.is_replied_reply_unfollowed_by_author",
Set(EngagementsPrivate, EngagementsPublic).asJava)
val IS_REPLIED_REPLY_MUTED_BY_AUTHOR = new Binary(
"timelines.engagement.is_replied_reply_muted_by_author",
Set(Mutes, EngagementsPrivate).asJava)
val IS_REPLIED_REPLY_REPORTED_BY_AUTHOR = new Binary(
"timelines.engagement.is_replied_reply_reported_by_author",
Set(EngagementsPrivate).asJava)
// Reciprocal engagements for fav forward engagement
val IS_FAVORITED_FAV_FAVORITED_BY_AUTHOR = new Binary(
"timelines.engagement.is_favorited_fav_favorited_by_author",
Set(EngagementsPrivate, EngagementsPublic, PrivateLikes, PublicLikes).asJava
)
val IS_FAVORITED_FAV_REPLIED_BY_AUTHOR = new Binary(
"timelines.engagement.is_favorited_fav_replied_by_author",
Set(EngagementsPrivate, EngagementsPublic, PrivateReplies, PublicReplies).asJava
)
val IS_FAVORITED_FAV_RETWEETED_BY_AUTHOR = new Binary(
"timelines.engagement.is_favorited_fav_retweeted_by_author",
Set(EngagementsPrivate, EngagementsPublic, PrivateRetweets, PublicRetweets).asJava
)
val IS_FAVORITED_FAV_FOLLOWED_BY_AUTHOR = new Binary(
"timelines.engagement.is_favorited_fav_followed_by_author",
Set(EngagementsPrivate, EngagementsPublic).asJava
)
// define good profile click by considering following engagements (follow, fav, reply, retweet, etc.) at profile page
val IS_PROFILE_CLICKED_AND_PROFILE_FOLLOW = new Binary(
"timelines.engagement.is_profile_clicked_and_profile_follow",
Set(ProfilesViewed, ProfilesClicked, EngagementsPrivate, Follow).asJava)
val IS_PROFILE_CLICKED_AND_PROFILE_FAV = new Binary(
"timelines.engagement.is_profile_clicked_and_profile_fav",
Set(ProfilesViewed, ProfilesClicked, EngagementsPrivate, PrivateLikes, PublicLikes).asJava)
val IS_PROFILE_CLICKED_AND_PROFILE_REPLY = new Binary(
"timelines.engagement.is_profile_clicked_and_profile_reply",
Set(ProfilesViewed, ProfilesClicked, EngagementsPrivate, PrivateReplies, PublicReplies).asJava)
val IS_PROFILE_CLICKED_AND_PROFILE_RETWEET = new Binary(
"timelines.engagement.is_profile_clicked_and_profile_retweet",
Set(
ProfilesViewed,
ProfilesClicked,
EngagementsPrivate,
PrivateRetweets,
PublicRetweets).asJava)
val IS_PROFILE_CLICKED_AND_PROFILE_TWEET_CLICK = new Binary(
"timelines.engagement.is_profile_clicked_and_profile_tweet_click",
Set(ProfilesViewed, ProfilesClicked, EngagementsPrivate, TweetsClicked).asJava)
val IS_PROFILE_CLICKED_AND_PROFILE_SHARE_DM_CLICK = new Binary(
"timelines.engagement.is_profile_clicked_and_profile_share_dm_click",
Set(ProfilesViewed, ProfilesClicked, EngagementsPrivate).asJava)
// This derived label is the union of all binary features above
val IS_PROFILE_CLICKED_AND_PROFILE_ENGAGED = new Binary(
"timelines.engagement.is_profile_clicked_and_profile_engaged",
Set(ProfilesViewed, ProfilesClicked, EngagementsPrivate, EngagementsPublic).asJava)
// define bad profile click by considering following engagements (user report, tweet report, mute, block, etc) at profile page
val IS_PROFILE_CLICKED_AND_PROFILE_USER_REPORT_CLICK = new Binary(
"timelines.engagement.is_profile_clicked_and_profile_user_report_click",
Set(ProfilesViewed, ProfilesClicked, EngagementsPrivate).asJava)
val IS_PROFILE_CLICKED_AND_PROFILE_TWEET_REPORT_CLICK = new Binary(
"timelines.engagement.is_profile_clicked_and_profile_tweet_report_click",
Set(ProfilesViewed, ProfilesClicked, EngagementsPrivate).asJava)
val IS_PROFILE_CLICKED_AND_PROFILE_MUTE = new Binary(
"timelines.engagement.is_profile_clicked_and_profile_mute",
Set(ProfilesViewed, ProfilesClicked, EngagementsPrivate).asJava)
val IS_PROFILE_CLICKED_AND_PROFILE_BLOCK = new Binary(
"timelines.engagement.is_profile_clicked_and_profile_block",
Set(ProfilesViewed, ProfilesClicked, EngagementsPrivate).asJava)
// This derived label is the union of bad profile click engagements and existing negative feedback
val IS_NEGATIVE_FEEDBACK_V2 = new Binary(
"timelines.engagement.is_negative_feedback_v2",
Set(ProfilesViewed, ProfilesClicked, EngagementsPrivate).asJava)
val IS_NEGATIVE_FEEDBACK_UNION = new Binary(
"timelines.engagement.is_negative_feedback_union",
Set(ProfilesViewed, ProfilesClicked, EngagementsPrivate).asJava)
// don't like, mute or profile page -> mute
val IS_WEAK_NEGATIVE_FEEDBACK = new Binary(
"timelines.engagement.is_weak_negative_feedback",
Set(ProfilesViewed, ProfilesClicked, EngagementsPrivate).asJava)
// report, block or profile page -> report, block
val IS_STRONG_NEGATIVE_FEEDBACK = new Binary(
"timelines.engagement.is_strong_negative_feedback",
Set(ProfilesViewed, ProfilesClicked, EngagementsPrivate).asJava)
// engagement for following user from any surface area
val IS_FOLLOWED_FROM_ANY_SURFACE_AREA = new Binary(
"timelines.engagement.is_followed_from_any_surface_area",
Set(EngagementsPublic, EngagementsPrivate).asJava)
val IS_RELEVANCE_PROMPT_YES_CLICKED = new Binary(
"timelines.engagement.is_relevance_prompt_yes_clicked",
Set(EngagementsPublic, EngagementsPrivate).asJava)
// Reply downvote engagements
val IS_REPLY_DOWNVOTED =
new Binary("timelines.engagement.is_reply_downvoted", Set(EngagementsPrivate).asJava)
val IS_REPLY_DOWNVOTE_REMOVED =
new Binary("timelines.engagement.is_reply_downvote_removed", Set(EngagementsPrivate).asJava)
/**
* Contains all engagements that are used/consumed by real-time
* aggregates summingbird jobs. These engagements need to be
* extractable from [[ClientEvent]].
*/
val EngagementsRealTime: Set[Feature[JBoolean]] = Set(
IS_CLICKED,
IS_DWELLED,
IS_FAVORITED,
IS_FOLLOWED,
IS_OPEN_LINKED,
IS_PHOTO_EXPANDED,
IS_PROFILE_CLICKED,
IS_QUOTED,
IS_REPLIED,
IS_RETWEETED,
IS_RETWEETED_WITHOUT_QUOTE,
IS_SHARE_DM_CLICKED,
IS_SHARE_DM_SENT,
IS_VIDEO_PLAYBACK_50,
IS_VIDEO_VIEWED,
IS_VIDEO_QUALITY_VIEWED
)
val NegativeEngagementsRealTime: Set[Feature[JBoolean]] = Set(
IS_REPORT_TWEET_CLICKED,
IS_BLOCK_CLICKED,
IS_MUTE_CLICKED
)
val NegativeEngagementsRealTimeDontLike: Set[Feature[JBoolean]] = Set(
IS_DONT_LIKE
)
val NegativeEngagementsSecondary: Set[Feature[JBoolean]] = Set(
IS_NOT_INTERESTED_IN_TOPIC,
IS_NOT_ABOUT_TOPIC,
IS_NOT_RECENT,
IS_NOT_RELEVANT,
IS_SEE_FEWER,
IS_UNFOLLOW_TOPIC
)
val PrivateEngagements: Set[Feature[JBoolean]] = Set(
IS_CLICKED,
IS_DWELLED,
IS_OPEN_LINKED,
IS_PHOTO_EXPANDED,
IS_PROFILE_CLICKED,
IS_QUOTED,
IS_VIDEO_PLAYBACK_50,
IS_VIDEO_QUALITY_VIEWED
)
val ImpressedEngagements: Set[Feature[JBoolean]] = Set(
IS_IMPRESSED
)
val PrivateEngagementsV2: Set[Feature[JBoolean]] = Set(
IS_CLICKED,
IS_OPEN_LINKED,
IS_PHOTO_EXPANDED,
IS_PROFILE_CLICKED,
IS_VIDEO_PLAYBACK_50,
IS_VIDEO_QUALITY_VIEWED
) ++ ImpressedEngagements
val CoreEngagements: Set[Feature[JBoolean]] = Set(
IS_FAVORITED,
IS_REPLIED,
IS_RETWEETED
)
val DwellEngagements: Set[Feature[JBoolean]] = Set(
IS_DWELLED
)
val PrivateCoreEngagements: Set[Feature[JBoolean]] = Set(
IS_CLICKED,
IS_OPEN_LINKED,
IS_PHOTO_EXPANDED,
IS_VIDEO_PLAYBACK_50,
IS_VIDEO_QUALITY_VIEWED
)
val ConditionalEngagements: Set[Feature[JBoolean]] = Set(
IS_GOOD_CLICKED_CONVO_DESC_V1,
IS_GOOD_CLICKED_CONVO_DESC_V2,
IS_GOOD_CLICKED_WITH_DWELL_SUM_GTE_60S
)
val ShareEngagements: Set[Feature[JBoolean]] = Set(
IS_SHARED,
IS_SHARE_MENU_CLICKED
)
val BookmarkEngagements: Set[Feature[JBoolean]] = Set(
IS_BOOKMARKED
)
val TweetDetailDwellEngagements: Set[Feature[JBoolean]] = Set(
IS_TWEET_DETAIL_DWELLED,
IS_TWEET_DETAIL_DWELLED_8_SEC,
IS_TWEET_DETAIL_DWELLED_15_SEC,
IS_TWEET_DETAIL_DWELLED_25_SEC,
IS_TWEET_DETAIL_DWELLED_30_SEC
)
val ProfileDwellEngagements: Set[Feature[JBoolean]] = Set(
IS_PROFILE_DWELLED,
IS_PROFILE_DWELLED_10_SEC,
IS_PROFILE_DWELLED_20_SEC,
IS_PROFILE_DWELLED_30_SEC
)
val FullscreenVideoDwellEngagements: Set[Feature[JBoolean]] = Set(
IS_FULLSCREEN_VIDEO_DWELLED,
IS_FULLSCREEN_VIDEO_DWELLED_5_SEC,
IS_FULLSCREEN_VIDEO_DWELLED_10_SEC,
IS_FULLSCREEN_VIDEO_DWELLED_20_SEC,
IS_FULLSCREEN_VIDEO_DWELLED_30_SEC
)
// Please do not add new engagements here until having estimated the impact
// to capacity requirements. User-author real-time aggregates have a very
// large key space.
val UserAuthorEngagements: Set[Feature[JBoolean]] = CoreEngagements ++ DwellEngagements ++ Set(
IS_CLICKED,
IS_PROFILE_CLICKED,
IS_PHOTO_EXPANDED,
IS_VIDEO_PLAYBACK_50,
IS_NEGATIVE_FEEDBACK_UNION
)
val ImplicitPositiveEngagements: Set[Feature[JBoolean]] = Set(
IS_CLICKED,
IS_DWELLED,
IS_OPEN_LINKED,
IS_PROFILE_CLICKED,
IS_QUOTED,
IS_VIDEO_PLAYBACK_50,
IS_VIDEO_QUALITY_VIEWED,
IS_TWEET_DETAIL_DWELLED,
IS_GOOD_CLICKED_CONVO_DESC_V1,
IS_GOOD_CLICKED_CONVO_DESC_V2,
IS_SHARED,
IS_SHARE_MENU_CLICKED,
IS_SHARE_DM_SENT,
IS_SHARE_DM_CLICKED
)
val ExplicitPositiveEngagements: Set[Feature[JBoolean]] = CoreEngagements ++ Set(
IS_FOLLOWED,
IS_QUOTED
)
val AllNegativeEngagements: Set[Feature[JBoolean]] =
NegativeEngagementsRealTime ++ NegativeEngagementsRealTimeDontLike ++ Set(
IS_NOT_RECENT,
IS_NOT_RELEVANT,
IS_SEE_FEWER
)
}