我有一个网站,用户可以把自己的描述。
大多数用户都会写一些合适的东西,但有些人只是多次复制/粘贴相同的文本(以创建大量文本的外观)。
例如:“爱与和平,爱与和平”
有没有用PHP检测重复文本的好方法?
我目前唯一的想法是将文本拆分成单独的单词(由空格分隔),然后查看单词是否重复超过一组限制。注意:我不是100%确定我将如何编码这个解决方案。
对检测重复文本的最佳方法有什么看法?或者如何对上述想法进行编码?
发布于 2015-07-27 09:01:34
这是一个基本的文本分类问题。如果你真的想了解细节,我建议你深入研究一下articles的lots如何判断某些文本是垃圾邮件/不是垃圾邮件。对于您在这里需要做的事情来说,其中的很多可能都是多余的。
当然,一种方法是评估为什么你要求人们输入更长的简历,但我假设你已经决定强迫人们输入更多的文本是可行的。
下面是我要做的事情的概要:
这种方法需要您找出两个集合之间的区别。直观地说,我预计垃圾邮件会显示较少的独特单词,如果您绘制直方图值,曲线下的较高区域集中在顶部单词。
下面是一些示例代码,可以让您上手:
$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包。
发布于 2015-07-27 08:41:25
您可以使用正则表达式,如下所示:
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.{2,}.中删除,
发布于 2015-07-27 08:50:24
我认为你在正确的轨道上打破了字符串,并看到了重复的单词。
下面是一些代码,它们没有使用PCRE,而是利用了PHP原生字符串函数(str_word_count和array_count_values):
<?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)
}
*/一些调整可能是为了:
https://stackoverflow.com/questions/31643452
复制相似问题