English Text Mining: Preprocessing
文章主干来自下面Reference中的博客,我自己进行了增加整理,感谢所有分享知识的大佬们= =
1. Data Collection or Assembly 数据收集
【Given.】20_newsgroups.
数据用的是20_newsgroups语料库,下面是笔者在数据处理过程遇到的一些问题和解决,Python初学者都是泪T T
- 文件读写
- 文件夹下所有文件读取
- 二进制文本读取,参数问rb
- 读取文本后遇到的问题:cannot use a string pattern on a bytes-like object。编码问题,尝试decode解码成utf-8,新错误:UnicodeDecodeError: ‘gbk’ codec can’t decode byte 0xff in position 0: illegal multibyte sequence
- 解决方法 chardet模块检测编码,再解码,使用方法参见代码
- 20_newsgroups中atheism中53558文件编码有问题,检测不出,选择跳过,如下图:
- 如果自定义了和函数/头文件重名的变量则不可调用或import,显示not callable
- utf-8类型的str写入文件open时需指定encoding=’utf-8’
- 字典排序:sorted返回的是一个list,其中每一项为key和value组成的元组
2. Data Preprocessing 数据预处理
2.1 Tokenization & Segmentation 单词化 / 语块化 分词
下面基本都是单词化分词的方法。
2.1.1 Sentence Tokenize(分割句子)1
实际测试发现似乎没什么意义啊?这里不是很明白。
直接使用sent_tokenize
from sklearn.datasets import fetch_20newsgroups news = fetch_20newsgroups(subset='train') X,y = news.data,news.target text = X[0] from nltk.tokenize import sent_tokenize sent_tokenize_list = sent_tokenize(text) print(sent_tokenize_list)
使用nltk.tokenize.punkt中包含了很多预先训练好的tokenize模型。
from sklearn.datasets import fetch_20newsgroups news = fetch_20newsgroups(subset='train') X,y = news.data,news.target print(X[0]) news = X[0]
2.1.2 Word Tokenize(分割单词)1
from nltk.tokenize import word_tokenize
text='The cat is walking in the bedroom.'
sent_tokenize_list = word_tokenize(text)
print(sent_tokenize_list)
将句子分割成词。首先用正则表达式可以自己完成;如果要利用已有工具,Python NLTK中的word_tokenize(),这个方式就是前文提到的Penn TreeBank语料库所使用的分词方法。听起来是不是很高大上,我是不会告诉你其实它也是正则表达式实现的。分词其实主要干了这么几个事:
- 将’分开. don’t -> do n’t, they’ll -> they ‘ll;
- 将大部分标点当作单独的一个词;
- 将后一位是逗号或者引号的词分开;
- 单独出现在一行的句号分开。
中文分词区别比较大,可以采用斯坦福或者ICTCLAS(中科院背景)的方案。2
New York 会变成 new + york,这个是单词化而不是语块化的问题
2.2 Normalization 数据标准化
2.2.1 Noise Removal 非文本数据去除
【Skip.】对于自己爬虫爬下来的文本(如HTML格式)需要做非文本数据去除。
这一步主要是针对我们用爬虫收集的语料数据,由于爬下来的内容中有很多html的一些标签,需要去掉。少量的非文本内容的可以直接用Python的正则表达式(re)删除, 复杂的则可以用beautifulsoup来去除。另外还有一些特殊的非英文字符(non-alpha),也可以用Python的正则表达式(re)删除。
2.2.2 Spell Check 拼写检查
【Skip.】由于英文文本中可能有拼写错误,因此一般需要进行拼写检查。如果确信我们分析的文本没有拼写问题,可以略去此步。
拼写检查,我们一般用pyenchant类库完成。pyenchant的安装很简单:”pip install pyenchant”即可。
对于一段文本,我们可以用下面的方式去找出拼写错误:
from enchant.checker import SpellChecker
chkr = SpellChecker("en_US")
chkr.set_text("Many peope likee to watch In the Name of People.")
for err in chkr:
print "ERROR:", err.word
输出是:
ERROR: peope
ERROR: likee
找出错误后,我们可以自己来决定是否要改正。当然,我们也可以用pyenchant中的wxSpellCheckerDialog类来用对话框的形式来交互决定是忽略,改正还是全部改正文本中的错误拼写。大家感兴趣的话可以去研究pyenchant的官方文档。
2.2.3 Part-Of-Speech Tagging and POS Tagger(对词进行标注)1
lemmatization在词性标注后效果比较好。
参考:Python自然语言处理(一)–利用NLTK自带方法完成NLP基本任务
from nltk.tokenize import word_tokenize #tokens是句子分词后的结果,同样是句子级的标注
text='The cat is walking in the bedroom.'
sent_tokenize_list = word_tokenize(text)
print(sent_tokenize_list)
pos_tag = nltk.pos_tag(sent_tokenize_list)
print(pos_tag)
2.2.4 Stemming / Lemmatization 词干提取/词形还原
Lemmas differ from stems i