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

