From 44f93cfcf2bf286e7765d7e11fe9295f590f53bf Mon Sep 17 00:00:00 2001 From: marslbr Date: Wed, 29 Oct 2025 19:29:19 +0800 Subject: [PATCH] =?UTF-8?q?251029=E6=9B=B4=E6=96=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- 推荐系统/main.py | 51 ++++++++++++++++-------------------------------- 1 file changed, 17 insertions(+), 34 deletions(-) diff --git a/推荐系统/main.py b/推荐系统/main.py index b949b64..d371b5f 100644 --- a/推荐系统/main.py +++ b/推荐系统/main.py @@ -29,10 +29,8 @@ class InitializationArguments(BaseModel): # 时间窗口(单位为天),平衡实时性和运算效率 time_window: int = Field(default=30, ge=5, le=360) - # 衰减因子兰布达系数,控制兴趣分数衰减速率 decay_lambda: float = Field(default=0, ge=0.00, le=10) - # 用户特征向量维度数 attributes_dimensions: int = Field(default=10, ge=2.00, le=200) @@ -42,23 +40,19 @@ class Attributes(BaseModel): # 年龄 age: int = Field(default=..., ge=1, le=99) - # 性别 gender: Literal["male", "female"] = Field(default=...) - # 市 city: str = Field(default=...) - # 职业 occupation: str = Field(default=...) -class Record(BaseModel): - """记录数据模型""" +class AttributesRecord(BaseModel): + """用户属性记录数据模型""" # 用户标识 user: str = Field(default=..., min_length=6, max_length=6) - # 用户属性 attributes: Attributes = Field(default=...) @@ -68,16 +62,12 @@ class BehaviorRecord(BaseModel): # 用户标识 user: str = Field(default=..., min_length=6, max_length=6) - # 时间戳 timestamp: int = Field(default=...) - # 行为类型 type: Literal["rating"] = Field(default=...) - # 物品标识 item: str = Field(default=..., min_length=6, max_length=6) - # 评分 rating: int | None = Field(default=None, ge=1, le=5) @@ -106,48 +96,41 @@ class RecommenderSystem: # 用户行为数据储存对象 self.behaviors = defaultdict( lambda: { - # 兴趣分数列表(时间窗口内由物品标识和兴趣分数组成的字典),为最新兴趣分数,形如{'物品标识': '兴趣分数'} + # 物品兴趣分数 "scores": defaultdict(float), - # 时间戳堆(时间窗口内由时间戳和物品标识组成的元组),例如('时间戳', '物品标识') + # 时间戳最小堆 "timestamps_heap": [], - # 历史物品标识列表(默认最多保存200例历史物品标识,平衡推荐系统实时性和运算效率),形如'物品标识' - "items_history": deque(maxlen=200), + # 历史物品记录 + "history_items": deque(maxlen=200), } ) - # 在计算物品标识-物品标识余弦相似度时可分解为分子部分和分母平方部分并在新增/更新用户行为时增量更新,以优化运算效率 - - # 计算物品标识-物品标识余弦相似度时分子部分 + # 物品相似度时组件 self.items_similarity_numerator = defaultdict(float) - - # 计算物品标识-物品标识余弦相似度时分母平方部分 self.items_similarity_denominator_square = defaultdict(float) - # 物品标识倒排表,形如{'物品标识': ['用户标识']} + # 物品倒排索引 self.items_inversion = defaultdict(list) - # 用户特征向量数据体(基于用户协同过滤的核心数据体,用户属性以独热编码方式保存) + # 用户特征向量数据储存对象 self.attributes = defaultdict(lambda: numpy.zeros(self.attributes_dimensions)) - # 基于LSHash作为用户特征向量索引器(默认哈希值的二进制位数为8,哈希表数为2,哈希矩阵持久化路径) + # 用户特征向量索引器(基于LSHash方法) self.attributes_indexer = LSHash( hash_size=8, input_dim=self.attributes_dimensions, num_hashtables=2 ) - # 处理用户属性记录 - def process_attribute_record(self, attribute_record: dict): + def process_attributes_record(self, attributes_record: dict) -> bool: + """处理用户属性记录""" - # 校验设置记录数据模型 - attribute_record = SettingRecord(**attribute_record).model_dump() + # 校验并解析用户属性记录 + attributes_record = AttributesRecord(**attributes_record).model_dump() - user = attribute_record.get("user") + user = attributes_record.get("user") - for key, value in attribute_record.get("attributes").items(): - - # 若用户属性值非空 + # 若用户属性值非空则更新用户属性 + for key, value in attributes_record.get("attributes").items(): if value: - - # 更新用户属性 self.behaviors[user]["attributes"][key] = value return True