提问者:小点点

Python-不带标点符号的字符串到列表中


我有一个带有句子的文件,我需要做一个函数,将句子分割成一个以单词为元素的列表,但删除所有标点符号。这就是我所拥有的:

def listWords(filename):
    sentence = []
    
    file = open(filename, "r")
    line = file.read()

    line = line.translate(str.maketrans(' ', ' ', '".,())'))
    for word in line.split():
        sentence.append(word.lower())

    file.close()
    return sentence

它接近工作,但有一个连字符的单词,只是放在一起作为一个词,我需要它拆分。像1,2这样的十进制数也会像这样分裂[“1”,“2”],我不想这样。

有没有更好的办法解决这个问题?也许是一个更简单的解决方案?我想可能是有意使用字符串。标点符号,但我不确定如何解决这些问题


共2个答案

匿名用户

NLTK是一个伟大的自然语言处理工具。您还可以将正则表达式与nltk.tokenize一起使用,按您的意愿对文本进行标记。以下正则表达式表示任何重复多次的字母数字字符:

from nltk.tokenize import RegexpTokenizer

tokenizer = RegexpTokenizer(r'\w+')

print(tokenizer.tokenize("I. love - stack ! overflow so 1, 2 much! "))

输出:['I','love','stack','overflow','so','1','2','much']

匿名用户

您可以编写一个函数,从列表或字符串中删除标点符号——无论传递哪个。像这样:

In[]: dirty_str_ex = 'Th$$is. is! a? !very-dirty$$ str@@ing'

In[]: def remove_punc(data): 
          punc = '''!()-[]{};:'"\, <>./?@#$%^&*_~'''
          if isinstance(data,str) == True:
              for i in data:  
                  if i in punc:  
                      data = data.replace(i, "")
           elif isinstance(data,list) == True:
              data = [remove_punc(i) for i in data]
          return data

In[]: remove_punc(dirty_str_ex)
Out[]: 'Thisisaverydirtystring'

In[]: dirty_str_lst = dirty_str_ex.split() ; print(dirty_str_lst) #splits str to lst of strings
Out[]: ['Th$$is.', 'is!', 'a?', '!very-dirty$$', 'str@@ing']

#pass the dirty list of strings to remove punctuation

In[]: remove_punc(dirty_str_lst)
Out[]: ['This', 'is', 'a', 'verydirty', 'string']