Python语料数据清洗方法之一
语料库研究已经成为科学研究公认的相比较权威的研究范式。在开始使用语料库研究前需要对文本进行清洁处理,除了清除空段、删除字符前后的空格、制表位外,我还要需要对文本进行分词、筛选、去重等操作。普通的语料库工具可能需要来回切换,同时文本的处理速度也会不尽如人意,如果使用Python就可以利用NLTK等自然语料处理工具、以及Python中常用的文本处理模块进行文本处理。
一、清除字符串前后的无效字符
我们可以采用strip()这个方法,它可以清除字符串前后的空格、制表位、换行符等。如下例:
text = " Corpus Analysis in Academic Research \r\n"
print(text.strip())
操作示例
还可以使用strip()把字符串前后的无效字符删除,如下面的这个例子。
text = " aaa 语料库分析在科学研究中的应用 ppp"
print(text.strip("a|p| "))
采用以上方法,可以把多余的字母a或p或空格删除掉。注意使用正则表达式时,需要用引号括起来。
删除多余的字符
二、清除数字但不清除带有数字的单词
在Python中我们可以使用isdigit()清除所有数字,用isalpha()清除所有字母。但是需要注意的是,如果想保留带有数字的单词,如5-year-old这个词,就需要使用not word.isdigit(), 因为isdigit()可以用于判断字符是否由数字构成。
所以要清除句子中的数字,可以先使用nltk.word_tokenize()分词,然后用集合推导式,清除数字,同时去重。
import nltk
text = 'This handbook contains 3 volumes. The 5-year-survival rate was elevated. The rate is amazing.'
tokenized_text = nltk.word_tokenize(text)
print({word.lower() for word in tokenized_text if not word.isdigit()})
去数字+去重
三、清除数据中的标点并把单词改为小写字母
我们可以从string中导入puctuation这个模块,然后在集合推导式用用它去标点。可以用word.lower()的方法把单词的大写都改为小写。
import nltk
from string import punctuation
text = 'This handbook contains 3 volumes. The 5-year-survival rate was elevated. The rate is amazing.'
tokenized_text = nltk.word_tokenize(text)
print({word.lower() for word in tokenized_text if not word.isdigit() and word not in punctuation})
四、如何提升清理速度
以上代码使用的是nltk中的分词工具,在数据比较多时会相对慢一些,如果在要求不是特别严格的情况下,可以使用re正则模块进行分词,这样可以大大提升分词的速度。
使用re的好处是直接定义词的构成,不需要再导入额外的模块清除标点了。re.findall()可以利用正则表达式,找到符合要求的词并提取出来。
import re
text = 'This handbook contains 3 volumes. The 5-year-survival rate was elevated. The rate is amazing.'
words = re.findall(r'[A-z-0-9]+', text) #定义一个词由数字、字母和-组成。
print({word.lower() for word in words if not word.isdigit()})
而且最后生成的效果和之前的一样。
对比nltk和re的分词结果
五、用SpaCy来实现快速清洗
除了使用NLTK、Re来实现文本清洗外,还可以使用SpaCy这个自然语言文本处理库,它自带预训练的管道,目前支持 60 多种语言的标记化和训练。由于它具有最先进的速度和神经网络模型,因此可用于标记、解析、命名实体识别、文本分类等。它的模型从sm(small),至md(medium),再到lg(large),准确性逐步提升,但是其个头也在不断增大。
使用SpaCy,我们不需要导入nltk, string等库,可以直接利用它的管道,一步到位。使用前需要先
通过:pip install spacy进行安装,下载相关模型,如en_core_web_sm,如果下载比较慢,可以直接去github上下载。需要注意的是,这里SpaCy直接把单词进行了还原,这是之前的方法所无法实现的,而且代码非常简洁,短短,几行代码就实现了变分词、变小写、词形还原、去标点、去停用词等功能,唯一的缺点时配置时有一点儿小麻烦,下面是一个样例代码供参考:
import spacy
nlp = spacy.load("en_core_web_sm")
doc = nlp("Apple is looking at buying U.K. startup.")
print({x.lemma_.lower() for x in doc if not x.is_stop and not x.is_punct})
使用SpaCy进行文本清洗
六、学后总结
1. Python在处理文本数据时,不仅精确而且速度还更快,减少了在多个软件的切换,可以满足个性化文本清理的要求。需要注意的是要添加多个工具之前的相互验证,减少因为疏忽而产生的问题。
2. 至于使用re还是word_tokenize需要根据你的数据结果要求,科学研究建议还是使用word_tokenize,因为这样更加严谨一些。