English Text Mining: Preprocessing 英文文本挖掘:文本预处理

English Text Mining: Preprocessing

文章主干来自下面Reference中的博客,我自己进行了增加整理,感谢所有分享知识的大佬们= =

1. Data Collection or Assembly 数据收集

【Given.】20_newsgroups.

数据用的是20_newsgroups语料库,下面是笔者在数据处理过程遇到的一些问题和解决,Python初学者都是泪T T

  1. 文件读写
  2. 文件夹下所有文件读取
  3. 二进制文本读取,参数问rb
  4. 读取文本后遇到的问题: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
  5. 解决方法 chardet模块检测编码,再解码,使用方法参见代码
  6. 20_newsgroups中atheism中53558文件编码有问题,检测不出,选择跳过,如下图:
    编码问题
  7. 如果自定义了和函数/头文件重名的变量则不可调用或import,显示not callable
  8. utf-8类型的str写入文件open时需指定encoding=’utf-8’
  9. 字典排序:sorted返回的是一个list,其中每一项为key和value组成的元组

2. Data Preprocessing 数据预处理

2.1 Tokenization & Segmentation 单词化 / 语块化 分词

下面基本都是单词化分词的方法。

2.1.1 Sentence Tokenize(分割句子)1

实际测试发现似乎没什么意义啊?这里不是很明白。

  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)  
    
  2. 使用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

可参考:【NLP】Python NLTK处理原始文本

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
  • 8
    点赞
  • 40
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值