Python实现敏感词过滤的五种方法

 更新时间:2025年04月04日 09:21:57   作者:IT之一小佬  
在我们生活中的一些场合经常会有一些不该出现的敏感词,我们通常会使用*去屏蔽它,一些骂人的敏感词和一些政治敏感词都不应该出现在一些公共场合中,这个时候我们就需要一定的手段去屏蔽这些敏感词,下面我来介绍一些简单版本的Python敏感词屏蔽的方法,需要的朋友可以参考下

1、replace替换

replace就是最简单的字符串替换,当一串字符串中有可能会出现的敏感词时,我们直接使用相应的replace方法用*替换出敏感词即可。

缺点:

文本和敏感词少的时候还可以,多的时候效率就比较差了。

示例代码:

text = '我是一个来自星星的超人,具有超人本领!'
text = text.replace("超人", '*' * len("超人")).replace("星星", '*' * len("星星"))
print(text)  # 我是一个来自***的***,具有***本领!

运行结果:

如果是多个敏感词可以用列表进行逐一替换。

示例代码:

text = '我是一个来自星星的超人,具有超人本领!'
words = ['超人', '星星']
 
for word in words:
    text = text.replace(word, '*' * len(word))
print(text)  # 我是一个来自***的***,具有***本领!

运行效果:

2、正则表达式

使用正则表达式是一种简单而有效的方法,可以快速地匹配敏感词并进行过滤。在这里我们主要是使用“|”来进行匹配,“|”的意思是从多个目标字符串中选择一个进行匹配。

示例代码:

import re
 
 
def filter_words(text, words):
    pattern = '|'.join(words)
    return re.sub(pattern, '***', text)
 
 
if __name__ == '__main__':
    text = '我是一个来自星星的超人,具有超人本领!'
    words = ['超人', '星星']
    res = filter_words(text, words)
    print(res)  # 我是一个来自***的***,具有***本领!

运行结果:

3、使用ahocorasick第三方库

ahocorasick库安装:

pip install pyahocorasick

示例代码:

import ahocorasick
 
 
def filter_words(text, words):
    A = ahocorasick.Automaton()
    for index, word in enumerate(words):
        A.add_word(word, (index, word))
    A.make_automaton()
 
    result = []
    for end_index, (insert_order, original_value) in A.iter(text):
        start_index = end_index - len(original_value) + 1
        result.append((start_index, end_index))
 
    for start_index, end_index in result[::-1]:
        text = text[:start_index] + '*' * (end_index - start_index + 1) + text[end_index + 1:]
    return text
 
 
if __name__ == '__main__':
    text = '我是一个来自星星的超人,具有超人本领!'
    words = ['超人', '星星']
    res = filter_words(text, words)
    print(res)  # 我是一个来自***的***,具有***本领!

运行结果:

4、字典树

使用字典树是一种高效的方法,可以快速地匹配敏感词并进行过滤。

示例代码:

class TreeNode:
    def __init__(self):
        self.children = {}
        self.is_end = False
 
 
class Tree:
    def __init__(self):
        self.root = TreeNode()
 
    def insert(self, word):
        node = self.root
        for char in word:
            if char not in node.children:
                node.children[char] = TreeNode()
            node = node.children[char]
        node.is_end = True
 
    def search(self, word):
        node = self.root
        for char in word:
            if char not in node.children:
                return False
            node = node.children[char]
        return node.is_end
 
 
def filter_words(text, words):
    tree = Tree()
    for word in words:
        tree.insert(word)
 
    result = []
    for i in range(len(text)):
        node = tree.root
        for j in range(i, len(text)):
            if text[j] not in node.children:
                break
            node = node.children[text[j]]
            if node.is_end:
                result.append((i, j))
    for start_index, end_index in result[::-1]:
        text = text[:start_index] + '*' * (end_index - start_index + 1) + text[end_index + 1:]
    return text
 
 
if __name__ == '__main__':
    text = '我是一个来自星星的超人,具有超人本领!'
    words = ['超人', '星星']
    res = filter_words(text, words)
    print(res)  # 我是一个来自***的***,具有***本领!

运行结果:

5、DFA算法

使用DFA算法是一种高效的方法,可以快速地匹配敏感词并进行过滤。DFA的算法,即Deterministic Finite Automaton算法,翻译成中文就是确定有穷自动机算法。它的基本思想是基于状态转移来检索敏感词,只需要扫描一次待检测文本,就能对所有敏感词进行检测。

示例代码:

