【问题标题】:Algorithms for matching based on keywords intersection基于关键字交集的匹配算法
【发布时间】:2011-07-05 18:40:50
【问题描述】:

假设我们有买家和卖家试图在市场上找到对方。买家可以用关键字标记他们的需求;卖家可以对他们销售的东西做同样的事情。我有兴趣找到根据卖家的两个关键字集根据卖家与特定买家的相关性对卖家进行排名的算法。

这是一个例子:

buyer_keywords = {"furry", "four legs", "likes catnip", "has claws"} 

然后我们需要根据相关性对两个潜在卖家进行排序:

seller_keywords[1] = {"furry", "four legs", "arctic circle", "white"}
seller_keywords[2] = {"likes catnip", "furry", 
                      "hates mice", "yarn-lover", "whiskers"}

如果我们只使用关键字的交集,我们不会得到太多的区分:两者都在 2 个关键字上相交。如果我们将交集计数除以集合并集的大小,卖家 2 实际上做得更差,因为关键字数量更多。这似乎为任何不纠正关键字集大小的方法引入了自动惩罚(我们绝对不想惩罚添加关键字)。

为了让问题更加结构化,假设我们对关键字属性的强度有一些真实的衡量标准(每个卖家的总和必须为 1),例如:

seller_keywords[1] = {"furry":.05, 
                      "four legs":.05, 
                      "arctic circle":.8, 
                      "white":.1}

seller_keywords[2] = {"likes catnip":.5, 
                      "furry":.4, 
                      "hates mice":.02, 
                      "yarn-lover":.02, 
                      "whiskers":.06}

现在我们可以总结命中的价值:所以现在卖家 1 的得分仅为 0.1,而卖家 2 的得分为 0.9。到目前为止,一切都很好,但现在我们可能会得到第三个卖家,他们的关键字集非常有限,没有描述性:

seller_keywords[3] = {"furry":1}

这会将他们推到顶部,因为他们唯一的关键字受到任何点击,这并不好。

无论如何,我的猜测(和希望)是这是一个相当普遍的问题,并且存在具有已知优势和局限性的不同算法解决方案。这可能是 CS101 中涵盖的内容,所以我认为这个问题的一个好的答案可能只是指向相关参考资料的链接。

【问题讨论】:

  • 我认为我们应该将有效分数乘以匹配关键字的数量。例如,在您的第二个例子中,我们只有 1 个匹配项,它的分数为 1,因此有效分数为 1*1 =1。但在我发现两个匹配的情况下,我们的有效分数是 2*1=2 。因此它被选中了。你对这种方法有什么看法。

标签: algorithm e-commerce keyword matching cosine-similarity


【解决方案1】:

我认为您希望使用 cosine similarity;这是一项基本技术,可以让您在第一次 hack 中走得更远。直观地说,你创建了一个向量,你知道的每个标签都有一个特定的索引:

terms[0] --> aardvark
terms[1] --> anteater
...
terms[N] --> zuckerberg

然后你在这个空间中为每个人创建向量:

person1[0] = 0     # this person doesn't care about aardvarks
person1[1] = 0.05  # this person cares a bit about anteaters
...
person1[N] = 0

现在每个人都是这个 N 维空间中的一个向量。然后,您可以使用余弦相似度来计算它们之间的相似度。计算上,这与求两个向量之间的夹角基本相同。您需要一个接近 1 的余弦,这意味着向量大致共线——它们在大多数维度上具有相似的值。

要改进此指标,您可能需要对向量中的元素使用tf-idf 加权。 Tf-idf 将淡化流行术语(例如“iPhone”)的重要性,并提升与此人特别相关的不流行术语的重要性。

将 tf-idf 加权和余弦相似度结合起来对于大多数此类应用程序来说效果很好。

【讨论】:

  • 余弦相似度并不能解决{"furry":1} 的最后一个问题,但也许您可以使用实际的点积来代替这样做(即取两个归一化向量的点积)。未能使买方标准化并不重要,因为它将相同的比例因子应用于所有结果,并且它们的排名仍然相同。未能规范卖家意味着您可以根据其他一些标准对卖家进行加权,而不仅仅是他们的关键字列表的重点。举个简单的例子,您可以限制任何一个关键字的强度,因此只列出一个关键字的卖家的量级
【解决方案2】:

您要查找的内容称为分类法。标记内容并按相关顺序对其进行排序。

您可能找不到一些现成的算法,但您可以从一个实际案例开始:Drupal documentation for taxonomy 提供了一些指导,并查看search module 的来源。

基本上,排名是基于术语的频率。如果使用少量标签定义产品,它们将具有更大的权重。仅出现在少数产品页面上的标签意味着它非常具体。你不应该以静态的方式定义你的话的强度;但会在它们的上下文中检查它们。

问候

【讨论】:

  • 这似乎更像是一个解决问题的特定库,而不是解决问题的算法或数学框架。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多