本文目录导读:

- 简单替换法(基础版)
- 正则表达式过滤法
- 字典树(Trie)过滤法(高效版)
- 使用第三方库:
better_profanity - 使用第三方库:
filter.py - 完整项目示例(带文件读取)
- 性能优化建议
- 使用建议
- 注意事项
我来为你介绍几种Python敏感词过滤的实现方法:
简单替换法(基础版)
def simple_filter(text, sensitive_words):
"""
简单的敏感词替换
"""
filtered_text = text
for word in sensitive_words:
filtered_text = filtered_text.replace(word, '*' * len(word))
return filtered_text
# 使用示例
sensitive_words = ['敏感词1', '敏感词2', '违法内容']
text = "这是一个包含敏感词1和敏感词2的文本"
result = simple_filter(text, sensitive_words)
print(result) # 这是一个包含***和***的文本
正则表达式过滤法
import re
def regex_filter(text, sensitive_words):
"""
使用正则表达式过滤敏感词
"""
pattern = '|'.join(re.escape(word) for word in sensitive_words)
return re.sub(pattern, lambda x: '*' * len(x.group()), text)
# 使用示例
sensitive_words = ['敏感词', '违法', '违规']
text = "这段文本包含敏感词和违法内容"
result = regex_filter(text, sensitive_words)
print(result) # 这段文本包含***和**内容
字典树(Trie)过滤法(高效版)
class TrieNode:
def __init__(self):
self.children = {}
self.is_end = False
class SensitiveFilter:
def __init__(self, sensitive_words):
self.root = TrieNode()
self.build_trie(sensitive_words)
def build_trie(self, words):
"""构建字典树"""
for word in words:
node = self.root
for char in word:
if char not in node.children:
node.children[char] = TrieNode()
node = node.children[char]
node.is_end = True
def filter(self, text, replace_char='*'):
"""过滤敏感词"""
result = list(text)
i = 0
while i < len(text):
node = self.root
j = i
# 尝试匹配敏感词
while j < len(text) and text[j] in node.children:
node = node.children[text[j]]
j += 1
if node.is_end:
# 找到敏感词,替换
for k in range(i, j):
result[k] = replace_char
break
i += 1
return ''.join(result)
# 使用示例
words = ['敏感词', '违法', '不良信息']
filter_obj = SensitiveFilter(words)
text = "这段内容包含敏感词和违法内容,请过滤不良信息"
result = filter_obj.filter(text)
print(result) # 这段内容包含***和**内容,请过滤****
使用第三方库:better_profanity
# 首先安装:pip install better_profanity from better_profanity import profanity # 初始化 profanity.load_censor_words() # 添加自定义敏感词 custom_words = ['敏感词1', '敏感词2'] profanity.add_censor_words(custom_words) # 检查是否包含敏感词 text = "这是一个敏感词1的测试文本" print(profanity.contains_profanity(text)) # True # 过滤敏感词 print(profanity.censor(text)) # 这是一个***的测试文本
使用第三方库:filter.py
# 安装:pip install filter-py
from filter import Filter
# 初始化过滤器
filter_obj = Filter()
# 添加敏感词
filter_obj.add_words(['敏感词1', '敏感词2'])
# 过滤文本
text = "这段包含敏感词1和敏感词2"
result = filter_obj.filter(text)
print(result) # 这段包含***和***
# 从文件加载敏感词列表
# filter_obj.add_from_file('sensitive_words.txt')
完整项目示例(带文件读取)
import re
from typing import List, Set
class SensitiveWordFilter:
def __init__(self, word_list: List[str] = None):
self.sensitive_words: Set[str] = set()
if word_list:
self.add_words(word_list)
def add_words(self, words: List[str]):
"""添加敏感词"""
self.sensitive_words.update(words)
def add_from_file(self, file_path: str, encoding='utf-8'):
"""从文件读取敏感词"""
try:
with open(file_path, 'r', encoding=encoding) as f:
for line in f:
word = line.strip()
if word and not word.startswith('#'):
self.sensitive_words.add(word)
except FileNotFoundError:
print(f"文件 {file_path} 不存在")
def filter_text(self, text: str, replace_char='*', word_level=True) -> str:
"""
过滤敏感词
:param text: 待过滤文本
:param replace_char: 替换字符
:param word_level: 是否按词替换(True替换整个词,False逐字替换)
"""
filtered = text
for word in sorted(self.sensitive_words, key=len, reverse=True):
if word_level:
filtered = filtered.replace(word, replace_char * len(word))
else:
# 每个字单独替换
for char in word:
filtered = filtered.replace(char, replace_char)
return filtered
def check_sensitive(self, text: str) -> List[str]:
"""检查文本中的敏感词"""
found = []
for word in self.sensitive_words:
if word in text:
found.append(word)
return found
def censor_text(self, text: str, replace_char='*') -> str:
"""更智能的过滤(保留标点符号)"""
# 构建正则模式
pattern = '|'.join(re.escape(word) for word in self.sensitive_words)
return re.sub(pattern, lambda m: replace_char * len(m.group()), text)
# 使用示例
def main():
# 初始化过滤器
filter_obj = SensitiveWordFilter()
# 添加敏感词
filter_obj.add_words(['暴力', '色情', '赌博', '毒品'])
# 从文件加载(如果有敏感词文件)
# filter_obj.add_from_file('sensitive_words.txt')
# 测试文本
test_text = """
这是一个正常的文章内容。
但是包含了一些暴力内容,还有赌博信息。
请大家自觉遵守规定。
"""
# 检查敏感词
sensitive_found = filter_obj.check_sensitive(test_text)
if sensitive_found:
print(f"发现敏感词: {sensitive_found}")
# 过滤文本
filtered_text = filter_obj.filter_text(test_text)
print("过滤后:")
print(filtered_text)
if __name__ == '__main__':
main()
性能优化建议
# 高效的过滤方法(使用set和字符串方法)
def fast_filter(text: str, sensitive_words: List[str], replace_char='*') -> str:
"""
快速过滤敏感词(适用于大量敏感词)
"""
# 建立替换映射
word_to_asterisks = {
word: replace_char * len(word)
for word in sensitive_words
}
# 按长度排序,避免部分替换问题
sorted_words = sorted(sensitive_words, key=len, reverse=True)
# 逐词替换
result = text
for word in sorted_words:
result = result.replace(word, word_to_asterisks[word])
return result
# 使用生成器提高内存效率
def filter_generator(text: str, sensitive_words: List[str]):
"""使用生成器逐个字符处理"""
i = 0
while i < len(text):
matched = False
# 尝试匹配最长的敏感词
for word in sorted(sensitive_words, key=len, reverse=True):
if text[i:i+len(word)] == word:
yield '*' * len(word)
i += len(word)
matched = True
break
if not matched:
yield text[i]
i += 1
# 使用示例
text = "测试文本包含敏感词1"
for chunk in filter_generator(text, ['敏感词1']):
print(chunk, end='')
使用建议
- 小型项目:使用简单的字符串替换或正则表达式
- 中型项目:使用字典树实现
- 大型项目:考虑使用专门的第三方库
- 中文处理:注意分词和边界处理
- 性能考虑:使用set、预编译正则、字典树等方法
注意事项
- 敏感词列表需要定期更新
- 考虑词语的变体(如谐音、拆分等)
- 注意误判问题(如名字中包含敏感字)
- 大文本处理时注意内存和性能
选择哪种方法取决于你的具体需求、文本规模和性能要求。