You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

feck:profanities()函数无法识别含扩展ASCII字符文本中的脏话求助

解决feck:profanities无法识别含扩展ASCII字符文本中脏话的问题

问题分析

从调试信息{<<"inqui\351tez de">>, <<"de">>}来看,é是以ISO-8859-1编码的单字节扩展ASCII字符(\351),而feck库可能默认仅按纯ASCII字节流处理文本,多字节/扩展ASCII字符的存在会干扰字符串的匹配或分词逻辑,导致后续的脏话"de"无法被检测到。

解决方案

  • 统一字符编码为UTF-8
    feck库大概率对UTF-8编码的支持更好,先将输入的Latin1编码二进制转换为UTF-8后再传入函数:

    Utf8Text = unicode:characters_to_binary(<<"inqui\351tez de">>, latin1, utf8),
    feck:profanities(Utf8Text, <<"de">>).
    
  • 规范化扩展ASCII字符
    将扩展ASCII字符替换为对应的ASCII近似字符,消除编码差异对匹配的影响:

    normalize_text(Text) ->
        % 先转换为NFD规范化形式,拆分重音符号与基础字符
        Normalized = unicode:normalize(Text, nfd),
        % 替换扩展字符为对应ASCII字符
        binary:replace(Normalized, <<"é">>, <<"e">>, [global]).
    
    % 使用示例
    ProcessedText = normalize_text(<<"inqui\351tez de">>),
    feck:profanities(ProcessedText, <<"de">>).
    
  • 修复feck的字符遍历逻辑
    如果上述方法无效,检查feck源码的字符串处理逻辑:若它是按字节而非Unicode字符遍历文本,会导致多字节字符偏移后续匹配位置。修改代码时,将字节遍历改为基于Unicode字符的处理:

    % 示例:将字节流转为字符列表处理
    scan_profanities(Text, Profanity) ->
        CharList = unicode:characters_to_list(Text),
        ProfanityList = unicode:characters_to_list(Profanity),
        string:str(CharList, ProfanityList) =/= 0.
    
  • 手动分词后匹配
    绕过feck的内置分词,手动分割文本为单词后逐个检查:

    check_profanity(Text, Profanity) ->
        WordList = string:tokens(binary_to_list(Text), " \t\n\r\f\v"),
        ProfanityStr = binary_to_list(Profanity),
        lists:any(fun(Word) -> string:str(Word, ProfanityStr) =/= 0 end, WordList).
    

内容的提问来源于stack exchange,提问作者Hashini Udara

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.18 18:43:24