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

时间:2011-06-09 19:12:10

标签: php algorithm string

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

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

我的问题是有没有办法检测与上述类似的字符串?

我认为不可能100%检测到它们,但任何解决方案都会受到欢迎:)

编辑:我的意思是“乱码搜索”。例如,有些人在我的搜索引擎中搜索“asdqweasdqw”,“paykaprkg”,“iwepr wepr ow”等字符串,我想检测乱码搜索。

搜索结果是0还是其他任何内容都没关系。我无法使用这种逻辑。

如果我考虑“常规词汇”,一些新品牌或产品将被忽略。

感谢您的帮助

8 个答案:

答案 0 :(得分:146)

您可以使用英语中的一堆文本构建角色模型以进行角色转换。例如,你会发现在'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

答案 1 :(得分:10)

假设你的意思是乱七八糟的搜索......这将比它的价值更麻烦。您正在为他们提供搜索功能,让他们随意使用。我确信有一些算法可以检测到奇怪的字符分组,但它可能比仅仅返回没有结果的资源/劳动密集更多。

答案 2 :(得分:8)

您可以what Stackoverflow doescalculate the entropy of the string

当然,这只是SO用于确定低质量答案的许多启发式方法之一,不应该被视为100%准确。

答案 3 :(得分:5)

我认为您可以像检测“常规词”一样检测这些字符串。这只是模式匹配,不是吗?

至于为什么用户正在搜索这些字符串,这是一个更大的问题。你可能能够以其他方式阻止乱码搜索。例如,如果它是人(或脚本)正在寻找的垃圾评论短语,则安装CAPTCHA。

编辑:解释输入的另一个最终目的是略微限制它。每10秒左右允许搜索一次。 (我记得在论坛软件上看到这个,以及在SO上的各个地方。)这将带来一些反复搜索 sdfpjheroptuhdfj 的乐趣,同时也不会干扰正在搜索和查找其内容的用户。

答案 4 :(得分:3)

有些人评论说,谷歌没有点击tapoktrpasawe或putjbtghguhjjjanika(当然,现在有),所以如果你有办法通过API进行快速谷歌搜索,你可以扔掉任何搜索没有Google结果的条款,而不是您的某个产品的名称。为什么你想要这样做是另一个问题 - 你是否想为搜索库省力?让您对“热门搜索字词”进行手工审核更有意义吗?或者你只是对广大互联网上一些人的莫名其妙行为感到沮丧?如果是后者,我的建议是放手,即使有办法防止它。其他一些古怪的东西也会出现。

答案 5 :(得分:1)

我必须为源代码挖掘项目解决一个密切相关的问题,虽然该软件包是用Python而不是PHP编写的,但似乎值得一提,以防它在某种程度上仍然有用。包是Nostril(对于“无意义字符串求值器”),它旨在确定在源代码挖掘期间提取的字符串是否可能是类/函数/变量/等。标识符或随机乱码。它也适用于真实文本,而不仅仅是程序标识符。 Nostril使用n-gram(类似于the answer by Rob Neuhaus中的Gibberish Detector)和自定义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,我欢迎贡献。

答案 6 :(得分:1)

简短答案-乱码搜索

概率语言模型有效。

逻辑

单词由字符序列组成,如果两个字符在一起的频率更高,并且如果我们将单词中两个连续字符的所有频率相加,然后相加超过阈值限制(英语单词),则为说正确的英语单词。简而言之,这种逻辑在 Markov链中很有名。

链接

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

答案 7 :(得分:0)

如果在产品上执行搜索,您可以在查询数据库之前缓存其名称或代码并在该列表中进行检查。否则,如果您的站点是英语用户,您可以构建一个不使用英语的字符串字典,如qwkfagsd。哪一个,并同意其他答案,将比没有那里更加资源密集。