自然语言处理的流程

自然语言的文本处理流程
  • 备注:汉语的自然语言处理流程和英语的自然语言处理流程差了一步词形归一化
英文文本的处理流程
  • 0.语料库的使用(没有实际的作用)--查看语料库的信息
    • 使用方法
      • 导入语料库,以导入布朗大学语料库为例(brown)
        • import nltk
        • from nltk.corpus import brown   brown为语料库,需要提前使用下载器进行下载
      • 查看语料库包含的类别(没有实际作用)
        • print(brown.categories())
      • 查看语料库中包含的句子和单词(没有实际作用)
        • brown.sents()
        • brown.words()
  • 1.文本分词处理
    • 分词的作用
      • 将句子拆分成 具有语言语义学上意义的词
      • 中、英文分词区别:
        • 英文中,单词之间是以空格作为自然分界符的
        • 中文中没有一个形式上的分界符,分词比英文复杂的多
    • 分词处理的方法
      • 导入模块
        • import nltk
      • 准备需要分词的句子或者文章
        • text = "Python is a high-level programming language, and i like it!"
      • 对文本进行分句处理(只有当文本太大,需要对每一句话进行处理的时候使用)
        • seg_list = nltk.sent(text)    对文本进行分句,返回有多个句子组成的列表
      • 对文本进行分词  (需要事先安装 punkt 分词模型)
        • seg_list = nltk.word_tokenize(text)    对文本进行分词,返回分词后单词组成的列表
      • 分词后的结果:seg_list
        • ['Python', 'is', 'a', 'high-level', 'programming', 'language', '!']
  • 1.1.词性标注(Part-Of-Speech)-获取每个单词的词性,可选步骤(根据需要使用)
    • 词性标注的方法
      • 导入模块
        • import nltk
      • 分词后进行词性标注
        • words = nltk.word_tokenize('Python is a widely used programming language.')
        • nltk.pos_tag(words)    需要下载 averaged_perceptron_tagger
      • 分词后的结果
        • [('Python', 'NNP'), ('is', 'VBZ'), ('a', 'DT'), ('widely', 'RB'), ('used', 'VBN'), ('programming', 'NN'), ('language', 'NN'), ('.', '.')]、
      • 常见的词性
  • 2.词形归一化(只有处理英文问本的时候才需要)
    • 词形归一的作用
      • 类似 look, looked, looking这些不同时态的单词,会影响语料学习的准确度
      • 通过词形归一化,可以将这些单词转化为同一的单词
    • ①词干提取(stemming)
      • 作用
        • 可以将单词的ing, ed去掉,只保留单词主干
        • NLTK中常用的词干提取工具stemmer:PorterStemmer, SnowballStemmer, LancasterStemmer
      • 词干提取的方法
        • PorterStemmer(只支持英语) 的使用方法
          • 导入模块
            • from nltk.stem.porter import PorterStemmer
          • 创建工具对象
            • porter_stemmer = PorterStemmer()
          • 对单词进行词干提取
            • porter_stemmer.stem('looked')      返回进行词干提取后的单词
            • porter_stemmer.stem('looking')     返回进行词干提取后的单词
          • 提取后的结果
            • look  look
        • SnowballStemmer(支持多种语言)的使用方法
          • 导入模块
            • from nltk.stem,snowball import SnowballStemmer
          • 创建工具对象,并选择语言
            • SnowballStemmer.languages     查看支持的语言
            • snowball_stemmer = SnowballStemmer('english')
          • 对单词进行词干提取
            • snowball_stemmer.stem('looked')     返回进行词干提取后的单词
            • snowball_stemmer.stem('looking'))     返回进行词干提取后的单词
          • 提取后的结果
            • look  look
        • LancasterStemmer(在大文本提取的时候速度更快) 的使用方法
          • 导入模块
            • from nltk.stem.lancaster import LancasterStemmer
          • 创建工具对象
            • lancaster_stemmer = LancasterStemmer()
          • 对单词进行词干提取
            • lancaster_stemmer.stem('looked')     返回进行词干提取后的单词
            • lancaster_stemmer.stem('looking')     返回进行词干提取后的单词
          • 提取后的结果
            • look  look
    • ②词形归并(lemmatization)
      • 词形归并的作用
        • 可以将单词的各种词形归并成一种形式
          • 如am, is, are -> be, went->go,boxes->box
        • 指明词性可以更准确地进行词形归并
      • 词形归并的使用方法:WordNetLemmatizer
        • 导入模块
          • from nltk.stem import WordNetLemmatizer
        • 创建工具对象
          • wordnet_lematizer = WordNetLemmatizer()    需要下载wordnet语料库
        • 进单词进行词形归并
          • wordnet_lematizer.lemmatize('cats'))     默认按照名词处理
          • wordnet_lematizer.lemmatize('boxes'))   默认按照名词处理
          • wordnet_lematizer.lemmatize('are'))   默认按照名词处理
          • wordnet_lematizer.lemmatize('went'))     默认按照名词处理
          • print(wordnet_lematizer.lemmatize('are', pos='v'))    指明词性
          • print(wordnet_lematizer.lemmatize('went', pos='v'))     指明词性
            • 用pos指明词性可以更准确地进行lemma, lemmatize 默认为名词
  • 3.去除停用词
    • 去除停用词的作用
      • 为节省存储空间和提高搜索效率,NLP中会自动过滤掉某些字或词
      • 停用词都是人工输入、非自动化生成的,形成停用词表
    • 停用词的种类
      • 语言中的功能词,如the, is…
      • 词汇词,通常是使用广泛的词,如want
    • 停用词表
    • 获取指定语言的停用歌词库
      • stopwords.words('language_name')
        • 注意:所有停用词都是小写的
    • 去除停用词的方法
      • 导入模块
        • from nltk.corpus import stopwords     需要下载stopwords
      • 获取未进行去除停用词的单词列表(已经进行了分词处理)
        • words = ['Python', 'is', 'a', 'widely', 'used', 'programming', 'language', '.']
      • 对所有单词进行去除停用词
        • filtered_words = [word for word in words if word not in stopwords.words('english')]
      • 去除停用词之后的结果:filtered_words
        • ['Python', 'widely', 'used', 'programming', 'language', '.']
  • 英文文本处理流程示例
