【问题标题】:How do I categorise non-english email using procmail and command line tools?如何使用 procmail 和命令行工具对非英语电子邮件进行分类?
【发布时间】:2020-10-13 18:41:26
【问题描述】:

我订阅了一个邮件列表,其中一些邮件是非英语的,我无法理解。

如何使用procmail 和/或命令行工具过滤到/dev/null 的非英语消息?

我使用procmail 过滤我的电子邮件,因此理想情况下,任何替代工具也需要procmail 配方。

我宁愿不必训练自己的语言模型。

【问题讨论】:

    标签: email command-line-interface text-classification non-english procmail


    【解决方案1】:

    一种方法是使用来自Gertjan van Noord 的perl TextCat 包。

    text_cat 脚本为邮件输出最可能的语言。这个秘籍假定text_cat 已经安装在/usr/local/bin 下。

    这里有一个简单的procmail 方法来调用text_cat 脚本:

    :0
    * ^Subject.*Jobs.*Board
    {
        LANG_=`/usr/local/bin/text_cat`
    
        :0
        * ! LANG ?? ^english$
        /dev/null
    
        :0
        jobs/
    }
    

    我已经运行 text_cat 好几年了。没有任何非英语消息被归类为英语,也就是说,没有误报。我在检查假阴性方面并不严格。


    tripleee 在评论中提到的第二种方法是使用spamassassin 提供的语言分类,它也使用 text_cat 脚本。 Spamassassin 将解开任何 MIME 传输编码,而上面的 vanilla text_cat 版本不会。

    这是一个未完全测试 procmail 用于过滤 spamassassin X-Spam-Languages 标头的方法:

    :0
    * ^Subject.*Jobs.*Board
    {    
        # Delete non-english language emails using spamassassin header
        # Test for not X-Spam-Languages: en
        :0
        * !^X-Spam-Languages: en$
        foreign/
    
        # Save english language mails in folder
        :0
        jobs/
    }
    

    警告: spamassassin 有时会提供多种语言分类,如下所示:

    X-Spam-Languages: en da ro
    

    上面的配方没有考虑到。

    Spamassassin 语言分类配置

    编辑 /etc/spamassassin/v310.pre 并取消注释以下行:

    loadplugin Mail::SpamAssassin::Plugin::TextCat
    

    /etc/spamassassin/local.cf中配置插件:

    ok_languages en       # I understand english
    inactive_languages '' # Enable all languages
    add_header all Languages _LANGUAGES_
    # score UNWANTED_LANGUAGE_BODY 5 # Increase score - not necessary and not recommended 
    

    此配方未通过 spamassassin 3.4.2 版的完整测试。


    要调整这些答案以排除不同的语言,需要在第一种情况下用另一种语言替换 english,在第二种情况下用另一种 2 字符语言代码替换 en

    【讨论】:

    • 请记住,TextCat 附带的模型非常粗糙,并且不能很好地区分例如丹麦语和挪威语或塞尔维亚语和俄语。还有其他具有类似界面的语言识别工具,或者您可以训练自己的 TextCat 模型。
    • 很高兴知道,但我对英语感兴趣,而不是其他一切。我宁愿不必训练自己的模型(我已经相应地更新了我的问题)。
    • 另一个问题是 TextCat 本身对电子邮件编码一无所知。您可能更喜欢使用像 SpamAssassin 这样的邮件感知过滤器,它包含一个 TextCat 的集成分支,但还负责在运行之前解开任何 MIME 传输编码。
    • formail -A 不仅仅需要评估$LANG 的值。
    • @makeyourownmaker 我不是这个意思。 Procmail 有语法variablename ?? 来测试变量的值。参照。手册页 procmailrc(5).
    【解决方案2】:

    许多现代电子邮件客户端会识别电子邮件的字符集,但通常不会识别其语言。如果您想丢弃日文、中文、韩文和俄文消息,可以尝试类似

    :0HB
    * ^Content-type:[  ]*text/[/;]*;[  ]*charset="?(iso-2022|ks-c|gb|koi|cp-1251)
    foreign
    

    因为有些客户在用英文书写时忘记更改字符集,这可能会产生一些误报,所以我建议保存到一个文件夹并定期查看。相反的问题更难。许多外语使用与英语相同的字符集,因此不能像这样可靠地识别。

    【讨论】:

    • 这是一个有用的答案(我赞成),但鉴于您列出的限制,我倾向于接受我的答案(假设这是可能的,并且只有在一周内没有更好的答案的情况下或两个)。
    • 您可以在一段时间后(IIRC 两天)接受您自己的答案,如果有更好的结果,您可以稍后更改接受的答案。在这一点上,我同意你的答案是更好的。调整它以使用 SpamAssassin 应该是相当简单的。
    • 我添加了一些用于使用 spamassassin 配置语言分类的指针。而且我已经修改了我之前的 procmail 配方以使用 spamassassin 语言标题。
    猜你喜欢
    • 2022-07-27
    • 2013-02-06
    • 2022-01-22
    • 2011-02-05
    • 2010-09-07
    • 2012-08-02
    • 2012-10-05
    • 1970-01-01
    相关资源
    最近更新 更多