N-grams模子、停留词(stopwords)和标准化处置惩罚


玖富娱乐是一家为代理招商,直属主管信息发布为主的资讯网站,同时也兼顾玖富娱乐代理注册登录地址。

在上一节《Tokenization - NLP(1)》的进修中,我们主要进修了怎样将一串字符串支解成零丁的字符,而且构成一个词搜集(vocabulary),以后我们将构成的词搜鸠合转换成计算机能够处置惩罚的数字信息,以轻易我们做进一步文本剖析。这篇博客的主题照样我们怎样将文本转成成更有用的身分,让我们能从文本傍边提取到更多的信息以便作为特性输入到模子中练习,首先会引见一下N-grams算法,以后会提到停留词及英文文本罕见的范例化处置惩罚手腕,如大小写的转变、词干提取等(文章中的某些例子会涉及到正则表达式的应用,然则由于不是主要的内容,对应用到的正则表达式不做过量诠释,若是有须要的话自身找下书本和在网上搜刮下怎样应用正则表达式)。

一、N-grams

自然言语处置惩罚历程傍边,一个值得我们注重的是,若是我们仅仅是将文本字符串支解成零丁的文本,此时我们只是简朴的去剖析文本中每一个字符所代表的潜伏意义与我们须要剖析的效果的干系性,但是我们疏忽一个非常主要的信息,文本的递次是含有非常的主要信息。举一个简朴的例子,“垂纶”两个词,若是我们零丁去剖析这两个词,而不是看做一个团体的话,那末我们取得的语意意义就是“钓”是一个动作词,“鱼”是一个名词,而当两个字放在一同的时刻,我们晓得实在我们想表述的“垂纶”是我们要做的一个运动(event)。又好比英文“hot dog",我们都晓得这个词组想表达的是我们吃的食品”热狗腊肠包“,以是我们不愿望零丁去看hot和dog两个意义,若是是这样子容貌我们能够看出意义相差非常的远,由此我们能够看出文本递次的主要性。

而现实操作中,我们将这类把文本递次保存下来的行动称之为竖立N-grams模子,也就是我们将一个字符串支解成含有多个词的标识符(tokens)。固然,须要记着的一点是不论是上一节说的照样N-grams,他们都属于文本字符串Tokenization的一个历程。

 1 import re
 2 from nltk.util import ngrams
 3 
 4 sentence = "I love deep learning as it can help me resolve some complicated problems in 2018."
 5 
 6 # tokenize the sentence into tokens
 7 pattern = re.compile(r"([-s.,;!?]) ")
 8 tokens = pattern.split(sentence)
 9 tokens = [x for x in tokens if x and x not in '- tn.,;!?']
10 
11 bigrams = list(ngrams(tokens, 2))
12 print([" ".join(x) for x in bigrams])

上述代码的输出效果是:

['I love', 'love deep', 'deep learning', 'learning as', 'as it', 'it can', 'can help', 'help me', 'me resolve', 'resolve some', 'some complicated', 'complicated problems', 'problems in', 'in 2018']

上述代码的实行是首先将文本字符串支解成零丁(unique)标识符,而且引入了正则表达式(更多的正则表达式请参看其他材料,这里有须要指出,当我们做一些大型的文本剖析时,实在真正用正则表达式去誊写响应的划定规矩实行起来的效力是很低的,由于文本是一成不变,几乎没有雷同的,比方每一个人在微博上post的器械,所附在文本上的字符是千差万别,然后我们一样平常电子书上的文本又与收集的分歧,以是就构成了没法用一套正则表达式的划定规矩去完成一切的义务,普适性是很差的。)来更精准的支解字符串。除此之外,我们应用了NLTK的库来支解出一个含有两个词(Bi-Gram)的标识符。以是从上面我们能够看出,如“deep learning"和”complicated problems“这样子容貌的组合更相符我们想要表达的意义,然则独个字符看的话我们就未必看得出了。

虽然N-grams模子能够让我们更好的去支解出具有更好语意的标识符,进而让我们做进一步文本剖析,然则瑕玷也是一样显着,那就是应用N-grams模子能够让我们的辞汇量成指数级的增进,而且并不是一切的Bigram都含有有用信息,而这个状态在以至乎在Trigram或许Quad gram等含有更多零丁字符在内的N-grams模子会更严峻。这样子容貌做发生的题目就是我们终究拿到的特性向量(the dimension of the feature vectors)的维度将会凌驾我们自身的文件样本数(length of the documents),而终究当我们将这些提掏出来的特性放入到机械进修算法中的话,就会致使过拟合(over fitting)的状态。云云练习出来的模子将没有什么太好的performance和展望才能。

