NLP模型标准化处理(Normalization)

原文为:(https://www.cnblogs.com/jielongAI/p/10189907.html)
一个NLP模型的表现(performance)很大程度取决于我们所拥有的词汇量(额。。。其实嘛,很难有一个定量的分析,起码目前在学习过程中给我的感觉是如此,词汇量应该掌握在一个具体什么样的程度呢?希望有大神看了我的博客文章也留言给我,是否有一个有效的衡量方法去查看究竟我们所需要的词汇量是多少?)。当然这部分我们要讲的主要是如何通过其他方式来缩减我们tokenize之后创建的feature vector的维度,也就是减少我们的词汇量,以最大程度的保留我们所需要的觉得有用的信息。具体一般有三种处理方式:CASE FOLDING(大小写的改变),Stemming和Lemmatization,下面会展开详细的说明。

3.1 CASE Folding

在英文的NLP模型中,单词的大小写是非常敏感的,这跟我们中文比较不一样,中文是没有所谓的大小写之说的,在这里因为主要以英文NLP为主,所以就只讲英文的标准了,未来有机会更新博客的时候我会尝试引入中文相关的NLP处理方式。我们都知道,在书写英文句子的时候,我们总是让开头的第一个单词的首字母处于大写状况,或者说我们想要强调某些事件的时候,我们就希望用全大写来表示,但是我们同样知道But和but是同一个单词but并且表示同一个意思,然而文本分析过程中这是两个不同的单词,仅仅是因为他们的首字母不一样,这样子计算机自动分析的时候得到的结果就会导致有偏差,所以我们需要对这But这个单词进行大小写的规范处理,从而减少我们的词汇量。

复制代码
1 tokens = [‘Horse’, ‘horse’, ‘Dog’, ‘dog’, ‘Cat’, ‘cat’]
2 print(tokens)
3 print("单词数量为: ",len(set(tokens)))
4
5 normalized_tokens = [x.lower() for x in tokens]
6 print(normalized_tokens)
7 print("Normalized之后的单词数量为: ",len(set(normalized_tokens)))
复制代码
输出结果为:

[‘Horse’, ‘horse’, ‘Dog’, ‘dog’, ‘Cat’, ‘cat’]
单词数量为: 6
[‘horse’, ‘horse’, ‘dog’, ‘dog’, ‘cat’, ‘cat’]
Normalized之后的单词数量为: 3
从上面的结果我们可以看出,我们单词的数量从6个变为了3个,因为Horse和horse表达的就是同一个东西。当然,就如我们开头所说的,英文单词对于大小写是很敏感的,也就意味着大小写的单词对于英文单词所要表达的意思可能是不同的,如Doctor和doctor在大小写方面前者表示为博士,后者我们说的一般是医生的意思,这是我们需要注意的一点,当然你并无法完全针对每个大小写敏感的单词去做case normalization,所以一般情况我们根据需求而定,取舍来做分析,大部分时候的做法是我们只对句子的首个单词的首字母进行case normalization,这只是提供一种分析方法,根据学习过程获得信息,英文的NLP模型最终都是不采用case normalization的,以免丢失太多的信息,对于中文等一些语言,大小写不敏感的,这个就更没意义了。

3.2 Stemming(词干提取)

Stemming是另外一个处理英文文本会用到的技巧,主要是单词的复数形式中或者指代所有格结果等单词中提取出相应的词干(stem)。例如,我们知道cats,horses的词干形式是cat和horse,又比如doing的词干为do。通过这样子的处理,我们将很多不同形式的词回复为其原本的词干形式,这样子做有很大的作用。一个实例就是搜索引擎,当你搜索某样的东西的时候,很多时候你可能不知道你所需要搜索的东西的具体拼写方式,所以我们只是键入你觉得可能的词,但是此时我们需要机器反馈给我具有相关联系的搜索结果,这个结果不仅仅是需要语意上尽可能地相同,大部分时候我们是基于关键字匹配的,如果采取的是100%的匹配的话,得到的结果将会是很有限,这时候通过词干的匹配来检索呈现出相应的结果就显得异常的重要。而对于我们搭建模型,在预处理文本的阶段,则大大的减少了我们的词汇量(意味着我们不需要大空间储存)与此同时它也尽可能地规避减少信息地丢失。不仅如此,提取词干也同时让我们地模型更具普适性,这点符合我们刚才说的搜索引擎的例子。这里有一点需要注意的是,这里的词干并非严格意义上的词干,而只是我们所说的字符或者标识符,这个标识符可能表示的是好几种不同拼写形式的单词。
下面介绍一下用NLTK库中的PorterStemmer来提取文本的词干。

1 from nltk.stem.porter import PorterStemmer
2
3 stemmer = PorterStemmer()
4 print(’ ‘.join([stemmer.stem(w).strip("’") for w in “dishes washer’s washed dishes”.split()]))
输出结果为:

dish washer wash dish

3.3 Lemmatization(词性还原)

词形还原(lemmatization)也是一种在英文语言处理中比较常见的的技巧,大致的作用与词干提取类似,也是希望不同形式的单词可以在经过处理之后恢复为他们原本的模样,但是词形还原更多的是放在了单词本身的语意上。所以,词形还原其实比词干提取和大小写的改变更适合预处理文本,因为他们不是简单的改变单词的大小写或者单复数或者所有格的形式,而是基于语意去做还原。比如,我们如果用词干提取去处理better这个单词的时候,我们可能会把单词的er去掉,这样子单词就会编程bet或者bett,这完全改变了单词的意思,但是如果是基于词形还原,那么我们就得到类似的词,如good,best等等。在正式NLP模型创建过程中,我们一般是希望词形还原的运用是在词干提取前面,因为在英文文本中,lemmatization处理过后的单词更接近单词本身所要表达的意思,并且同样的也可以减少我们特征的维度。下面是通过NLTK上的WordNetLemmatizer函数来让你了解下词形还原是如何工作的:

1 from nltk.stem import WordNetLemmatizer
2
3 lemmatizer = WordNetLemmatizer()
4 print(lemmatizer.lemmatize(‘better’))
5 print(lemmatizer.lemmatize(‘better’, pos=‘a’))
输出结果为:

better
good
上述代码第五行中的pos是part of speech是词性标注的意思,a代表的形容词的形式。

综上,我们可以看出,词干提取和词形还原都可以减少单词的词汇量,但是同时他们也增加了文本的迷惑性,因为不可能将不同形式的单词100%的恢复成所要表达的单词形式,更需要明白的是,即使词干一样,基于该呈现出来的不同形式的单词的意思也会差很多,所以迷惑性也就增加了,这样子对我们自然语言文本分析其实变相的增加了难度,在实际的运用做,我们需要根据实际情况运用上述讲到的算法原理和技巧。

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值