计算MySQL中记录之间的相似性

时间:2013-11-02 20:00:11

标签: mysql

我目前正试图弄清楚如何计算两个记录之间的相似性。我的第一张唱片是来自停用的广告 - 所以我想找到例如关于某些VARCHAR字段相等性的10个最相似的广告。

我无法弄清楚的是,如果有任何MySQL函数,可以以任何方式帮助我 - 或者我是否需要以某种奇怪的方式比较字符串?

编辑#1

相似性将由以下字段定义:

  • 标题(重量:50%)

  • 内容(重量:40%)

  • 类别(重量:10%)

编辑#2

我希望计算结果如下:

标题:标题字段中匹配的单词(仅匹配单词> 2个字母)。

描述:标题字段中匹配的单词(仅匹配单词> 2个字母)。

Catgory:匹配类别,如果不匹配,则匹配父类别且权重较小:)

这个等式可能是:

  

#1是旧的非活动帖子,#2是活跃帖子:

     

#2标题在#2的总共10个单词中的3个单词中匹配#1标题。   这样可以获得30%的匹配= 30分。

     

#2描述匹配#2总共10个单词中的#1描述   400字。这给出了4%的匹配= 4分。

     

#2类别与#1类别不匹配,因此0%匹配。那   得0分。

     

然后总和将是#2的34分。 :)

编辑#3

这是我的查询 - 但它不会返回不同的行,而是返回相同的行。

SELECT
            a.AdvertisementID as A_AdvertisementID,
            IF(a.Topic LIKE a2.Topic, 50, 0) + IF(a.Description LIKE a2.Description, 40, 0) + IF(a.Cate_CategoryID LIKE a2.Cate_CategoryID, 10, 0) as A_Score,
            a.AdvertisementID as A_AdvertisementID,
            a.Topic as A_Topic,
            LEFT(a.Description, 300) as A_Description,
            a.Price as A_Price,
            a.Type as A_Type
        FROM
            ".DB_PREFIX."A_Advertisements a2,
            ".DB_PREFIX."A_Advertisements a
        WHERE
            a2.AdvertisementID <> a.AdvertisementID
            AND
            a.AdvertisementID = :a_id
        ORDER BY
            A_Score DESC

1 个答案:

答案 0 :(得分:2)

如果您可以逐字比较您感兴趣的字段,您可以让MySQL使用IF()函数执行简单的评分计算,例如

select 
  foo.id,
  if (foo.title='wantedtitle', 50, 0) +
  if (foo.content='wantedcontent', 40, 0) +
  if (foo.category='wantedcategory', 10, 0) as score
from foo
order by score desc
limit 10

使用类似

可以实现基本的“找到片段”
select 
  foo.id,
  if (foo.title like '%wantedtitlefragment%', 50, 0) +
  if (foo.content like '%wantedcontentfragment%', 40, 0) +
  if (foo.category like '%wantedcategoryfragment%', 10, 0) as score
from foo
order by score desc
limit 10

还有其他技术,但它们在MySQL中实现起来可能很慢。例如,您可以计算两个字符串之间的Levenstein distance - 有关示例实现,请参阅this post