PHP 检测重复文本

2022-08-30 18:46:21

我有一个网站,用户可以在其中输入有关自己的描述。

大多数用户写了一些合适的东西,但有些用户只是多次复制/粘贴相同的文本(以创建相当数量的文本的外观)。

例如:“爱一个,和平爱一个,和平爱一个,和平爱一个,和平爱a,和平爱a和和平”

有没有一种用PHP检测重复文本的好方法?

我目前唯一的概念是将文本分解成单独的单词(由空格分隔),然后查看单词的重复次数是否超过一组限制。注意:我不是100%确定如何编写此解决方案。

关于检测重复文本的最佳方法的想法?或者如何对上述想法进行编码?


答案 1

这是一个基本的文本分类问题。有很多关于如何确定某些文本是否是垃圾邮件/非垃圾邮件的文章,如果您真的想深入了解细节,我建议您深入研究。对于您需要在此处执行的操作而言,其中很多内容可能都过分了。

当然,一种方法是评估为什么你要求人们输入更长的简历,但我假设你已经决定强迫人们输入更多的文本是要走的路。

以下是我将要执行的操作的概述:

  1. 为输入字符串构建单词出现的直方图
  2. 研究一些有效和无效文本的直方图
  3. 想出一个公式,用于将直方图分类为有效与否

这种方法需要您弄清楚两组之间有什么不同。直观地说,我希望垃圾邮件显示较少的唯一单词,如果您绘制直方图值,则曲线下方的较高区域将集中在顶部单词上。

下面是一些示例代码,可帮助您继续学习:

$str = 'Love a and peace love a and peace love a and peace love a and peace love a and peace love a and peace';

// Build a histogram mapping words to occurrence counts
$hist = array();

// Split on any number of consecutive whitespace characters
foreach (preg_split('/\s+/', $str) as $word)
{
  // Force all words lowercase to ignore capitalization differences
  $word = strtolower($word);

  // Count occurrences of the word
  if (isset($hist[$word]))
  {
    $hist[$word]++;
  }
  else
  {
    $hist[$word] = 1;
  }
}

// Once you're done, extract only the counts
$vals = array_values($hist);
rsort($vals); // Sort max to min

// Now that you have the counts, analyze and decide valid/invalid
var_dump($vals);

当您对某些重复字符串运行此代码时,您将看到差异。下面是您给出的示例字符串中的数组图:$vals

repetitive

将其与维基百科中马丁·路德·金传记的前两段进行比较:

mlk

长尾巴表示许多独特的单词。仍然有一些重复,但一般的形状显示出一些变化。

仅供参考,PHP有一个统计包,如果你要做很多数学运算,如标准偏差,分布建模等,你可以安装。


答案 2

您可以使用正则表达式,如下所示:

if (preg_match('/(.{10,})\\1{2,}/', $theText)) {
    echo "The string is repeated.";
}

解释:

  • (.{10,})查找并捕获长度至少为 10 个字符的字符串
  • \\1{2,}至少再查找第一个字符串 2 次

可能进行调整以满足您的需求:

  • 更改为更高或更小的数字以匹配更长或更短的重复字符串。我只是举了一个例子。1010
  • 如果要捕获哪怕一个重复 (),请删除 .如果要捕获更多的重复次数,请增加 .love and peace love and peace{2,}2
  • 如果您不在乎重复发生了多少次,只关心它发生的次数,请删除 in 。,{2,}

推荐