如何检测关键字填充

本文关键字:关键字 填充 检测 何检测 | 更新日期: 2023-09-27 18:17:07

我们正在开发一种文档搜索引擎——主要用于索引用户提交的MS word文档。

我们已经注意到,有关键字填充滥用。

我们已经确定了两种主要的滥用:

  1. 重复相同的术语,一遍又一遍
  2. 大量添加到文档中的许多不相关的术语

这两种形式的滥用都是可以实现的,要么添加与文档背景颜色相同的字体颜色的文本,要么将字体大小设置为1px。

在确定背景颜色是否与文本颜色相同时,这是很棘手的,考虑到MS word布局的复杂性——字体大小也是如此——因为任何截断似乎都是任意的——如果我们设置的截断太大,我们可能会意外地删除有效的文本。

我的问题是——是否有任何标准化的预处理或统计分析技术可以用来减少这种关键字填充的影响?

任何指导将不胜感激!

如何检测关键字填充

使用可压缩性的概念有一个非常简单的解决方案。

如果您将Word文档转换为文本(您可以轻松地在飞行中完成此操作),然后可以压缩它们(例如,使用免费的zlib库)并查看压缩比。普通文本文档的压缩比通常在2左右,所以任何重要的偏差都意味着它们被"填充"了。分析过程非常简单,我已经分析了大约10万个文本,使用Python只需要大约1分钟。

另一个选择是查看文档/单词的统计属性。为了做到这一点,你需要有一个"干净"文档的样本,并计算不同单词的平均频率及其标准偏差。

这样做之后,您可以取一个新文档并将其与平均值和偏差进行比较。填充文档将被描述为具有一些单词与该单词的平均值偏差非常大的文档(其中一个或两个单词重复多次的文档)或具有高偏差的许多单词(重复文本块的文档)

这里有一些关于可压缩性的有用链接:

http://www.ra.ethz.ch/cdstore/www2006/devel-www2006.ecs.soton.ac.uk/programme/files/pdf/3052.pdf

http://www.ispras.ru/ru/proceedings/docs/2011/21/isp_21_2011_277.pdf

你也可以使用熵的概念,例如香农熵计算http://code.activestate.com/recipes/577476-shannon-entropy-calculation/

另一个可能的解决方案是使用词性标注。我估计在"正常"文档中,名词的平均百分比是相似的(根据http://www.ingentaconnect.com/content/jbp/ijcl/2007/00000012/00000001/art00004?crawler=true, 37%)。如果某些POS标记的百分比更高或更低,那么您可能会检测到"填充"文档。

正如Chris Sinclair在你的问题中评论的那样,除非你有谷歌级别的算法(即使他们出错了,因此有一个上诉过程),否则最好标记可能的关键字填充文档,以便进一步进行人工审查…

如果一个页面有100个单词,你搜索整个页面检测关键字出现的次数(渲染填充1px或bgcolor无关),从而获得一个关键字密度计数,真的没有一个固定的方法来确定一定百分比的"always"是关键字填充,一般3-7%是正常的。也许如果你检测到10% +,那么你可以将其标记为"潜在填充",并将其留给人工审核。

进一步考虑这些场景(从这里取的):

  • 没有实质性附加值的电话号码列表
  • 网页试图为
  • 排名的城市和州的文本块

和关键字的上下文。

很难正确操作

使用前色/背景色检测来检测标签滥用,就像你已经做的那样。对于大小检测,计算平均文本大小并去除异常值。还可以对文本大小设置预定义的限制(就像您已经做的那样)。

接下来是标签"blobs"的结构。对于你的第一点,你可以数一下单词,如果一个单词出现得太频繁(可能是第二个单词的5倍),你可以将其标记为重复标签。

在批量添加标签时,用户经常将它们全部添加到一个地方,因此您可以看到已知的"欺诈标签"是否相邻出现(可能中间有一两个单词)。

如果你至少可以识别一些常见的"欺诈标签",并且想要更高级一点,那么你可以这样做:

  • 将文档拆分为文本大小/字体相同的部分,并分别分析每个部分。为了获得更好的结果,将使用几乎相同字体/大小的部件分组,而不仅仅是那些具有完全相同字体/大小的部件。
  • 计算每个已知标签的出现次数,当超过您设置的某些限制时,该部分文档将被删除或文档被标记为"坏"(如"使用过多的标签")

无论你的检测有多先进,只要人们知道它的存在,或多或少知道它的工作原理,他们就会找到绕过它的方法。

当这种情况发生时,您应该标记出违规文档,并通过它们自己查看。如果你发现你的检测算法出现了假阳性你就改进它。

如果你注意到常见的填充物总是使用低于一定大小的字体,并且这个大小是1-5,这不是真正可读的,那么你可以假设这是"填充部分"。

你可以继续检查字体颜色是否与背景颜色相同,并删除该部分