检测文本字符串/复制文本中的重复

问题描述 投票:0回答:2

我有一个输入表单,用户可以在其中上传测试报告,最小长度为100字。有些用户写的比这个少,只是简单地复制他们写的内容,直到达到 100 字的门槛。

我想测试(最好通过 php)文本字符串是否包含重复文本,即复制该字符串的子集的位置。 我正在考虑对文本进行傅里叶分析,这可能会导致字符串内出现文本重复。 是否有用于此目的的 php 类或正则表达式示例?

一些示例文本:

巴拉巴拉巴拉。这是一些文字,现在我感到无聊了。这是一些 现在发短信我感到无聊。这是一些文字,现在我感到无聊了。 这是一些文字,现在我感到无聊了。这是一些文字,现在我是 越来越无聊。最后还有一些东西。

更新:我解决此问题的建议如下

1)将字符串映射到整数数组,即找到每个字符的数字表示。所以上面的示例将变成

numerics = array ( 2, 5, 1, 2, 5, 1, ...);

2)对该数组进行傅里叶变换,得到“字符频谱”

FT = fft (numerics);

这会检测字符空间中的规则模式。 例如人们可以使用这个类来计算 fft。

3) 检测函数 FT 的峰值。与背景噪声相比,测量峰值的相对高度。

4) 设置峰值阈值。如果任何峰值高于此阈值,则返回文本中已出现的规则模式。例如句子的多次重复应该清楚地标志着某个频率的高峰。

由于这个提案在数据分析方面非常简单,我想知道它之前是否没有被编码过。这就是我在这里询问的目的,是否有人知道开源中是否已经存在这样的算法。

当然,如何解决这个问题的替代解决方案/建议将不胜感激。

php text pattern-matching fft
2个回答
0
投票

没有现有的函数或库可以按照您喜欢的方式检测重复字符串。您可以将问题分解为一种算法,该算法从一个单词开始,而不是两个单词等。但这将需要大量工作。

您的客户将开始复制不重复的句子,您将遇到另一个无法解决的问题。

你必须管理你的测试人员,并选择惩罚他们的非法条目。


0
投票

我发现,在 PHP 中实现用于文本重复检测的傅里叶分析可能是针对此问题的过度设计的解决方案。虽然傅里叶分析对于检测信号中的周期性模式很有用,但它可能不是分析文本重复的最合适方法,特别是考虑到自然语言的复杂性和可变性。

更简单的方法是使用正则表达式来识别文本中重复的子字符串。以下是如何在 PHP 中实现此功能的示例:

<?php

function findRepeatedText($text, $minLength = 10, $minRepetitions = 2) {
    // Match substrings of at least $minLength characters
    $pattern = '/(.{'.$minLength.',}).*?\1/';
    
    // Find all matches
    preg_match_all($pattern, $text, $matches);
    
    // Filter matches by repetition count
    $repeatedText = array_filter($matches[1], function($substring) use ($minRepetitions) {
        return substr_count($substring, $substring) >= $minRepetitions;
    });
    
    return $repeatedText;
}

// Example usage
$text = "blabla bla. this is some text now I am getting bored. this is some text now I am getting bored. this is some text now I am getting bored. this is some text now I am getting bored. this is some text now I am getting bored. some stuff in the end.";

$repeated = findRepeatedText($text, 10, 2);

if (count($repeated) > 0) {
    echo "Repeated text found:<br>";
    foreach ($repeated as $substring) {
        echo "- $substring<br>";
    }
} else {
    echo "No repeated text found.";
}

?>

此代码定义了一个函数 findRepeatedText(),它使用正则表达式来识别文本中至少重复两次的子字符串。您可以调整 $minLength 参数来设置要考虑的子字符串的最小长度,并调整 $minRepetitions 参数来设置将子字符串视为重复所需的最小重复次数。

与傅立叶分析相比,这种方法对于检测用户提交的输入中的重复文本应该更直接、更有效。

© www.soinside.com 2019 - 2024. All rights reserved.