【问题标题】:Remove lines with crazy symbols删除带有疯狂符号的行
【发布时间】:2021-06-06 08:48:10
【问题描述】:

我有一个包含句子的列表,我相信其中一些被错误地编码。有些句子现在包含像 'hé' 这样的字符串。我想删除所有的句子,包含带有类似疯狂符号的单词。我已经尝试了下面的代码,它已经部分起作用了。我想删除的很多句子都被删除了,但不是全部。有什么想法吗?

clean_sentences = []
lines_to_erase = []
characters = "éÂ�Ä¢¬"
for line in all_data:
    for char in line:
      if char in characters:
        lines_to_erase.append(line)
for line in all_data:
    if line not in lines_to_erase:
        clean_sentences.append(line.strip())

【问题讨论】:

    标签: python nlp preprocessor


    【解决方案1】:

    len(x) == len(x.encode())

    如果字符是通用 ascii 值,则返回 True

    使用它,您可以遍历所有字符并返回文本但没有非 ascii 字符

    [x for x in arr if len(x) == len(x.encode())]
    

    如果你想删除所有包含非 ascii 字符的句子,遍历所有行,然后如果遇到非 ascii 字符,它不会将其添加到最终列表中

    end = []
    for x in sentences:
        badchar = false
        for char in x:
            if len(char) == len(char.encode()):
                badchar = True
                break
        if not(badchar): end.append(sentence)
    

    【讨论】:

    • btw "\b""\r""\x00" 都是 ascii 字符,但不被视为有效
    • 哦,是的,这是真的,所以如果我没记错的话,在 if 语句中添加 and in "\b\r\x00" 应该可以工作
    • "\x01""\x02"、...怎么样?使用<str>.isprintable
    【解决方案2】:

    如果您使用的是英文文本,您可以使用 translate() 来检测不可打印的 ascii 字符的存在:

    import string
    
    invalidChars = str.maketrans('','',string.printable) # remove valid characters
    
    all_data = ["Good line.",
                "Bad éÂ�Ä¢¬ line",
                "Other good line"]
    
    clean_sentences = [line for line in all_data if not line.translate(invalidChars)]
    
    print(*clean_sentences,sep="\n")
    
    Good line.
    Other good line
    

    您也可以通过指定无效字符来执行此操作。

    validChars = str.maketrans('','','éÂ�Ä¢¬')
    
    all_data = ["Good line.",
                "Bad é line with �Ä¢¬ characters",
                "Other good line"]
    
    clean_sentences = [line for line in all_data if line == line.translate(validChars)]
    
    print(*clean_sentences,sep="\n")
    
    Good line.
    Other good line
    

    但是,如果文本被错误地编码/解码,您应该会发现“疯狂符号”总是以相同的 2 个字符模式开头(其中应该有很少的变化)。在这种情况下,使用正则表达式可能会更好。

    【讨论】:

      【解决方案3】:

      您正在做的是尝试查找一行是否包含“éÂ�Ä¢¬”,而不是其中一个。您可以做的是将变量“字符”更改为包含这些字符的列表。比如:

      clean_sentences = []
      lines_to_erase = []
      characters = ["Ã", "©", "Â", "�", "Ä", "¢", "¬"]
      for line in all_data:
          for char in line:
            if char in characters:
              lines_to_erase.append(line)
      for line in all_data:
          if line not in lines_to_erase:
              clean_sentences.append(line.strip())
      

      因此,在这种情况下,您需要检查一行是否包含“characters”变量中的任何字符。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2015-08-24
        • 1970-01-01
        • 1970-01-01
        • 2015-07-12
        • 2020-11-13
        • 1970-01-01
        • 2014-08-21
        • 2010-12-12
        相关资源
        最近更新 更多