15

Jeff Atwood 最近在推特上发布了一个指向 CodeReview 帖子的链接,他想知道社区是否可以改进他的“计算字符串的熵”代码片段。他解释说:“我们在 Stack Overflow 的几个地方计算字符串的熵,作为低质量的标志。”

他的方法的要点似乎是,如果您计算字符串中唯一字符的数量,则表示熵(代码取自PieterG 的答案):

int uniqueCharacterCount = string.Distinct().Count();

我不明白唯一字符数如何表示字符串的熵,以及字符串的熵如何表示低质量。我想知道在这方面有更多知识的人是否可以解释阿特伍德先生正在努力实现的目标。

谢谢!

4

5 回答 5

8

混乱似乎来自这样的想法,即这是用来阻止发布帖子的 - 它不是。

它只是用于查找可能的低质量帖子的几种算法之一,显示在版主工具的低质量帖子选项卡 (需要 10k 代表)上。实际的人类仍然需要看帖子。

这个想法是捕捉类似~~~~~~No.~~~~~~or的帖子FUUUUUUUU------,而不是捕捉所有低质量的帖子。


至于“唯一字符数如何表示熵?” - 它没有,真的。投票最多的答案完全没有抓住重点。

请参阅https://codereview.stackexchange.com/questions/868#878https://codereview.stackexchange.com/questions/868#926

于 2011-02-22T21:14:29.847 回答
6

字符串 'aaaaaaaaaaaaaaaaaaaaaaaaaaaa' 的熵非常低,而且毫无意义。

字符串 'blah blah blah blah blah blah blah blah' 具有更高的熵,但仍然相当愚蠢,可以成为攻击的一部分

具有与这些字符串相当的熵的帖子或评论可能不合适;它不能包含任何有意义的消息,甚至是垃圾邮件链接。这样的帖子可以被过滤掉或需要额外的验证码。

于 2011-02-22T16:51:09.913 回答
3

让我们看一下关于熵(信息论)的维基百科条目:

在信息论中,熵是与随机变量相关的不确定性的度量。在这种情况下,该术语通常指的是香农熵,它量化了消息中包含的信息的期望值......

特别是英文信息:

根据香农基于人体实验的估计,英文文本的熵率在每个字母 1.0 到 1.5 位之间,或者低至每个字母 0.6 到 1.3 位。

换句话说,不仅仅是低熵不好,高熵好,反之亦然——存在一个最优熵范围

于 2011-02-22T16:53:03.580 回答
2

香农熵 H(P) 是随机变量 X 的概率分布 P 的属性。

在字符串的情况下,处理它的基本方法是作为一个字符包。在这种情况下,频率计数提供了字符串中随机选择的字符的概率分布 P 的近似值。

如果我们要简单地计算字符串中唯一字符的数量,这将与该字符串中出现的唯一字符数量的均匀分布的熵相关。并且唯一字符的数量越多,熵就越大。

但是,Jeff Atwood(和 BlueRaja 的)随后的代码贡献是更好的衡量标准,因为它们考虑了字符串的其他可能分布;仍然被认为是一袋(不一定是唯一的)角色;代表。

基于 Rex M 的回答......寻找“字符熵”超出 1.0 - 1.5 范围的字符串会更有意义,因为可能是“低质量字符串”。

于 2013-05-23T06:53:01.873 回答
0

不完全是您问题的答案,但维基百科对 Entropy 有以下解释

熵是无序的量度,或者更准确地说是不可预测性的量度。例如,用公平的硬币进行一系列抛硬币具有最大熵,因为无法预测接下来会发生什么。一串硬币与两头硬币一起抛掷的熵为零,因为硬币总是正面朝上。现实世界中的大多数数据集合都介于两者之间。

英文文本的熵相当低。换句话说,它是相当可预测的。即使我们不确切知道接下来会发生什么,我们也可以相当肯定,例如,e 将比 z 多得多,或者组合“qu”将比任何其他组合更常见其中有一个“q”,而“th”的组合将比其中任何一个都更常见。未压缩的英文文本对于消息的每个字节(八位)大约有一位熵。

于 2011-02-22T16:51:39.833 回答