php - 比较多个字符串的文本

标签 php sql ruby algorithm

假设数据库中有许多行需要搜索重复项。

重复项被视为具有超过 95% 的文本匹配度。

项目数量可以超过 50000 个甚至更多,并且项目不仅仅是 1 个单词,最多可以有 5000 个字符。

查找此类重复文本的策略是什么?

我不认为逐行选择行并将其与其他 49999 行进行比较是有效的,这纯粹是废话。

还有其他可能的解决方案吗?

最佳答案

您需要做的第一件事是定义“95% 文本匹配”的含义。例如,请考虑以下情况:

The quick red fox jumped over the lazy brown dog.
The qZick rZd fox jumped over the lazy brown dog.

这两句话各有 49 个字符长。它们的区别仅在于两个“Z”字符。因此有 47 个字符相同,这意味着文本相似度为 95.92%。如果你按性格行事。

如果你按单词来看,那么文本只有 80% 相似。

顺序重要吗?假设您的文本长度为 4,800 个字符。我们将该文本称为“固定”。现在要求您将其与前置两个单词的内容进行比较。即:

some stuff <fixed>

从许多方面来看,这与固定相似度超过 95%。或者怎么样:

<fixed> some stuff

这是否比以前更类似于fixed?反向固定的文本怎么样?包含所有fixed但还有一些额外单词的文本怎么样?缺少单词吗?

我问这些问题并不是迂腐的。如何定义相似性会对您解决问题的方式产生很大影响。

顺便说一句,你是对的,将每个文本与所有其他文本进行比较并不是正确的方法。您最终会进行 (n^2 - n)/2 文档比较。当n == 50,000时,其数量级为 1.25十亿

关于php - 比较多个字符串的文本,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20980653/

相关文章:

php - IS NULL 在列中找不到空行

php - 有没有办法将 php 中的值转发到第二页?

ruby - 在 DataMapper 中序列化和反序列化 Ruby 对象

php - 使用 Angular ngRepeat 显示 php 选择的 JSON 数据

php - 表 A 中的一个字段在表 B + mysql + php 的一个字段中

mysql - 错误 : #1242 - Subquery returns more than 1 row

sql - 在 SQL 和查询中将日期转换为日期时间大于

ruby-on-rails - Ruby/Rails : Respond to json request, 从对象数组创建哈希数组,更改键的名称

ruby - 如何使用有效? rails 3中数组的方法

java - 让 selenium 独立服务器与 phpunit 一起使用时出现问题