251029更新
This commit is contained in:
parent
c2229eebc7
commit
44f93cfcf2
51
推荐系统/main.py
51
推荐系统/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
|
||||
|
|
|
|||
Loading…
Reference in New Issue