class DFA:
    def __init__(self, words):
        self.words = words
        self.build()
 
    def build(self):
        self.transitions = {}
        self.fails = {}
        self.outputs = {}
        state = 0
        for word in self.words:
            current_state = 0
            for char in word:
                next_state = self.transitions.get((current_state, char), None)
                if next_state is None:
                    state += 1
                    self.transitions[(current_state, char)] = state
                    current_state = state
                else:
                    current_state = next_state
            self.outputs[current_state] = word
        queue = []
        for (start_state, char), next_state in self.transitions.items():
            if start_state == 0:
                queue.append(next_state)
                self.fails[next_state] = 0
        while queue:
            r_state = queue.pop(0)
            for (state, char), next_state in self.transitions.items():
                if state == r_state:
                    queue.append(next_state)
                    fail_state = self.fails[state]
                    while (fail_state, char) not in self.transitions and fail_state != 0:
                        fail_state = self.fails[fail_state]
                    self.fails[next_state] = self.transitions.get((fail_state, char), 0)
                    if self.fails[next_state] in self.outputs:
                        self.outputs[next_state] += ', ' + self.outputs[self.fails[next_state]]
 
    def search(self, text):
        state = 0
        result = []
        for i, char in enumerate(text):
            while (state, char) not in self.transitions and state != 0:
                state = self.fails[state]
            state = self.transitions.get((state, char), 0)
            if state in self.outputs:
                result.append((i - len(self.outputs[state]) + 1, i))
        return result
 
 
def filter_words(text, words):
    dfa = DFA(words)
    result = []
    for start_index, end_index in dfa.search(text):
        result.append((start_index, end_index))
    for start_index, end_index in result[::-1]:
        text = text[:start_index] + '*' * (end_index - start_index + 1) + text[end_index + 1:]
    return text
 
 
if __name__ == '__main__':
    text = '我是一个来自星星的超人,具有超人本领!'
    words = ['超人', '星星']
    res = filter_words(text, words)
    print(res)  # 我是一个来自***的***,具有***本领!

运行结果:

到此这篇关于Python实现敏感词过滤的五种方法的文章就介绍到这了,更多相关Python敏感词过滤内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Python中常用信号signal类型实例

    Python中常用信号signal类型实例

    这篇文章主要介绍了Python中常用信号signal类型实例,分享了相关代码示例,小编觉得还是挺不错的,具有一定借鉴价值,需要的朋友可以参考下
    2018-01-01
  • 用生成器来改写直接返回列表的函数方法

    用生成器来改写直接返回列表的函数方法

    下面小编就为大家带来一篇用生成器来改写直接返回列表的函数方法。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-05-05
  • Python list sort方法的具体使用

    Python list sort方法的具体使用

    list.sort()方法是Python的列表方法,用于对原列表进行排序。本文详细的介绍了list.sort的具体使用,具有一定的参考价值,感兴趣的可以了解一下
    2021-12-12
  • pycharm显示远程图片的实现

    pycharm显示远程图片的实现

    这篇文章主要介绍了pycharm显示远程图片的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2019-11-11
  • Python轻松实现在Excel工作表中应用条件格式

    Python轻松实现在Excel工作表中应用条件格式

    在日常数据处理工作中,条件格式是一项非常实用的功能,本文将介绍如何使用 Python 和 Spire.XLS 库在 Excel 工作表中应用多种类型的条件格式,有需要的小伙伴库参考下
    2026-05-05
  • Python绘图库之pyqtgraph的用法详解

    Python绘图库之pyqtgraph的用法详解

    PyQtGraph建立在Qt QGraphicsScene的原生库,可提供更好更高性能绘图能力,特别是对于实时数据,可以提供交互性和使用Qt图形小部件轻松自定义绘图的能力。本文就来解释一下pyqtgraph的用法,需要的可以收藏一下
    2022-12-12
  • pandas读取csv文件,分隔符参数sep的实例

    pandas读取csv文件,分隔符参数sep的实例

    今天小编就为大家分享一篇pandas读取csv文件,分隔符参数sep的实例,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2018-12-12
  • python对常见数据类型的遍历解析

    python对常见数据类型的遍历解析

    这篇文章主要介绍了python对常见数据类型的遍历解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2019-08-08
  • Python高效实现CSV数据转换为规范的Excel文件

    Python高效实现CSV数据转换为规范的Excel文件

    在当今数据驱动的世界中,CSV(逗号分隔值)和Excel(电子表格)是两种最常见的数据存储和交换格式,本文将深入探讨如何使用一个强大的Python库,将CSV文件高效地转换为结构化且美观的Excel文件,感兴趣的小伙伴可以了解下
    2026-01-01
  • python中对开区间和闭区间的理解

    python中对开区间和闭区间的理解

    这篇文章主要介绍了python中对开区间和闭区间的理解,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-07-07

最新评论