251029更新

This commit is contained in:
marslbr 2025-10-29 19:29:19 +08:00
parent c2229eebc7
commit 44f93cfcf2
1 changed files with 17 additions and 34 deletions

View File

@ -29,10 +29,8 @@ class InitializationArguments(BaseModel):
# 时间窗口(单位为天),平衡实时性和运算效率 # 时间窗口(单位为天),平衡实时性和运算效率
time_window: int = Field(default=30, ge=5, le=360) time_window: int = Field(default=30, ge=5, le=360)
# 衰减因子兰布达系数,控制兴趣分数衰减速率 # 衰减因子兰布达系数,控制兴趣分数衰减速率
decay_lambda: float = Field(default=0, ge=0.00, le=10) decay_lambda: float = Field(default=0, ge=0.00, le=10)
# 用户特征向量维度数 # 用户特征向量维度数
attributes_dimensions: int = Field(default=10, ge=2.00, le=200) 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) age: int = Field(default=..., ge=1, le=99)
# 性别 # 性别
gender: Literal["male", "female"] = Field(default=...) gender: Literal["male", "female"] = Field(default=...)
# 市 # 市
city: str = Field(default=...) city: str = Field(default=...)
# 职业 # 职业
occupation: str = Field(default=...) occupation: str = Field(default=...)
class Record(BaseModel): class AttributesRecord(BaseModel):
"""记录数据模型""" """用户属性记录数据模型"""
# 用户标识 # 用户标识
user: str = Field(default=..., min_length=6, max_length=6) user: str = Field(default=..., min_length=6, max_length=6)
# 用户属性 # 用户属性
attributes: Attributes = Field(default=...) attributes: Attributes = Field(default=...)
@ -68,16 +62,12 @@ class BehaviorRecord(BaseModel):
# 用户标识 # 用户标识
user: str = Field(default=..., min_length=6, max_length=6) user: str = Field(default=..., min_length=6, max_length=6)
# 时间戳 # 时间戳
timestamp: int = Field(default=...) timestamp: int = Field(default=...)
# 行为类型 # 行为类型
type: Literal["rating"] = Field(default=...) type: Literal["rating"] = Field(default=...)
# 物品标识 # 物品标识
item: str = Field(default=..., min_length=6, max_length=6) item: str = Field(default=..., min_length=6, max_length=6)
# 评分 # 评分
rating: int | None = Field(default=None, ge=1, le=5) rating: int | None = Field(default=None, ge=1, le=5)
@ -106,48 +96,41 @@ class RecommenderSystem:
# 用户行为数据储存对象 # 用户行为数据储存对象
self.behaviors = defaultdict( self.behaviors = defaultdict(
lambda: { lambda: {
# 兴趣分数列表(时间窗口内由物品标识和兴趣分数组成的字典),为最新兴趣分数,形如{'物品标识': '兴趣分数'} # 物品兴趣分数
"scores": defaultdict(float), "scores": defaultdict(float),
# 时间戳(时间窗口内由时间戳和物品标识组成的元组),例如('时间戳', '物品标识') # 时间戳最小
"timestamps_heap": [], "timestamps_heap": [],
# 历史物品标识列表默认最多保存200例历史物品标识平衡推荐系统实时性和运算效率形如'物品标识' # 历史物品记录
"items_history": deque(maxlen=200), "history_items": deque(maxlen=200),
} }
) )
# 在计算物品标识-物品标识余弦相似度时可分解为分子部分和分母平方部分并在新增/更新用户行为时增量更新,以优化运算效率 # 物品相似度时组件
# 计算物品标识-物品标识余弦相似度时分子部分
self.items_similarity_numerator = defaultdict(float) self.items_similarity_numerator = defaultdict(float)
# 计算物品标识-物品标识余弦相似度时分母平方部分
self.items_similarity_denominator_square = defaultdict(float) self.items_similarity_denominator_square = defaultdict(float)
# 物品标识倒排表,形如{'物品标识': ['用户标识']} # 物品倒排索引
self.items_inversion = defaultdict(list) self.items_inversion = defaultdict(list)
# 用户特征向量数据体(基于用户协同过滤的核心数据体,用户属性以独热编码方式保存) # 用户特征向量数据储存对象
self.attributes = defaultdict(lambda: numpy.zeros(self.attributes_dimensions)) self.attributes = defaultdict(lambda: numpy.zeros(self.attributes_dimensions))
# 基于LSHash作为用户特征向量索引器默认哈希值的二进制位数为8哈希表数为2哈希矩阵持久化路径 # 用户特征向量索引器基于LSHash方法
self.attributes_indexer = LSHash( self.attributes_indexer = LSHash(
hash_size=8, input_dim=self.attributes_dimensions, num_hashtables=2 hash_size=8, input_dim=self.attributes_dimensions, num_hashtables=2
) )
# 处理用户属性记录 def process_attributes_record(self, attributes_record: dict) -> bool:
def process_attribute_record(self, attribute_record: dict): """处理用户属性记录"""
# 校验设置记录数据模型 # 校验并解析用户属性记录
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: if value:
# 更新用户属性
self.behaviors[user]["attributes"][key] = value self.behaviors[user]["attributes"][key] = value
return True return True