stojg / recommend
数据挖掘库
Requires
- php: >=5.3.3
Requires (Dev)
This package is auto-updated.
Last update: 2022-12-12 09:20:42 UTC
README
此库应使查找不同事物之间的推荐和相似性变得更简单。我为它开发了一些用例
- 向用户推荐音乐专辑/艺术家列表
- 推荐与用户当前阅读的文章类似的文章
- 找到与另一个用户有相同价值观的其他用户(想想配对 ;)
安装
将此库安装到项目的最简单方法是使用 composer
$ composer require stojg/recommend
使用
假设我们有一些数据,其中用户对音乐艺术家在1到5的范围内进行了评分
$artistRatings = array(
"Abe" => array(
"Blues Traveler" => 3,
"Broken Bells" => 2,
"Norah Jones" => 4,
"Phoenix" => 5,
"Slightly Stoopid" => 1,
"The Strokes" => 2,
"Vampire Weekend" => 2
),
"Blair" => array(
"Blues Traveler" => 2,
"Broken Bells" => 3,
"Deadmau5" => 4,
"Phoenix" => 2,
"Slightly Stoopid" => 3,
"Vampire Weekend" => 3
),
"Clair" => array(
"Blues Traveler" => 5,
"Broken Bells" => 1,
"Deadmau5" => 1,
"Norah Jones" => 3,
"Phoenix" => 5,
"Slightly Stoopid" => 1
)
);
然后我们将这些数据加载到 Data 类中
$data = new \stojg\recommend\Data($artistRatings);
如果我们想找到布莱尔可能喜欢的艺术家,我们执行推荐方法。
$recommendations = $data->recommend('Blair', new \stojg\recommend\strategy\Manhattan());
var_export($recommendations);
该计算的结果将是
array (
0 => array (
'key' => 'Norah Jones',
'value' => 4,
),
1 => array (
'key' => 'The Strokes',
'value' => 2,
)
)
这意味着布莱尔可能喜欢 Norah Jones
而不喜欢 The Strokes
。
推荐器通过在 $artistRatings
中找到与布莱尔评分相似的某人来工作。在这种情况下,结果是艾贝,然后它尝试找到艾贝评分但布莱尔没有评分的艺术家,并将它们作为推荐列表返回。
“最近邻”的查找方式取决于选择哪种策略以及数据集的大小和密度。
数据集
一般来说,数据集越大越好。它必须按照以下格式格式化为数组
array(
'uniqueID' => array(
'objectID' => (int)'rating'
)
);
在先前的艺术家评分示例中
* uniqueID = Blair
* objectID = Music Artist
* rating = an numeric value
策略
目前有三种策略,选择哪种策略取决于数据的组织和填充方式。
曼哈顿
如果数据密集(几乎所有的 objectID
在完整数据集中都有非空评分)并且属性值(评分)的大小很重要,这是一个很好的策略。
即所有用户都对所有音乐艺术家进行了评分,并且他们都在同一尺度上达成一致。
皮尔逊
如果数据密集但评分存在评分膨胀,请使用此策略。
即如果用户A对所有艺术家进行了2-4的评分,而用户B对所有艺术家进行了4-5的评分,此策略试图补偿用户A的2分等于用户B的4分的事实。
余弦
如果数据稀疏,请选择此策略。
即如果有包含一万个艺术家的列表,用户很可能只听了其中的一小部分并对其进行了评分。
文章
提供了一个辅助类,用于推荐与另一篇文章类似的文章。实现相当简单,但它应该会给你一个提示,告诉你如何使用自己的数据集扩展此库。
用法
$articleData = new \stojg\recommend\ArticleData();
$allArticles = getFromDatabase();
foreach($allArticles as $article) {
$articleData->push($article->id, $article->content);
}
$recommendedArticle = $articleData->recommend($articleID = 4);