php 有没有办法检测像putjbtghguhjjjanika这样的字符串?

vshtjzan  于 2023-03-21  发布在  PHP
关注(0)|答案(9)|浏览(148)

人们在我的网站上搜索,其中一些搜索是这样的:

tapoktrpasawe
qweasd qwa as
aıe qwo ıak kqw
qwe qwe qwe a

我的问题是,有没有什么方法可以检测到与上面类似的字符串?
我想不可能100%检测到它们,但任何解决方案都将受到欢迎:)
编辑:我的意思是“乱码搜索”.例如,有些人搜索字符串像“asdqweasdqw”,“paykaprkg”,“iwepr wepr ow”在我的搜索引擎,我想检测乱码搜索.
不管搜索结果是0还是别的什么,我都不能用这种逻辑。
一些新的品牌或产品将被忽略,如果我会考虑“常规的话”。
谢谢你的帮忙

eoigrqb6

eoigrqb61#

你可以从一堆英语文本中建立一个字符到字符转换的模型,例如,你可以发现t后面有h的情况有多普遍(很常见)。在英语中,你期望在“q”之后,你会得到一个“u”。如果你得到一个“q”后面跟着“u”以外的东西,这种情况发生的概率很低,因此,它应该是相当惊人的。规范化表中的计数,这样你就有了一个概率。然后对于一个查询,遍历矩阵并计算你所采取的转换的乘积。然后通过查询的长度进行规范化。当数字很低时,你可能有一个乱码查询(或其他语言的东西)。
如果你有一堆查询日志,你可能首先建立一个通用英语文本的模型,然后在模型训练阶段对你自己的查询进行加权。
有关背景信息,请阅读Markov Chains
编辑,我在这里用Python实现了这个:
https://github.com/rrenaud/Gibberish-Detector
buggedcom用PHP重写了它:
https://github.com/buggedcom/Gibberish-Detector-PHP

my name is rob and i like to hack True
is this thing working? True
i hope so True
t2 chhsdfitoixcv False
ytjkacvzw False
yutthasxcvqer False
seems okay True
yay! True
aor9mmx1

aor9mmx12#

你可以用what Stackoverflow does来计算字符串的熵。
当然,这只是SO用于确定低质量答案的许多启发式方法之一,不应依赖于100%准确。

ltqd579y

ltqd579y3#

假设你的意思是jibberish搜索...这将是更多的麻烦比它的价值.你提供了一个搜索功能,让他们使用它,但他们喜欢.我相信有一些算法在那里检测奇怪的字符组,但它可能会更多的资源/劳动密集型比只是简单地返回没有结果.

gzjq41n4

gzjq41n44#

我必须解决一个与源代码挖掘项目密切相关的问题,尽管这个包是用Python而不是PHP编写的,这里似乎值得一提,以防它仍然有用。(用于“Nonsense String Evaluator”),并且其旨在确定在源代码挖掘期间提取的字符串是否可能是类/函数/变量/等。标识符或随机乱码。它在真实的文本上也能很好地工作,而不仅仅是程序标识符。Nostril使用n-gram(类似于the answer by Rob Neuhaus中的乱码检测器)与自定义TF-IDF评分函数相结合。它经过预训练,并且可以开箱即用。
示例:下面的代码

from nostril import nonsense
real_test = ['bunchofwords', 'getint', 'xywinlist', 'ioFlXFndrInfo',
             'DMEcalPreshowerDigis', 'httpredaksikatakamiwordpresscom']
junk_test = ['faiwtlwexu', 'asfgtqwafazfyiur', 'zxcvbnmlkjhgfdsaqwerty']
for s in real_test + junk_test:
    print('{}: {}'.format(s, 'nonsense' if nonsense(s) else 'real'))

将生成以下输出:

bunchofwords: real
getint: real
xywinlist: real
ioFlXFndrInfo: real
DMEcalPreshowerDigis: real
httpredaksikatakamiwordpresscom: real
faiwtlwexu: nonsense
asfgtqwafazfyiur: nonsense
zxcvbnmlkjhgfdsaqwerty: nonsense

这个项目在GitHub上,我欢迎大家的贡献。

0pizxfdo

0pizxfdo5#

我认为你可以像检测“常规单词”一样检测这些字符串。这只是模式匹配,不是吗?
至于用户为什么要搜索这些字符串,这才是更大的问题。你也许可以用其他方法来阻止这些胡言乱语的搜索。例如,如果人们(或脚本)正在寻找的是垃圾评论短语,那么就安装一个验证码。

编辑:另一个解释输入的方法是稍微限制它。允许每10秒左右搜索一次。(我记得在论坛软件上看到过这个,在SO上也有很多地方。)这会减少一次又一次搜索 sdfpjheroptuhdfj 的乐趣,同时不会干扰用户搜索和查找他们的东西。

r7knjye2

r7knjye26#

正如一些人评论的那样,在谷歌中没有关于Tapoktrpasawe或putjbtghguhjjjanika的搜索结果(当然,现在有了)所以如果你有办法通过API进行快速的谷歌搜索,你可以扔掉任何没有谷歌结果的搜索词,也不是你的产品名称。为什么你想这样做是另一个问题-你是想为你的搜索库保存精力吗?让你对“热门搜索词”的手工审查更有意义吗?或者你只是对互联网上一些人的莫名其妙的行为感到沮丧吗?如果是后者,我的建议是让它去吧,即使有办法阻止它。一些其他的怪事也会沿着。

wmomyfyw

wmomyfyw7#

简短回答- Jibberish搜索

概率语言模型工作。

逻辑

一个单词是由一系列的字符组成的,如果两个字符出现的频率更高,如果我们把单词中两个相邻字符出现的频率加起来,并把跨阈值极限(英语单词)加起来,就说它是一个正确的英语单词。简单地说,这个逻辑就是著名的马尔可夫链。

链接

对于数学的胡言乱语和更好的理解,请参阅视频https://www.youtube.com/watch?v=l15C8UJu17s。谢谢!!

yuvru6vn

yuvru6vn8#

如果搜索的是产品,你可以缓存它们的名称或代码,在查询数据库之前对照列表进行检查。另外,如果你的网站是为英语用户服务的,你可以建立一个字典,里面包含英语中不使用的字符串,比如qwkfagsd。这会比没有字典更耗费资源。

9rnv2umw

9rnv2umw9#

如果你像我一样,只是想要一个快速而肮脏的PHP解决方案,这里有一个:

function isGibberish($data) {
    $freq = count_chars(strtoupper($data), 0);
    $rareCount = $freq[ord('Q')] + $freq[ord('X')] + $freq[ord('Z')] + $freq[ord('J')] + $freq[ord('K')];
    $commonCount = $freq[ord('A')] + $freq[ord('E')] + $freq[ord('R')] + $freq[ord('S')] + $freq[ord('T')];
    $gibberishScore = floatval($rareCount) / ( 0.01 + $rareCount + $commonCount);
    return $gibberishScore > 0.3;
}

它只计算5个最罕见的字母,5个最常见的字母,并确定比例是否过高。

相关问题