jieba分词器的介绍
  • jieba分词器的介绍
    • jieba分词器的三种模式
      • 全模式:把句子中所有的可以成词的词语都扫描出来, 速度非常快,但是不能解决歧义,适合情感分析;
      • 精确模式:试图将句子最精确地切开,适合文本分析,适合词频统计;
      • 搜索引擎模式:在精确模式的基础上,对长词再次切分,提高召回率,适合用于搜索引擎分词。
    • 安装方式
      • pip install jieba
      • pip3 install jieba
    • 导入jieba库的方法
      • import jieba 
  • 使用jieba分词器进行分词
  • 使用jieba分词器对词性词性进行标注
    • 导入jieba词性标注工具
      • import jieba.posseg as pseg
    • 进行分词,并进行词性标注
      • words = pseg.cut("我爱北京天安门")   返回的是分词后,有单词和词性构成的元组,并组成的列表
    • 结果打印
      • for word, flag in words:
        • print('%s %s' % (word, flag))
      •  -->
        • 我 r
        • 爱 v
        • 北京 ns
        • 天安门 ns
中文文本的处理流程
  • 1.分词处理的方法
    • 导入jieba分词器(需要先pip install jieba)
      • import jieba
    • 准备需要分词的句子或者文章
      • text = '欢迎来到英雄联盟'
    • 对文本进行分词
      • seg_list = jieba.cut(text, cut_all=True)
        • cut_all:  表示使用全模式来进行分词
    • 分词后的结果:seg_list
      • ['欢迎', '来到', '英雄', '联盟', '英雄联盟']
  • 2.使用jieba分词器分词并标注词性--可选步骤(默认是精确模式)
    • 导入jieba词性标注工具
      • import jieba.posseg as pseg
    • 准备需要分词的句子或者文章
      • text = '欢迎来到英雄联盟'
    • 进行分词,并进行词性标注
      • words_list = pseg.cut(text)   返回的是分词后,的单词和词性的对应结果
    • 分词后的结果:words_list
  • 3.去除停用词
    • 中文停用词表
      • 中文停用词库
      • 哈工大停用词表
      • 四川大学机器智能实验室停用词库
      • 百度停用词列表
    • 准备分词后的列表
      • seg_list = ['我', '是' , '一个', '好人']
    • 读取中文停用表
      • stopword_list = [line.rstrip() for line in open('哈工大停用词表.txt', 'r', encoding='utf-8')]
    • 去停用词操作
      • filtered_list = [seg for seg in seg_list if seg not in stopword_list]
    • 取出后的结果: filtered_list
      • ['好人']


刘小恺(Kyle) wechat
如有疑问可联系博主