【问题标题】:I need help to automatically DEcensore a text (lot's of text to be prosseced)我需要帮助自动删除文本(要处理大量文本)
【发布时间】:2022-11-20 02:38:27
【问题描述】:

我有一个网络故事,其中包含带有星号的文字

现在我正在用一个简单而愚蠢的 str.replace 来做

但你可以想象这很痛苦,我需要在文本中搜索以找到审查的所有实例

这是混蛋实例,在不同的地方都是大写的、复数的和带有星号的

toReplace = toReplace.replace("b*stard", "bastard")
toReplace = toReplace.replace("b*stards", "bastards")
toReplace = toReplace.replace("B*stard", "Bastard")
toReplace = toReplace.replace("B*stards", "Bastards")
toReplace = toReplace.replace("b*st*rd", "bastard")
toReplace = toReplace.replace("b*st*rds", "bastards")
toReplace = toReplace.replace("B*st*rd", "Bastard")
toReplace = toReplace.replace("B*st*rds", "Bastards")

有没有办法将所有带有“*”(或任何其他替换字符)的单词与已编译的字典进行比较,并将它们替换为未经审查的单词版本? 也许是正则表达式,但我不这么认为

【问题讨论】:

  • 是的,有或没有正则表达式都是可能的。
  • docs.python.org/3/library/fnmatch.html#fnmatch.filter 允许您对字符串列表执行全局匹配;如果在评估过滤器之前将其与从排序字典生成选择性列表配对,它也应该有效。
  • 尽管这本身并不能解决主要问题,但请注意,仅对单数词进行替换(因为它们包含在复数形式中)可以将痛苦减半。

标签: python string dictionary replace


【解决方案1】:

单独使用正则表达式可能不会为此提供完整的解决方案。如果您有一个要恢复的单词的简单列表,并使用 Levenshtein distance 确定哪个最接近您在其中找到 * 的给定单词,您可能会更轻松。

一个可能对此有所帮助的图书馆是fuzzywuzzy

我可以快速想到的两种方法:

  • 拆分文本,使每个单词有 1 个字符串。对于每个单词,如果是'*' in word,则将其与替换列表进行比较以找到最接近的单词。
  • 使用re.sub 来识别包含* 字符的单词,并编写一个函数作为repl 参数来确定它最接近哪个替换并返回该替换。

额外资源:

【讨论】:

    【解决方案2】:

    您可以使用re 模块来查找被审查的单词和您的单词列表中的单词之间的匹配项。

    *替换为.(点在正则表达式中有特殊含义,表示“匹配每个字符”),然后使用re.match

    import re
    
    wordlist = ["bastard", "apple", "orange"]
    
    
    def find_matches(censored_word, wordlist):
        pat = re.compile(censored_word.replace("*", "."))
        return [w for w in wordlist if pat.match(w)]
    
    
    print(find_matches("b*st*rd", wordlist))
    

    印刷:

    ['bastard']
    

    注意:如果你想匹配精确的词,在你的模式末尾添加$。例如,这意味着 appl* 与您的字典中的 applejuice 不匹配。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-10-22
      • 1970-01-01
      • 1970-01-01
      • 2013-11-29
      • 1970-01-01
      相关资源
      最近更新 更多