首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >PHP检测重复文本

PHP检测重复文本
EN

Stack Overflow用户
提问于 2015-07-27 08:35:24
回答 9查看 10.4K关注 0票数 20

我有一个网站,用户可以把自己的描述。

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

例如:“爱与和平,爱与和平”

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

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

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

EN

回答 9

Stack Overflow用户

回答已采纳

发布于 2015-07-27 09:01:34

这是一个基本的文本分类问题。如果你真的想了解细节,我建议你深入研究一下articleslots如何判断某些文本是垃圾邮件/不是垃圾邮件。对于您在这里需要做的事情来说,其中的很多可能都是多余的。

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

下面是我要做的事情的概要:

  1. 为输入字符串构建单词出现次数的直方图
  2. 研究一些有效和无效文本的直方图
  3. 提出将直方图分类为有效或无效的公式

这种方法需要您找出两个集合之间的区别。直观地说,我预计垃圾邮件会显示较少的独特单词,如果您绘制直方图值,曲线下的较高区域集中在顶部单词。

下面是一些示例代码,可以让您上手:

代码语言:javascript
复制
$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数组图:

将其与维基百科中Martin Luther King Jr.'s bio的前两段进行比较:

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

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

票数 21
EN

Stack Overflow用户

发布于 2015-07-27 08:41:25

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

代码语言:javascript
复制
if (preg_match('/(.{10,})\\1{2,}/', $theText)) {
    echo "The string is repeated.";
}

解释:

  • (.{10,})查找并捕获至少包含10个字符的字符串long
  • \\1{2,}至少再查找第一个字符串两次

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

  • 10更改为更高或更低的数字,以匹配更长或更短的重复字符串。我只是用10作为例子。
  • 如果你想捕捉一个重复(love and peace love and peace),删除{2,}。如果你想捕获更多的重复,增加2.
  • If你不关心重复发生的次数,只关心它发生的次数,在{2,}.

中删除,

票数 14
EN

Stack Overflow用户

发布于 2015-07-27 08:50:24

我认为你在正确的轨道上打破了字符串,并看到了重复的单词。

下面是一些代码,它们没有使用PCRE,而是利用了PHP原生字符串函数(str_word_countarray_count_values):

代码语言:javascript
复制
<?php
    $words = str_word_count("Love a and peace love a and peace love a and peace love a and peace love a and peace love a and peace", 1);
    $words = array_count_values($words);

  var_dump($words);
  /*
  array(5) {
    ["Love"]=>
    int(1)
    ["a"]=>
    int(6)
    ["and"]=>
    int(6)
    ["peace"]=>
    int(6)
    ["love"]=>
    int(5)
  }
  */

一些调整可能是为了:

  • 设置要忽略的常见词的列表
  • 查看单词的顺序(上一个和下一个),而不仅仅是出现的次数
票数 11
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/31643452

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档