gpt4 book ai didi

python - 用符号序列替换字符串中的关键字

转载 作者:行者123 更新时间:2023-11-28 21:31:05 25 4
gpt4 key购买 nike

作为练习,我必须创建一个简单的脏话过滤器才能了解类(class)。

过滤器使用攻击性关键字列表和替换模板进行初始化。任何出现的这些单词都应该替换为从模板生成的字符串。如果字长比模板短,则应使用从头开始的子字符串,对于较长的字长,应根据需要重复模板。

以下是我迄今为止的结果,并附有示例。

class ProfanityFilter:

def __init__(self, keywords, template):
self.__keywords = sorted(keywords, key=len, reverse=True)
self.__template = template

def filter(self, msg):

def __replace_letters__(old_word, replace_str):
replaced_word = ""
old_index = 0
replace_index = 0
while old_index <= len(old_word):
if replace_index == len(replace_str):
replace_index = 0
else:
replaced_word += replace_str[replace_index]
replace_index += 1

old_index += 1

return replaced_word

for keyword in self.__keywords:
idx = 0
while idx < len(msg):
index_l = msg.lower().find(keyword.lower(), idx)
if index_l == -1:
break
msg = msg[:index_l] + __replace_letters__(keyword, self.__template) + msg[index_l + len(keyword):]
idx = index_l + len(keyword)

return msg


f = ProfanityFilter(["duck", "shot", "batch", "mastard"], "?#$")
offensive_msg = "this mastard shot my duck"
clean_msg = f.filter(offensive_msg)
print(clean_msg) # should be: "this ?#$?#$? ?#$? my ?#$?"

示例应打印:

this ?#$?#$? ?#$? my ?#$?

但它打印:

this ?#$?#$ ?#$? my ?#$?

出于某种原因,它用 6 个符号而不是 7 个符号(每个字母一个)替换了单词“mastard”。它适用于其他关键字,为什么不适用于这个?


此外,如果您发现任何其他问题,请随时告诉我。请记住,我是一个初学者,我的“工具箱”很小。

最佳答案

您的问题出在索引逻辑中。你有两个错误

  1. 每次到达替换字符串的末尾时,都会跳过脏话中的一个字母:

        while old_index <= len(old_word):
    if replace_index == len(replace_str):
    replace_index = 0
    # You don't replace a letter; you just reset the new index, but ...
    else:
    replaced_word += replace_str[replace_index]
    replace_index += 1

    old_index += 1 # ... but you still advance the old index.

您没有注意到这一点的原因是您有一个第二个错误:您从 0 len(old_word) 运行 old_index,即 1 >比你开始时更有个性。对于规范的四字母单词(或 5 或 6 个字符的单词),这两个错误相互抵消。你没有看到这个是因为你没有进行足够的测试。例如,使用:

f = ProfanityFilter(["StackOverflow", "PC"], "?#$")
offensive_msg = "StackOverflow on PC rulez!"
clean_msg = f.filter(offensive_msg)

输出:

?#$?#$?#$?# on ?#$ rulez!

输入的单词为13个和2个字母;替代者为 11 和 3。

修复这两个错误:使 old_index 保持在范围内,并且仅在进行替换时才增加它。

        while old_index < len(old_word):
if replace_index == len(replace_str):
replace_index = 0
else:
replaced_word += replace_str[replace_index]
replace_index += 1
old_index += 1

future 的改进:

  • 将其重构为 for 循环。
  • 不要重置你的replace_index;事实上,摆脱它。只需使用 old_index % len(replace_str)

关于python - 用符号序列替换字符串中的关键字,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58920025/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com