【C++】实现敏感词过滤算法(含源码)

敏感词过滤算法(聚合词树查询法)

1.构建词树

2.敏感词判断

3.遍历文本

关于敏感词过滤算法,数不胜数,在参考众多算法后,选取了比较实用的算法,进行总结与改进。大家可以参考一下链接:

敏感词过滤算法实现

发一个高性能的敏感词过滤算法 可以忽略大小写、全半角、简繁体、特殊符号干扰

算法描述:

将所有敏感词库按模块聚合构建成一个词树(所谓聚合,就是将相同字开头的部分进行聚合,以减少对词的查询范围,相当于建立敏感词索引,如:他奶奶的、他妈的、他娘的,这三个词,聚合构建成词树时,“他”字就是这三个词的索引,同时每个词的结尾都有一个结束标志和该词的一些描述,如敏感级别等),然后从头到尾扫描一遍目标文本,当遇到以敏感词树中的索引的字时,查看后面的文本是否构成敏感词(如果这里有以这个敏感词开头的更长的敏感词时,以更长的为匹配结果,并判断该词在文本中前后是否有分隔符来区别其匹配方式),如果是则记录,一遍扫描完之后所有敏感词即被扫描出来了!

1.构建词树

词树整体为多叉树结构,词树节点包含当前位置可能出现的所有字符(字节),以及该字符对应的下一节点地址,节点的高度对应相关敏感词的字节位置,节点的分支数表示该节点的被复用的次数,每个敏感词的都会有一个特殊的结束节点。词树结构可以节省存储空间,提升查询效率。
词库
ab
ab1
ab2
ba
ba1
ba2
词树
a b \r
   1 \r
   2 \r
b a \r
   1 \r
   2 \r


2.敏感词判断

使用递归算法查找词树,找出符合要求的最大长度敏感词
ab
abc
输入abcd,则命中abc


3.遍历文本

从文本的起始位置,以每个字符作为单词的起始字符向后查询,
abc
输入
123abc123,命中abc

敏感词过滤算法(c++实现)  


  • 2
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
敏感词检测是一种文本过滤技术,可以通过对文本进行过滤来保护用户免受有害信息和不良言论的影响。下面是一个用C++实现敏感词检测的后端的示例代码: ```c++ #include <iostream> #include <string> #include <vector> #include <fstream> using namespace std; class TrieNode { public: TrieNode() { for (int i = 0; i < 26; i++) { next[i] = nullptr; } is_end = false; } TrieNode* next[26]; bool is_end; }; class TrieTree { public: TrieTree() { root = new TrieNode(); } void insert(string word) { TrieNode* p = root; for (char c : word) { if (p->next[c - 'a'] == nullptr) { p->next[c - 'a'] = new TrieNode(); } p = p->next[c - 'a']; } p->is_end = true; } bool search(string word) { TrieNode* p = root; for (char c : word) { if (p->next[c - 'a'] == nullptr) { return false; } p = p->next[c - 'a']; } return p->is_end; } bool startsWith(string prefix) { TrieNode* p = root; for (char c : prefix) { if (p->next[c - 'a'] == nullptr) { return false; } p = p->next[c - 'a']; } return true; } private: TrieNode* root; }; int main() { TrieTree tree; ifstream fin("sensitive_words.txt"); if (fin) { string line; while (getline(fin, line)) { tree.insert(line); } fin.close(); } string text; cout << "请输入文本:" << endl; getline(cin, text); vector<string> sensitive_words; for (int i = 0; i < text.length(); i++) { for (int j = 1; j <= 10 && i + j <= text.length(); j++) { string word = text.substr(i, j); if (tree.search(word)) { sensitive_words.push_back(word); } } } if (sensitive_words.empty()) { cout << "文本中没有敏感词。" << endl; } else { cout << "文本中的敏感词有:" << endl; for (string word : sensitive_words) { cout << word << endl; } } return 0; } ``` 上述代码主要使用了Trie,通过将敏感词构建成Trie,可以快速地进行检索。具体来说,首先从文件中读取敏感词并插入到Trie中,然后对输入的文本进行遍历,每次取出一个长度为1到10之间的子串,在Trie中查找是否存在该子串。如果存在,则将其添加到敏感词列表中。最后,输出敏感词列表即可。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值