我有一个带有句子的文件,我需要做一个函数,将句子分割成一个以单词为元素的列表,但删除所有标点符号。这就是我所拥有的:
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”],我不想这样。
有没有更好的办法解决这个问题?也许是一个更简单的解决方案?我想可能是有意使用字符串。标点符号,但我不确定如何解决这些问题
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']