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)
# 衰减因子兰布达系数,控制兴趣分数衰减速率
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