在语料库语言学中,为了得到词表,有时需要把英文切分成列表。这时就需要对字符串中的标点进行处理。
本人经过探索发现了几种不错的方法,供大家参考使用。
一、maketrans法
这种方法的原理就是导入string中的punctuation,然后利用maketrans建立起一个映射字典,均指向一空格键名。再通过str.translate()清除掉文本中的所有标点符号并替换为空格。
然后利用split()的方法,把字符按照空格来切分,这样所有的单词都会切分出来,不会出现单词和标点连在一起的情况了。
from string import punctuation as punct #引入punctuation模块,给它起个别名:punct
s="Hello! Life is short, and I like Python. Do you like it?" # 设定要替换的字符串
transtab=str.maketrans({key:" " for key in punct}) #生成映射字典,把所有标点映身为空格
s1=s.translate(transtab) # 批量映射后,把结果赋值给s1
print(s1)
显示结果如下:
二、re.split()切分法
和第一种方法类似,我们先导入string中的punctuation,获取标点符号的字符串,然后我们利用re.split(‘[,.!]’,string)的切分方法,再加入一个空格。最后,再利用列表推导式来去除原结果中的空元素。
import re
from string import punctuation as punct #引入punctuation模块,给它起个别名:punct
#
s="Hello! Life is short, and I like Python. Do you like it? Do" # 设定要替换的字符串
text = re.split("[{} ]".format(punct),s)
print([i for i in text if i!=""])
结果与第一种方法一样。
三、NLTK中的word_tokenize()法
这种方法需要导入自然语方处理工具包NLTK,然后利用其中的word_tokenize这个分词工具进行分词,接着再用列表推导式去除标点符号。代码如下:
from nltk import word_tokenize
s="Hello! Life is short, and I like Python. Do you like it? Do" # 设定要替换的字符串
print([i for i in word_tokenize(s) if i.isalpha()])
最终结果展示:
五、re. findall()法
我们利用正则表达式模块中的findall(), 根据正则表达式【[A-z-]+】查找所有的单词,并生成这些单词的列表。最后再通过i.lower()来最小化单词。
import re
s="Hello! Life is short, and I like Python. Do you like it? Do" # 设定要替换的字符串
text = re.findall("[A-z-]+",s)
print([i.lower() for i in text])
六、学后反思
1. 在实际操作中以上方法还存在一些问题。比如有些文本中的题目后面没有标点,所以切分规则里要加上【\n】,另外还有一些Dr. etc.这些词需要加入例外,这样切分时会保留标点符号。更为细致的分词我们后续可以继续探讨。
2. 以上方法中NLTK法需要安装nltk工具包,速度有点儿慢,配置上有点儿麻烦。maketrans法比较不太好理解,相比之下re.split()方法简单实用,可以随意添加规则,推荐大家使用。