二、Stop Words

形成上述题目的一个缘由多是我们支解出来的标识符(n-grams)含有太多的不具备有用信息的组合,如带有停留词(stop words)的词组组合,停留词在英文中涌现的频次是非常高的,如a, an, and, or, of, at, the等等单词,这些单词照顾的信息量(substantive information)是极端有限的。以是我们须要做的就是在NLP剖析历程傍边将文本中的停留词去掉,这样子容貌做的优点是我们削减辞汇量,进而下降我们特性向量的维度。But.......我们照样须要再次注重一个题目,那就是虽然停留词自身所照顾的信息不是许多,然则stop words却能够在n-grams中存在干系性信息(relational information),斟酌下面两种状态:

  1. Mark reported to the CEO
  2. Susan reported as the CEO to the board

在上述例子中,若是我们将to the和as the去掉的话,那末我们就会取得reported CEO,这是很疑惑的,由于这两个句子中自身是有一个层级意义的,然则由于我们remove掉了as,the和to这三个stop words致使了干系信息的缺失。一般状态下,我们须要建立一个4-grams的词(如上述紫色字局部标注高亮的局部)。这也就延申出我们须要议论的关于NLP模子建立历程傍边遇到的一个题目,那就是基本是特定题目须要特定的处理办法。细致为依据现实应用而定,建立一个过滤器恰当的过滤掉我们不须要的stop words。

下面我们经由过程NLTK的库来看看英文中也许都有那些stop words:

1 import nltk
2 
3 nltk.download("stopwords")
4 stopwords = nltk.corpus.stopwords.words("english")
5 print(len(stopwords))
6 print(stopwords[:50])

输出效果为:

[nltk_data] Downloading package stopwords to
[nltk_data]     C:UsersJielongSSSAppDataRoamingnltk_data...
[nltk_data]   Package stopwords is already up-to-date!
179
['i', 'me', 'my', 'myself', 'we', 'our', 'ours', 'ourselves', 'you', "you're", "you've", "you'll", "you'd", 'your', 'yours', 'yourself', 'yourselves', 'he', 'him', 'his', 'himself', 'she', "she's", 'her', 'hers', 'herself', 'it', "it's", 'its', 'itself', 'they', 'them', 'their', 'theirs', 'themselves', 'what', 'which', 'who', 'whom', 'this', 'that', "that'll", 'these', 'those', 'am', 'is', 'are', 'was', 'were', 'be']

三、范例化处置惩罚(Normalization)

议论那末多,我们也应当意想到一个题目:一个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%的婚配的话,取得的效果将会是很有限,这时刻经由过程词干的婚配来检索显现出响应的效果就显得非常的主要。而关于我们搭建模子,在预处置惩罚文本的阶段,则大大的削减了我们的辞汇量(意味着我们不须要大空间贮存)与此同时它也尽量地躲避削减信息地丧失。不仅云云,提取词干也同时让我们地模子更具普适性,这点相符我们适才说的搜刮引擎的例子。这里有一点须要注重的是,这里的词干并不是严厉意义上的词干,而只是我们所说的字符或许标识符,这个标识符能够透露表现的是好几种分歧拼写情势的单词。

1 def stemming(sent):
2     return ' '.join([re.findall('^(.*ss|.*?)(s)?$', word)[0][0].strip("'") for word in sent.lower().split()])
3 
4 stemming('horses')

上述代码的输出效果为:

'horse'

正则表达式中想要表达的是若是一个单词的末端为s的话则词干为去掉s以后的单词,若是过剩一个s作为末端的话,那末这个词连结原型。上述的代码示例能处理的题目是很有限的,由于更庞杂的诸如dishes这样子容貌的单词,我们晓得去掉的是es,而不仅仅是s,若是要到达足够高的精准度,那我们须要写的正则表达式也会逐渐增加。这样子容貌代码实行起来的效力也不够高。下面引见一下用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%的规复成所要表达的单词情势,更须要邃晓的是,纵然词干一样,基于该显现出来的分歧情势的单词的意义也会差许多,以是疑惑性也就增加了,这样子容貌对我们自然言语文本剖析实在变相的增加了难度,在现实的应用做,我们须要依据现实状态应用上述讲到的算法道理和技能。

 

-玖富娱乐是一家为代理招商,直属主管信息发布为主的资讯网站,同时也兼顾玖富娱乐代理注册登录地址。