假设我们有买家和卖家试图在市场中找到对方。买家可以用关键字标记他们的需求;卖家也可以为他们卖的东西做同样的事情。我有兴趣根据两个关键字集找到根据特定买方的相关性对卖家进行排名的算法。
以下是一个例子:
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实际上会因为关键字数量更多而变得更糟。这似乎会为任何不纠正关键字集大小的方法引入自动惩罚(我们绝对不想惩罚添加关键字)。
为了对问题采取更多结构,假设我们对关键字属性的强度有一些真实的衡量标准(每个卖家必须加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只获得.1的得分,而卖家2的得分为.9。到目前为止,这么好,但现在我们可能会得到第三个卖家,其中包含非常有限的非描述性关键字集:
seller_keywords[3] = {"furry":1}
对于他们唯一关键字的任何点击,这会将他们弹到顶部,这是不好的。
无论如何,我的猜测(和希望)是这是一个相当普遍的问题,并且存在具有已知优势和局限性的不同算法解决方案。这可能是CS101中涵盖的内容,所以我认为这个问题的一个好答案可能只是相关参考文献的链接。
答案 0 :(得分:8)
我认为您希望使用cosine similarity;它是一种基本技术,可以让你成为第一个黑客。直观地,您创建一个向量,其中您知道的每个标记都有一个特定的索引:
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加权和余弦相似性对于大多数此类应用都很有用。
答案 1 :(得分:0)
您正在寻找的是分类。标记内容并按相关性顺序排序。
您可能找不到一些随时可用的算法,但您可以从实际案例开始:Drupal documentation for taxonomy提供一些指导原则,并检查search module的来源。
基本上,排名基于术语的频率。如果使用少量标签定义产品,则它们将具有更多权重。仅出现在少数产品页面上的标签意味着它非常具体。你不应该用静态方式定义你的词的强度;但在他们的背景下检查它们。
此致