Python中如何实现关键词匹配与黑名单过滤?

文件 A 有 100 个正常关键词,一行一个(正常关键词,每个关键词字符较长)
文件 B 有 5 个关键词,一行一个(黑名单词根,每个关键词字符较短)
用 Python
如果 A 中的某个关键词含有 B 中的任何一个词根,则将该关键词保存在文件 C
如果 A 中的某个关键词不含 B 中的任何一个词根,则将该关键词保存在文件 D
Python中如何实现关键词匹配与黑名单过滤?

7 回复

所以说你想问什么?


class KeywordFilter:
    def __init__(self, blacklist=None):
        self.blacklist = set(blacklist or [])
        self.trie = {}
        self._build_trie()
    
    def _build_trie(self):
        """构建前缀树用于高效匹配"""
        for word in self.blacklist:
            node = self.trie
            for char in word:
                node = node.setdefault(char, {})
            node['#'] = True  # 结束标记
    
    def add_keyword(self, word):
        """动态添加关键词"""
        self.blacklist.add(word)
        node = self.trie
        for char in word:
            node = node.setdefault(char, {})
        node['#'] = True
    
    def contains_keyword(self, text):
        """检查文本是否包含黑名单关键词"""
        text = text.lower()
        for i in range(len(text)):
            node = self.trie
            for j in range(i, len(text)):
                if text[j] not in node:
                    break
                node = node[text[j]]
                if '#' in node:
                    return True
        return False
    
    def filter_text(self, text, replace_char='*'):
        """过滤文本中的关键词"""
        result = list(text)
        text_lower = text.lower()
        
        for i in range(len(text)):
            node = self.trie
            for j in range(i, len(text_lower)):
                if text_lower[j] not in node:
                    break
                node = node[text_lower[j]]
                if '#' in node:
                    # 替换匹配到的关键词
                    for k in range(i, j + 1):
                        result[k] = replace_char
                    break
        return ''.join(result)

# 使用示例
if __name__ == "__main__":
    # 初始化黑名单
    blacklist = ["bad", "spam", "fraud"]
    filter = KeywordFilter(blacklist)
    
    # 测试文本
    test_texts = [
        "This is a bad example",
        "No issues here",
        "Watch out for spam content",
        "fraud alert!"
    ]
    
    for text in test_texts:
        print(f"原文: {text}")
        print(f"包含关键词: {filter.contains_keyword(text)}")
        print(f"过滤后: {filter.filter_text(text)}")
        print("-" * 40)
    
    # 动态添加关键词
    filter.add_keyword("hack")
    print(f"添加'hack'后检测: {filter.contains_keyword('hacking attempt')}")

这个实现用了前缀树来匹配关键词,比单纯循环查找要快得多,特别是黑名单很大的时候。contains_keyword方法检查文本是否包含任何黑名单词,filter_text方法会把匹配到的词替换成指定字符。动态添加关键词用add_keyword就行。

简单说就是:用前缀树搞关键词匹配,又快又灵活。

伸手党

不是伸手党,谢谢,如果 A 中的某个关键词含有 B 中的任何一个词根,则将该关键词保存在文件 C,这个条件能写出来。。
如果 A 中的某个关键词不含 B 中的任何一个词根,则将该关键词保存在文件 D,这个条件该怎么写?

请问,如果 A 中的某个关键词不含 B 中的任何一个词根,则将该关键词保存在文件 D
这个逻辑要怎么实现

…… LZ 是完全没编过程么

给你个提示:if else

回到顶部