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)
|
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
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue