【问题标题】:Deleting large continuous blocks of lines separated by empty lines删除由空行分隔的大的连续行块
【发布时间】:2020-02-20 13:46:55
【问题描述】:

我有一个大型数据集,由以下形式的文本组成。

Vil [SENT]2 [POS]AUX [NUM]4 [DEP]aux O
du [SENT]2 [POS]PRON [NUM]4 [DEP]nsubj O
gerne [SENT]2 [POS]ADV [NUM]4 [DEP]advmod O
arbejde [SENT]2 [POS]VERB [NUM]0 [DEP]root O
med [SENT]2 [POS]ADP [NUM]9 [DEP]case O
et [SENT]2 [POS]DET [NUM]9 [DEP]det O
globalt [SENT]2 [POS]ADV [NUM]8 [DEP]advmod O
anerkendt [SENT]2 [POS]VERB [NUM]9 [DEP]amod O
brand [SENT]2 [POS]NOUN [NUM]4 [DEP]obl O
? [SENT]2 [POS]PUNCT [NUM]4 [DEP]punct O
XXX. [SENT]3 [POS]ADP [NUM]2 [DEP]case O
XXX [SENT]3 [POS]PROPN [NUM]0 [DEP]root O
XXX [SENT]3 [POS]NOUN [NUM]2 [DEP]flat O
, [SENT]3 [POS]PUNCT [NUM]2 [DEP]punct O
XXX [SENT]3 [POS]PROPN [NUM]2 [DEP]flat O
. [SENT]3 [POS]PUNCT [NUM]2 [DEP]punct O

Deltidsjob [SENT]4 [POS]NOUN [NUM]0 [DEP]root O
i [SENT]4 [POS]ADP [NUM]3 [DEP]case O
XXX [SENT]4 [POS]PROPN [NUM]1 [DEP]nmod O
XXX [SENT]4 [POS]NOUN [NUM]1 [DEP]nmod O
XXX [SENT]4 [POS]ADJ [NUM]6 [DEP]amod O
XXX [SENT]4 [POS]PROPN [NUM]1 [DEP]nmod O
. [SENT]4 [POS]PUNCT [NUM]1 [DEP]punct O

我正在使用 python 并想删除超过某个阈值的“行块”。也就是说,从一个空行到下一个空行的长度超过了阈值。我考虑过迭代行,保持计数并使用 while 循环跟踪,但有人能想出一个更优雅的解决方案吗?

【问题讨论】:

    标签: python python-3.x csv text


    【解决方案1】:

    我会分两步完成,首先找到空行的位置,然后提取小于阈值的块:

    cleaned_lines = []
    empty_lines = [i for i, line in enumerate(lines) if not line.strip()]
    for start, end in zip(empty_lines[:-1], empty_lines[1:]):
        if end-start < THRESHOLD:
            cleaned_lines.extend(lines[start + 1:end])
    

    我假设您的文件以空行作为块的分隔符开始和结束,但如果不是这种情况,只需在 empty_lines 的开头添加 -1 并在末尾添加 len(lines) 即可。

    【讨论】:

      【解决方案2】:
      sample = """Vil [SENT]2 [POS]AUX [NUM]4 [DEP]aux O
      du [SENT]2 [POS]PRON [NUM]4 [DEP]nsubj O
      gerne [SENT]2 [POS]ADV [NUM]4 [DEP]advmod O
      arbejde [SENT]2 [POS]VERB [NUM]0 [DEP]root O
      med [SENT]2 [POS]ADP [NUM]9 [DEP]case O
      et [SENT]2 [POS]DET [NUM]9 [DEP]det O
      globalt [SENT]2 [POS]ADV [NUM]8 [DEP]advmod O
      anerkendt [SENT]2 [POS]VERB [NUM]9 [DEP]amod O
      brand [SENT]2 [POS]NOUN [NUM]4 [DEP]obl O
      ? [SENT]2 [POS]PUNCT [NUM]4 [DEP]punct O
      XXX. [SENT]3 [POS]ADP [NUM]2 [DEP]case O
      XXX [SENT]3 [POS]PROPN [NUM]0 [DEP]root O
      XXX [SENT]3 [POS]NOUN [NUM]2 [DEP]flat O
      , [SENT]3 [POS]PUNCT [NUM]2 [DEP]punct O
      XXX [SENT]3 [POS]PROPN [NUM]2 [DEP]flat O
      . [SENT]3 [POS]PUNCT [NUM]2 [DEP]punct O
      
      Deltidsjob [SENT]4 [POS]NOUN [NUM]0 [DEP]root O
      i [SENT]4 [POS]ADP [NUM]3 [DEP]case O
      XXX [SENT]4 [POS]PROPN [NUM]1 [DEP]nmod O
      XXX [SENT]4 [POS]NOUN [NUM]1 [DEP]nmod O
      XXX [SENT]4 [POS]ADJ [NUM]6 [DEP]amod O
      XXX [SENT]4 [POS]PROPN [NUM]1 [DEP]nmod O
      . [SENT]4 [POS]PUNCT [NUM]1 [DEP]punct O"""
      
      samples = sample.split('\n\n')
      threshold = 300
      
      remaining_samples = []
      
      for s in samples:
          if len(s) < threshold:
              remaining_samples.append(s)
      
      print(remaining_samples)
      

      【讨论】:

        猜你喜欢
        • 2016-08-17
        • 2016-07-08
        • 2011-01-16
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-11-06
        • 2013-12-16
        • 2012-10-12
        相关资源
        最近更新 更多