nlp中文本预处理技术
Posted yealxxy
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了nlp中文本预处理技术相关的知识,希望对你有一定的参考价值。
自然语言处理NLP(Natural Language Processing),就是使用计算机对语言文字进行处理的相关技术。本文主要是总结一下中、英文的常用的文本预处技术。
文本分析的流程如下:
一、中文文本分析流程
1,中文文本处理的特点
- 中文没有单词的分割符号,因此需要复杂的分词模型进行分析。
- 中文的编码不是utf8,而是unicode。这样会导致在分词的时候,和英文相比,我们要处理编码的问题。
- 中文纠错的处理比英文更难。
2,数据收集
- 下载网上公开的数据集:包括比赛数据集、研究型数据集等。
- 对于一些特殊领域的数据集:需要自己爬取。
3,数据清洗
- html标签:对于爬取的数据中有很多无用html标签。
- 特殊符号: 比如数字、表情等,简单的任务可以直接去掉。如果需要复杂的分析,可以进行转换成‘##’,或者其他处理。
- 标点符号:没有用可以去掉
- 中文纠错:中文纠错是一个大的问题,比英文难。根据语料分析,进行badcase分析,查看错误语料的结果的影响,没有必要可以不用做;如果错误语料对问题的影响大,可以用开源的工具进行纠错,也可以自己训练,目前的算法大都是采用统计办法进行纠错。
4,中文编码问题
由于Python2不支持unicode的处理,因此我们使用Python2做中文文本预处理时需要遵循的原则是,存储数据都用utf8,读出来进行中文相关处理时,使用GBK之类的中文编码。
5,中文分词:
目前流行的中文工具包:
- jieba:做最好的 Python 中文分词组件https://github.com/fxsjy/jieba
- 清华大学THULAC:一个高效的中文词法分析工具包
- 中科院计算所NLPIR
- 哈工大LTP
- FoolNLTK可能不是最快的开源中文分词,但很可能是最准的开源中文分词
备注:特定领域的分词可以加入自己词库进行分词,如果分词误差比较大,可以重新训练自己的分词模型。
import jieba
s = '沙瑞金赞叹易学习的胸怀,是金山的百姓有福,可是这件事对李达康的触动很大。' \\
'易学习又回忆起他们三人分开的前一晚,大家一起喝酒话别,易学习被降职到道口县当县长,' \\
'王大路下海经商,李达康连连赔礼道歉,觉得对不起大家,他最对不起的是王大路,就和易学' \\
'习一起给王大路凑了5万块钱,王大路自己东挪西撮了5万块,开始下海经商。没想到后来王大路' \\
'竟然做得风生水起。沙瑞金觉得他们三人,在困难时期还能以沫相助,很不容易。'
jieba.suggest_freq('沙瑞金', True) # 加入词库
jieba.suggest_freq('易学习', True)
jieba.suggest_freq('王大路', True)
jieba.suggest_freq('京州', True)
document_cut = jieba.cut(s)
result = ' '.join(document_cut)
print(result)
6,停用词处理:
常用的中文停用下载链接(1208个):http://files.cnblogs.com/files/pinard/stop_words.zip
7,后续步骤
- 特征提取:向量化。Bag of Words词袋模型(bow,tf-idf)、N-gram特征、Word2vec等
- 建模:分析任务并建模
二、英文文本分析流程
1,英文文本特点
- 不需要分词:词之间有分隔符,可以直接用split分割。
- 不需要编码转换:英文大部分英文文本都是uft-8的编码。
- 需要处理拼写问题:英文纠错
- 词干提取(stemming)和词形还原(lemmatization):英文有单数,复数和各种时态,导致一个词会有不同的形式。比如“countries”和"country",“wolf"和"wolves”,我们期望是有一个词。如果进行转换,不仅可以减少词库的大小,提高计算的速度;还可以提高语义的理解。
2,数据收集:和中文的指导一样
- 下载网上公开的数据集:包括比赛数据集、研究型数据集等。
- 对于一些特殊领域的数据集:需要自己爬取。
3,数据清洗:和中文的指导类似
- html标签:对于爬取的数据中有很多无用html标签。
- 特殊符号: 比如数字、表情等,简单的任务可以直接去掉。如果需要复杂的分析,可以进行转换成‘##’,或者其他处理。
- 标点符号:没有用可以去掉
- 英文纠错:英文纠错相比中文纠错简单很多,同时很多情况下都需要进行纠错处理。常用的英文纠错工具包: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
4,词干提取(stemming)和词形还原(lemmatization)
词干提取(stemming)和词型还原(lemmatization)都是要找到词的原始形式。词干提取(stemming)会更加激进一点,它在寻找词干的时候可以会得到不是词的词干。比如"imaging"的词干可能得到的是"imag", 并不是一个词。而词形还原则保守一些,它一般只对能够还原成一个正确的词的词进行处理。一般使用nltk工具包进行处理。
import nltk
nltk.download() # 下载语料包
- 词干提取:词干提取的方法有PorterStemmer,LancasterStemmer和SnowballStemmer。
from nltk.stem import SnowballStemmer
stemmer = SnowballStemmer("english") # Choose a language
stemmer.stem("countries") # Stem a word
- 词型还原,则一般可以使用WordNetLemmatizer类,即wordnet词形还原方法
from nltk.stem import WordNetLemmatizer
wnl = WordNetLemmatizer()
print(wnl.lemmatize('countries'))
5,转化为小写
这么做的原因和词干提取的原因一样,减少词库,加快计算。
6,引入停用词
常用的英文停用下载链接:http://www.matthewjockers.net/wp-content/uploads/2013/04/uwm-workshop.zip
7,后续步骤:和中文一样
- 特征提取:向量化。Bag of Words词袋模型(bow,tf-idf)、N-gram特征、Word2vec等
- 建模:分析任务并建模
参考文献:
NLP入门-- 文本预处理Pre-processing:https://zhuanlan.zhihu.com/p/53277723
Useful Text Preprocessing on the datasets:https://www.kaggle.com/l3nnys/useful-text-preprocessing-on-the-datasets
以上是关于nlp中文本预处理技术的主要内容,如果未能解决你的问题,请参考以下文章