所以我使用的是一个将用户名返回给我的api。其中有一些假的,如:
8spZKYf1t2
xOzJzaYJe2
0x5jD4xmTM
PJFBoDFJsW
UZV908nNF7
CRuMGgh1bM
lyhDRamtFf
wELYyunHZU
NC8ZbYCjig
plK2KtwQwE
EKRlRLRitP
0CULcA8lIR
Yyi2NV3P8n
有人知道一个很好的算法来忽略这些吗?
答案 0 :(得分:6)
您需要一个用户名数据库,以便了解真实用户名和虚假用户名之间的区别。将此称为"培训集":
从训练集中,计算每个3个字母组合的出现次数。例如,来自" mtimmerm",你可以为" mti"," tim"," imm"等添加计数。让{{ 1}}是训练集中N(x)
的计数,让x
为计数总数。设TOTAL
这将是我们对用户名中出现3个字母组合的频率的估计。
给定候选用户名F(x) = (N(x)+1)/(TOTAL+1)
,对于U
中的每个3个字母组合x
,计算H(x)= -log(F(X))。将所有这些加在一起并除以U
(组合数)以获得length(U)-2
。这是衡量“不切实际”的方式。 H(U)
是。
为一堆用户名计算U
,你应该会发现伪造的用户名要高得多。
如果你想学习其工作原理背后的理论,谷歌的话是"熵":https://en.wikipedia.org/wiki/Entropy_(information_theory)
我们正在做的是为用户名制作一个统计模型,然后计算出不寻常的'每个用户名都是根据该模型。这实际上是衡量存储用户名需要多少位的度量,如果我们使用我们的模型来压缩它(有点 - 我简化了计算,但它们应该相对于彼此足够准确)。随机生成的用户名(我们假设是假的)将比实际用户名更多地存储信息。
注意:如果训练集不包含任何虚假的用户名,那就太好了,但只要大多数都是真实的,它就不会产生太大的差别。另请注意,从训练集中测试名称并不完全正确。如果您要从训练集中测试名称,请从每个H(U)
中减去1/(TOTAL+1)
,以便在测试时不包含用户名自己的计数。