【问题标题】:Remove punctuation marks from tokenized text using for loop使用 for 循环从标记化文本中删除标点符号
【发布时间】:2021-09-15 08:09:35
【问题描述】:

我正在尝试从 python 中的标记化文本中删除标点符号,如下所示:

word_tokens = ntlk.tokenize(text)
w = word_tokens
for e in word_tokens:
    if e in punctuation_marks:
        w.remove(e)

这有点工作,我设法删除了很多标点符号,但由于某种原因,word_tokens 中的许多标点符号仍然留下。 如果我再次运行代码,它会再次删除一些标点符号。运行相同的代码 3 次后,所有标记都将被删除。为什么会这样?

punctuation_marks 是列表、字符串还是字典似乎无关紧要。我也尝试过迭代 word_tokens.copy() 效果更好,它几乎第一次删除了所有标记,第二次删除了所有标记。 有没有一种简单的方法来解决这个问题,只运行一次代码就足够了?

【问题讨论】:

    标签: python for-loop nlp nltk punctuation


    【解决方案1】:

    您正在从您正在迭代的同一个列表中删除元素。您似乎意识到潜在的问题,这就是您添加以下行的原因:

    w = word_tokens

    但是,该行实际上并没有创建 word_tokens 引用的对象的副本,它只会使 w 引用同一个对象。为了创建副本,您可以使用切片运算符,将上面的行替换为:

    w = word_tokens[:]

    【讨论】:

      【解决方案2】:

      为什么不添加不是标点符号的标记呢?

      word_tokens = ntlk.tokenize(text)
      w = list()
      for e in word_tokens:
          if e not in punctuation_marks:
              w.append(e)
      

      建议: 我看到您正在创建单词标记。如果是这种情况,我建议您在标记文本之前删除标点符号。您可以使用已有的翻译功能(在字符串库下)。

      # Import the library
      import string
      
      # Initialize the translate to remove punctuations
      tr = str.maketrans("", "", string.punctuation)
      
      # Remove punctuations
      text = text.translate(tr)
      
      # Get the word tokens
      word_tokens = ntlk.tokenize(text)
      

      如果你想做句子标记化,那么你可以做如下的事情:

      from nltk.tokenize import sent_tokenize
      
      texts = sent_tokenize(text)
      for i in range(0, len(texts))
          texts[i] = texts[i].translate(tr)
      

      【讨论】:

        【解决方案3】:

        我建议您尝试正则表达式并将结果附加到新列表中,而不是直接操作 word_tokens 的结果:

        word_tokens = ntlk.tokenize(text)
        w_ = list()
        for e in word_tokens:
            w_.append(re.sub('[.!?\\-]', e))
        

        【讨论】:

          【解决方案4】:

          您正在修改实际的word_tokens,这是错误的。

          例如,假设您有类似A?!B 的内容,其索引为:A:0, ?:1, !:2, B:3。你的 for 循环有一个计数器(比如i),在每个循环中都会增加。假设您删除了使数组索引向后移动的?(意味着i=1)(新索引为:A:0, !:1, B:2)并且您的计数器递增(i=2)。所以你在这里错过了! 字符!

          最好不要弄乱原来的字符串,直接复制到一个新的。

          【讨论】:

            猜你喜欢
            • 2013-11-19
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2021-12-18
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多