我们知道,大部分NLP任务都是以文本形式输入的,然鹅language is compositional!我们理解文本通常能够把文本拆分成多个构成的部分去理解,那么机器也可以这么做,而预处理就是第一步操作!
1. 去除不需要的格式信息
如HTML
2. 把文本拆分成句子
可以通过rules拆分:标点、正则匹配、词典,也可以使用机器学习的方法进行拆分,如决策树、逻辑回归,使用特征:标点前后的词、词的形式(大小写,长度)、POS标签。
3. 把句子拆分成token
英语可以根据空格拆分,或者根据一些其他的标点符号,也可以细分出数字、日期、城市、网址等信息
进一步细分还可以使用 byte-pair encoding(BPE)方法:
BPE最早是一种压缩算法,基本思路是把经常出现的byte pair用一个新的byte来代替,例如假设(‘A‘, ’B‘)经常顺序出现,则用一个新的标志‘AB‘来代替它们。
给定了文本库,我们的初始词汇库仅包含所有的单个的字符,然后不断的将出现频率最高的n-gram pair作为新的ngram加入到词汇库中,直到词汇库的大小达到我们所设定的某个目标为止。
例如,假设我们的文本库中出现的单词及其出现次数为 {‘l o w‘: 5, ‘l o w e r‘: 2, ‘n e w e s t‘: 6, ‘w i d e s t‘: 3},我们的初始词汇库为{ ‘l‘, ‘o‘, ‘w‘, ‘e‘, ‘r‘, ‘n‘, ‘w‘, ‘s‘, ‘t‘, ‘i‘, ‘d‘},出现频率最高的>ngram pair是(‘e‘,‘s‘) 9次,所以我们将‘es‘作为新的词汇加入到词汇库中,由于‘es‘作为一个整体出现在词汇库中,这时文本库可表示为 {‘l o w‘: 5, ‘l o w e r‘: 2, ‘n e w es t‘: 6, ‘w i d es t‘: 3},>这时出现频率最高的ngram pair是(‘es‘,‘t‘) 9次,将‘est‘加入到词汇库中,文本库更新为{‘l o w‘: 5, ‘l o w e r‘: 2, ‘n e w est‘: 6, ‘w i d est‘: 3},新的出现频率最高的ngram pair是(‘l‘,‘o‘)7, 将‘lo‘加>入到词汇库中,文本库更新为{‘lo w‘: 5, ‘lo w e r‘: 2, ‘n e w est‘: 6, ‘w i d est‘: 3}。以此类推,直到词汇库大小达到我们所设定的目标。这个例子中词汇量较小,对于词汇量很大的实际情况,>我们就可以通过BPE逐步建造一个较小的基于subword unit的词汇库来表示所有的词汇。
cite from https://zhuanlan.zhihu.com/p/69414965
4. word normalisation
token形式转化,如大小写、去除morphology、检查拼写、检查缩写,目的就是为了减少词汇量以及把token都变成统一形态。
morphology相当于是词形的转化,比如英语中的前缀re-,un-,后缀-ly,-er……,以及-ies变-y,那么去除这个的过程叫stemming,比较有名的有Porter Stemmer,这里不再展开。
对于英语文本,这里再介绍一下lemmatisation,removing any inflection to reach the uninflected form, the lemma。举几个例子,speaking变成speak,stopping变成stop,was变成be,watches变成watch……
检查拼写的常用方法:string distance如levenshtein,n-gram模型,phonetic模型……
5. 去除stopwords(不需要的token)
可以使用一些NLP工具如NLTK,spaCy来完成
预处理基本上是NLP任务中不可避免的一步,而且可能会对后续产生很大的影响,而具体需要做哪些处理要根据任务来定!就这样!
原文:https://www.cnblogs.com/mrdoghead/p/13160713.html