ahe*_*ahe 62 php string algorithm
人们在我的网站上搜索,其中一些搜索是这些搜索:
tapoktrpasawe
qweasd qwa as
a?e qwo ?ak kqw
qwe qwe qwe a
Run Code Online (Sandbox Code Playgroud)
我的问题是有没有办法检测类似于上面的字符串?
我想不可能100%检测到它们,但任何解决方案都会受到欢迎:)
编辑:我的意思是"乱码搜索".例如,有些人在我的搜索引擎中搜索"asdqweasdqw","paykaprkg","iwepr wepr ow"等字符串,我想检测乱码搜索.
搜索结果是0还是其他任何内容都无关紧要.我无法使用这种逻辑.
如果我考虑"常规词汇",一些新品牌或产品将被忽略.
谢谢您的帮助
Rob*_*aus 153
您可以使用英语中的一堆文本构建角色模型以进行角色转换.例如,你会发现在't'之后有一个'h'是多么常见(很常见).在英语中,你希望在'q'之后,你会得到'你'.如果你得到一个'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
Run Code Online (Sandbox Code Playgroud)
小智 10
假设你的意思是乱七八糟的搜索...它会比它的价值更麻烦.您正在为他们提供搜索功能,让他们随心所欲地使用它.我确信有一些算法会检测到奇怪的字符分组,但它可能比仅仅返回没有结果的资源/劳动密集更多.
我必须解决源代码挖掘项目的一个密切相关的问题,尽管该包是用 Python 而不是 PHP 编写的,但这里似乎值得一提,以防它仍然有用。该软件包是Nostril(“Nonsense String Evaluator”),旨在确定在源代码挖掘期间提取的字符串是否可能是类/函数/变量/等。标识符或随机乱码。它也适用于真实文本,而不仅仅是程序标识符。Nostril 使用 n-gram(类似于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'))
Run Code Online (Sandbox Code Playgroud)
将产生以下输出:
bunchofwords: real
getint: real
xywinlist: real
ioFlXFndrInfo: real
DMEcalPreshowerDigis: real
httpredaksikatakamiwordpresscom: real
faiwtlwexu: nonsense
asfgtqwafazfyiur: nonsense
zxcvbnmlkjhgfdsaqwerty: nonsense
Run Code Online (Sandbox Code Playgroud)
该项目位于GitHub上,我欢迎贡献。
我认为你可以像检测"常规词"一样检测这些字符串.这只是模式匹配,不是吗?
至于用户为什么要搜索这些字符串,这是一个更大的问题.你可能能够以其他方式阻止乱码搜索.例如,如果它是人(或脚本)正在寻找的垃圾评论短语,则安装CAPTCHA.
编辑:解释输入的另一个结束是稍微限制它.每10秒左右允许搜索一次.(我记得在论坛软件上以及SO上的各个地方都看过这个.)这将一遍又一遍地搜索sdfpjheroptuhdfj带来一些乐趣,同时不会干扰正在搜索的用户为了找到他们的东西.