NLP Learn Practice(二)
在上一次,学习了nltk的基本安装与使用,而且也介绍了对一个文本text做基本的分句,分词。那么在实际中对文本的处理远不止分句,分词,一个文本内容,我们感兴趣的词只是部分,对于一些词,由于介绍的是nltk,这里仍然以英文分词为例,比如人称代词"I、me、my等等,标点符号以及一些常见的动词,虚词之类的,对于我们对文本的内容的分析作用并不大,这些词就是所谓的停用词,停用词的过滤和标点符号的处理是非常重要的,因此本文着重介绍nltk中停用词的过滤以及标点符号的处理,把这个过程也称为文本的标准化。文本的标准化主要涉及消除标点符号、文本大小写的统一、数字转换成单词、扩展缩略词、文本的规范化等等。
首先进行标点符号的删除,程序如下所示:
#1.标点符号的删除
import nltk
from nltk.tokenize import word_tokenize #导入词令牌
'''
令牌化指的是在分隔符的基础上,将一个字符串分成若干个子字符串
'''
def punctuation_delete():
#文本的定义
text=["i like machine learning.","it is very interesting.", \
"i like NLP and deep learning.","so important."]
tokenized_docs=[word_tokenize(doc) for doc in text] #对文档中的每个句子进行分词
print(tokenized_docs) #输出分词后的结果
import re #需要用到正则表达式(regular expression)
import string
x=re.compile('[%s]' % re.escape(string.punctuation))
'''
注意在这里re.escape(string.punctuation)的输出结果是所有的特殊字符,结果如下
'\\!\\"\\#\\$\\%\\&\\\'\\(\\)\\*\\+\\,\\-\\.\\/\\:\\;\\<\\=\\>\\?\\@\等等
因此x被编译成了一个特殊字符模式,标点符号就是其中之一
'''
tokenized_docs_no_punctuation=[] #用来存放去掉标点符号的内容
for review in tokenized_docs:#对于原来的没有去掉标点符号的内容进行如下操作
new_review=[]
for token in review:
new_token=x.sub(u'',token)#用原始串中x中所包括的符号如?、!等替换成空格,这样就去掉了标点符号
if not new_token==u'':#如果不是空格(即是个词),那么就加入到新的每句话所在的向量中
new_review.append(new_token)
tokenized_docs_no_punctuation.append(new_review)#把每句话的向量表示,加入到新的列表中
'''
对于上面的解释举个例子,比如经过分词处理后,如下所示
[['I', 'like', 'machine', 'learning', '.'], ['It', 'is', 'very', 'interesting', '.'],...]
对于第一句话"I like machine learning.",所对应的向量就是['I', 'like', 'machine', 'learning', '.']
经过正则表达式替换,就成为了['I', 'like', 'machine', 'learning', ''],这里句号'.'变成了空白符
在经过if判断新的向量变成了['I', 'like', 'machine', 'learning']
对于每一个句子向量做同样的操作,即for循环,再一次的把每个句子向量(列表)加入到指定的列表中,便得到了
最终的结果:
[['I', 'like', 'machine', 'learning'], ['It', 'is', 'very', 'interesting'],...]
'''
print(tokenized_docs_no_punctuation)#输出最终结果
if __name__=="__main__":
punctuation_delete()
结果如下所示:
上面这个过程便是标点符号的删除过程,下面介绍如何过滤掉停用词,整个代码如下:
#文本的标准化
#1.标点符号的删除
import nltk
from nltk.tokenize import word_tokenize #导入词令牌
'''
令牌化指的是在分隔符的基础上,将一个字符串分成若干个子字符串
'''
def punctuation_delete():
#文本的定义
text=["i like machine learning.","it is very interesting.", \
"i like NLP and deep learning.","so important."]
tokenized_docs=[word_tokenize(doc) for doc in text] #对文档中的每个句子进行分词
print(tokenized_docs) #输出分词后的结果
import re #需要用到正则表达式(regular expression)
import string
x=re.compile('[%s]' % re.escape(string.punctuation))
'''
注意在这里re.escape(string.punctuation)的输出结果是所有的特殊字符,结果如下
'\\!\\"\\#\\$\\%\\&\\\'\\(\\)\\*\\+\\,\\-\\.\\/\\:\\;\\<\\=\\>\\?\\@\等等
因此x被编译成了一个特殊字符模式,标点符号就是其中之一
'''
tokenized_docs_no_punctuation=[] #用来存放去掉标点符号的内容
for review in tokenized_docs:#对于原来的没有去掉标点符号的内容进行如下操作
new_review=[]
for token in review:
new_token=x.sub(u'',token)#用原始串中x中所包括的符号如?、!等替换成空格,这样就去掉了标点符号
if not new_token==u'':#如果不是空格(即是个词),那么就加入到新的每句话所在的向量中
new_review.append(new_token)
tokenized_docs_no_punctuation.append(new_review)#把每句话的向量表示,加入到新的列表中
'''
对于上面的解释举个例子,比如经过分词处理后,如下所示
[['I', 'like', 'machine', 'learning', '.'], ['It', 'is', 'very', 'interesting', '.'],...]
对于第一句话"I like machine learning.",所对应的向量就是['I', 'like', 'machine', 'learning', '.']
经过正则表达式替换,就成为了['I', 'like', 'machine', 'learning', ''],这里句号'.'变成了空白符
在经过if判断新的向量变成了['I', 'like', 'machine', 'learning']
对于每一个句子向量做同样的操作,即for循环,再一次的把每个句子向量(列表)加入到指定的列表中,便得到了
最终的结果:
[['I', 'like', 'machine', 'learning'], ['It', 'is', 'very', 'interesting'],...]
'''
print(tokenized_docs_no_punctuation)#输出最终结果
#2.去掉停用词
from nltk.corpus import stopwords #从语料库模块中导入提用词模块
stops=set(stopwords.words('english'))
print("所有的停用词是:"+str(stops))
words=[word for word in tokenized_docs_no_punctuation[0] if word not in stops]
print("对于第一句话而言,去掉停用词后的结果为"+str(words))
if __name__=="__main__":
punctuation_delete()
对于结果如下图所示:
这便是本文所要介绍的停用词的过滤和标点符号的删除,但是文本的预处理不仅仅只有这些,首先还需要对文本的内容进行小写的转化,应为停用词在nltk中是针对小写的,如果没有把大写转化成小写,则停用词不会过滤的,比如如果"I"没有转化成"i",则不会过滤掉"I"的,还有比如处理重复字符等等,这里不再介绍。