NLP Learn Practice(二)

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"的,还有比如处理重复字符等等,这里不再介绍。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值