You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

如何在MySQL中使用Levenshtein函数查找标题相似的文章

关于用Levenshtein实现文章标题相似匹配的问题解答

嘿,我来帮你把这些问题拆解清楚~

1. Levenshtein距离是否适合匹配完整文章标题?

当然可以!Levenshtein距离(也就是编辑距离)本质是计算两个字符串之间通过插入、删除、替换字符变成彼此所需的最少操作次数,不管是单个单词还是完整的标题语句都能适用。

不过有个小细节要注意:如果两个标题的长度差异很大,直接看编辑距离的绝对值可能不太好判断相似程度。这时候可以把它转换成相对相似度,公式大概是:1 - 编辑距离 / max(两个标题的长度),这样得到的数值在0到1之间,越接近1就说明两个标题越相似,用起来更直观。

2. 你给出的SQL版Levenshtein函数怎么用?

这段代码是MySQL的自定义函数,首先你得把它导入到你的数据库里——可以通过MySQL命令行、phpMyAdmin或者其他数据库管理工具执行这段创建函数的SQL语句。创建成功后,就能直接在查询里调用了:

举个例子,假设你有个articles表,里面存着文章的title字段,现在想找和「PHP开发实战指南」相似的标题,就可以这么写查询:

SELECT 
  title, 
  LEVENSHTEIN(title, 'PHP开发实战指南') AS edit_distance,
  1 - LEVENSHTEIN(title, 'PHP开发实战指南')/GREATEST(CHAR_LENGTH(title), CHAR_LENGTH('PHP开发实战指南')) AS similarity
FROM articles
ORDER BY edit_distance ASC;

这个查询会返回所有文章标题的编辑距离和相似度,并且按编辑距离从小到大排序——也就是越相似的标题会排在前面。

3. PHP开发的网站,有哪些合适的库/方案推荐?

PHP本身就有不少好用的方案,不用额外折腾复杂的库:

  • PHP内置函数:PHP自带了levenshtein()函数,直接就能用!比如:
    $targetTitle = "PHP开发实战指南";
    $compareTitle = "PHP实战开发指南";
    
    $distance = levenshtein($targetTitle, $compareTitle);
    $similarity = 1 - $distance / max(strlen($targetTitle), strlen($compareTitle));
    
    echo "编辑距离:{$distance},相似度:{$similarity}";
    
    这个是最省心的方案,不需要安装任何额外依赖。
  • 进阶文本相似度库:如果需要更丰富的匹配算法(比如Jaccard系数、余弦相似度这些),可以试试PHP Similarity库,它封装了多种文本相似计算方法,适合有精细化需求的场景。
  • 中文分词优化:如果你的标题是中文的,先分词再计算相似度会更准确。可以用scws这种PHP分词扩展,或者纯PHP的分词库,把标题拆成词语集合后再计算相似性,这样比直接对整个字符串计算更贴合中文的语义逻辑。

内容的提问来源于stack exchange,提问作者nived

火山引擎 最新活动