我正在为电影构建基于内容的推荐系统。 我这样做的方法是首先将电影信息转换为稀疏矢量。对于类型,演员,制作人等信息,我使用二进制表示 - 电影中是否存在项目。对于标题和绘图,我计算TF-IDF并获得一个稀疏的术语权重向量。
之后,我通过将用户评分与电影矢量配置文件相结合来计算用户配置文件:将具有正评级的电影数据向量相加并减去具有负评级的电影数据向量。
然后最后一步是计算用户配置文件和所有其他电影之间的相似性。
我分离了所有的特征向量(类型的单独向量,为演员,标题等分开),这样我就可以调整相似性更重要的权重。
private val titleWeight = 0.5
private val plotWeight = 0.5
private val actorsWeight = 1
private val genresWeight = 0.8
private val directorsWeight = 0.3
private val writersWeight = 0.3
private val productionsWeight = 0.2
private val decadeWeight = 0.2
private val countriesWeight = 0.05
我尝试过使用余弦相似度来比较用户资料和电影资料。但是存在一个问题 - 与其他相似之处相比,情节和标题相似性总是产生非常低的值,即使用户实际上已经对具有相似标题/情节的电影进行评级。
这可能是因为用户配置文件绘图矢量,例如,一旦用户评价多部电影,就会有很多值。并且通过将点乘积除以输入向量的乘积长度(如果我正确地进行)来计算余弦相似度。或者,基本上,取归一化向量的点积。 因此,比方说,轮廓图矢量将具有500个TF * IDF值 - 在我的情况下,每个值在1到10之间。与电影情节矢量的交集可能通常在最多5个位置发生(5个术语将在当前电影和已评级的电影中共同出现)。在常识中,这似乎是一个很大的交集。这些情节应该被认为是相似的。但余弦相似性会给出一个值,比如0.02 ......
虽然类型/演员/制作等在交叉点的情况下会产生更大的值。
我尝试以各种方式调整权重,我也尝试使用点积而不是余弦相似度来标题和情节。但这只会产生值得的结果..
现在我在思考 - 我做错了什么。我怎样才能将Title和Plot的相似性与我的其他相似之处相提并论。
很抱歉这篇长篇文章。