代码之家  ›  专栏  ›  技术社区  ›  David van Dugteren

iPhone目标C中的基本亵渎过滤

  •  3
  • David van Dugteren  · 技术社区  · 14 年前

    你们这些志同道合的人是如何应对过滤亵渎的基本挑战的,显然人们不可能解决每一个场景,但最好是在最基本的层面上有一个作为第一道防线。

    在obj-c里我有

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

    然后我循环查看每个令牌,看看是否在每个令牌中找到任何关键字(列表中有大约400个关键字)。

    认识到假阳性也是一个问题,如果这个词是一个完美的匹配词,它会被标记为亵渎;否则,如果发现超过3个带有亵渎的词而不是完美的匹配词,它也会被标记为亵渎。

    稍后,我将使用一个更精确地解决问题的WebService,但我确实需要一些基本的东西。所以,如果你写了“阴茎”这个词,它会变得很调皮,很淘气,很糟糕。

    4 回复  |  直到 14 年前
        1
  •  3
  •   sosborn    14 年前

    我只是有一个标记化字符串的建议。如果单词都由字符串分隔,那么您的方法会很好地工作,但在大多数使用场景中,这种情况很少发生,因为您通常需要处理换行符、标点符号等。如果您感兴趣,请尝试以下操作:

    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/

        2
  •  6
  •   Mark Harrison    14 年前

    淫秽过滤:坏主意,或者难以置信的交流坏主意?

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

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

        3
  •  2
  •   Michael Aaron Safyan    14 年前

    好吧,以这种方式搜索当然不是寻找亵渎的最有效方法…一种更有效的方法是构造一个有限状态自动机来检测单词,并在该fsa中运行文本一次。您不需要真正地拆分字符串来发现亵渎,而所有这些拆分都会增加额外的分配和复制开销,这是您不需要的。此外,在一些黑名单单词中可能有一些常见的模式,您不能通过单独搜索每个单词来利用这些模式。

    也就是说,我觉得400个字相当多。你的观众到底是谁?如果用户有医疗问题怎么办?这样的问题真的应该被拒绝吗?在任何上下文中,我只能想到少数被认为是亵渎的词,所以您可能需要重新考虑过滤。

        4
  •  0
  •   Brian P    14 年前

    一些事情:

    • FSA不一定能工作,这取决于你希望过滤器有多智能。
    • regex通常非常慢,这取决于您要运行多少个regex
    • 400字有点低,这取决于你的需要和语言
    • 过滤时要注意一些非常棘手的情况,尤其是嵌入“假定”等词。

    我的公司Inversoft构建了一个商业过滤解决方案,它非常智能。它不使用regex或fsa,但有一个定制的快速线性处理技术,使它非常快速和准确(每秒4000多条消息)。它还拥有600多个英语词汇,包括俚语、种族歧视、毒品、帮派、宗教等。

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