3

志同道合的人如何应对过滤亵渎的基本挑战,显然不可能解决所有情况,但最好有一个最基本的级别作为第一道防线。

在 Obj-c 我有

NSString *tokens = [text componentsSeparatedByString:@" "];

然后我遍历每个标记以查看是否在每个标记中找到任何关键字(我在列表中有大约 400 个)。

实现误报也是一个问题,如果单词是完美匹配,则将其标记为亵渎,否则如果发现超过 3 个带有亵渎的单词但未完全匹配,则它也被标记为亵渎。

稍后我将使用一个更精确地解决问题的网络服务,但我真的只需要一些基本的东西。所以如果你写了阴茎这个词,它会变得顽皮顽皮,写得不好。

4

4 回答 4

6

淫秽过滤器:坏主意,还是令人难以置信的相互交流的坏主意?

在开始编写这样一段代码之前,Jeff 有一篇有趣的文章需要考虑:

http://www.codinghorror.com/blog/2008/10/obscenity-filters-bad-idea-or-incredibly-intercoursing-bad-idea.html

于 2010-05-12T02:28:53.090 回答
3

我只是对标记字符串有一个建议。如果单词全部由字符串分隔,则您的方法效果很好,但在大多数使用场景中很少出现这种情况,因为您通常必须处理换行符、标点符号等。如果您有兴趣,试试这个:

NSMutableCharacterSet *separators = [NSMutableCharacterSet punctuationCharacterSet];

[separators formUnionWithCharacterSet:[NSCharacterSet whitespaceAndNewlineCharacterSet]];

NSArray *words = [bigString componentsSeparatedByCharactersInSet:separators];

资料来源:http ://www.tech-recipes.com/rx/3418/cocoa-explode-break-nsstring-into-individual-words/

于 2010-05-12T02:31:24.153 回答
2

好吧,以这种方式搜索肯定不是搜索亵渎的最有效方法……更有效的方法是构建一个有限状态自动机来检测单词,并通过该 FSA 运行文本一次。您实际上并不需要拆分字符串来查找亵渎内容,并且所有拆分都会增加您不需要的额外分配和复制开销。此外,在某些列入黑名单的单词中可能存在共同模式,您不会通过单独搜索每个单词来利用这些模式。

也就是说,我认为 400 字是相当多的。你的听众到底是谁?如果用户有医疗问题怎么办?这样的问题真的应该被禁止吗?我只能想到一些在任何情况下都会被视为亵渎的词,因此您可能需要重新考虑过滤。

于 2010-05-12T02:30:18.047 回答
1

有几件事:

  • FSA 不一定会起作用,具体取决于您希望过滤器的智能程度
  • 正则表达式通常非常慢,具体取决于您要运行的数量
  • 400字有点低,取决于你的需要和语言
  • 过滤时有许多非常棘手的情况需要小心,尤其是“ASSume”等词的嵌入

我的公司 Inversoft 构建了一个商业过滤解决方案,它非常智能。它不使用正则表达式或 FSA,但具有定制的快速线性处理技术,使其极其快速和准确(每秒 4,000 多条消息)。它还包含 600 多个类别的英语单词,包括俚语、种族诽谤、毒品、帮派、宗教等。

如果您正在寻找支持的智能上下文感知解决方案,您应该查看 Inversoft 的 Clean Speak。使用 XML WebService 将它连接到 Obj-C 应该很简单。

于 2010-05-13T15:44:19.960 回答