• 自然语言处理 文本预处理(上)(分词、词性标注、命名实体识别等)


    一、认识文本预处理

    在这里插入图片描述

    1 文本预处理及其作用

    文本语料在输送给模型前一般需要一系列的预处理工作, 才能符合模型输入的要求, 如: 将文本转化成模型需要的张量, 规范张量的尺寸等, 而且科学的文本预处理环节还将有效指导模型超参数的选择, 提升模型的评估指标.

    2. 文本预处理中包含的主要环节

    • 文本处理的基本方法
    • 文本张量表示方法
    • 文本语料的数据分析
    • 文本特征处理
    • 数据增强方法

    3. 概览

    • 文本处理的基本方法

      • 分词
      • 词性标注
      • 命名实体识别
    • 文本张量表示方法

      • one-hot编码
      • Word2vec
      • Word Embedding
    • 文本语料的数据分析

      • 标签数量分布
      • 句子长度分布
      • 词频统计与关键词词云
    • 文本特征处理

      • 添加n-gram特征
      • 文本长度规范
    • 数据增强方法

      • 回译数据增强法

    重要说明
    在实际生产应用中, 我们最常使用的两种语言是中文和英文, 因此, 文本预处理部分的内容都将针对这两种语言进行讲解.

    二、文本处理的基本方法

    1. 分词

    1.1 什么是分词

    分词就是将连续的字序列按照一定的规范重新组合成词序列的过程。我们知道,在英文的行文中,单词之间是以空格作为自然分界符的,而中文只是字、句和段能通过明显的分界符来简单划界,唯独词没有一个形式上的分界符, 分词过程就是找到这样分界符的过程.

    举个栗子:

    工信处女干事每月经过下属科室都要亲口交代24口交换机等技术性器件的安装工作 
    
    ==> 
    
    ['工信处', '女干事', '每月', '经过', '下属', '科室', '都', '要', '亲口', '交代', '24', '口', '交换机', '等', '技术性', '器件', '的', '安装', '工作']
    
    • 1
    • 2
    • 3
    • 4
    • 5

    1.2 分词的作用

    词作为语言语义理解的最小单元, 是人类理解文本语言的基础. 因此也是AI解决NLP领域高阶任务, 如自动问答, 机器翻译, 文本生成的重要基础环节.

    1.3 流行中文分词工具jieba

    愿景: “结巴”中文分词, 做最好的 Python 中文分词组件.

    (1)jieba的特性:

    • 支持多种分词模式
    • 精确模式
    • 全模式
    • 搜索引擎模式
    • 支持中文繁体分词
    • 支持用户自定义词典

    (2)jieba的安装

    pip install jieba
    
    • 1

    (3)jieba的使用

    • 精确模式分词:
      试图将句子最精确地切开,适合文本分析.
    >>> import jieba
    >>> content = "工信处女干事每月经过下属科室都要亲口交代24口交换机等技术性器件的安装工作"
    >>> jieba.cut(content, cut_all=False)  # cut_all默认为False
    
    # 将返回一个生成器对象
    <generator object Tokenizer.cut at 0x7f065c19e318>
    
    # 若需直接返回列表内容, 使用jieba.lcut即可
    >>> jieba.lcut(content, cut_all=False)
    ['工信处', '女干事', '每月', '经过', '下属', '科室', '都', '要', '亲口', '交代', '24', '口', '交换机', '等', '技术性', '器件', '的', '安装', '工作']
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 全模式分词:
      把句子中所有的可以成词的词语都扫描出来, 速度非常快,但是不能消除 歧义.
    >>> import jieba
    >>> content = "工信处女干事每月经过下属科室都要亲口交代24口交换机等技术性器件的安装工作"
    >>> jieba.cut(content, cut_all=True)  # cut_all默认为False
    
    # 将返回一个生成器对象
    <generator object Tokenizer.cut at 0x7f065c19e318>
    
    # 若需直接返回列表内容, 使用jieba.lcut即可
    >>> jieba.lcut(content, cut_all=True)
    ['工信处', '处女', '女干事', '干事', '每月', '月经', '经过', '下属', '科室', '都', '要', '亲口', '口交', '交代', '24', '口交', '交换', '交换机', '换机', '等', '技术', '技术性', '性器', '器件', '的', '安装', '安装工', '装工', '工作']
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 搜索引擎模式分词:
      在精确模式的基础上,对长词再次切分,提高召回率,适合用于搜索引擎分词.
    >>> import jieba
    >>> content = "工信处女干事每月经过下属科室都要亲口交代24口交换机等技术性器件的安装工作"
    >>> jieba.cut_for_search(content)
    
    # 将返回一个生成器对象
    <generator object Tokenizer.cut at 0x7f065c19e318>
    
    # 若需直接返回列表内容, 使用jieba.lcut_for_search即可
    >>> jieba.lcut_for_search(content)
    ['工信处', '干事', '女干事', '每月', '经过', '下属', '科室', '都', '要', '亲口', '交代', '24', '口', '交换', '换机', '交换机', '等', '技术', '技术性', '器件', '的', '安装', '工作']
    
    # 对'女干事', '交换机'等较长词汇都进行了再次分词.
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 中文繁体分词:
      针对中国香港, 台湾地区的繁体文本进行分词.
    >>> import jieba
    >>> content = "煩惱即是菩提,我暫且不提"
    >>> jieba.lcut(content)
    ['煩惱', '即', '是', '菩提', ',', '我', '暫且', '不', '提']
    
    • 1
    • 2
    • 3
    • 4
    • 使用用户自定义词典:
      • 添加自定义词典后, jieba能够准确识别词典中出现的词汇,提升整体的识别准确率.
      • 词典格式: 每一行分三部分:词语、词频(可省略)、词性(可省略),用空格隔开,顺序不可颠倒.

    词典样式如下, 具体词性含义请参照附录: jieba词性对照表, 将该词典存为userdict.txt, 方便之后加载使用.

    云计算 5 n
    李小福 2 nr
    easy_install 3 eng
    好用 300
    韩玉赏鉴 3 nz
    八一双鹿 3 nz
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    >>> import jieba
    >>> jieba.lcut("八一双鹿更名为八一南昌篮球队!")
    # 没有使用用户自定义词典前的结果:
    >>> ['八', '一双', '鹿', '更名', '为', '八一', '南昌', '篮球队', '!']
    
    
    >>> jieba.load_userdict("./userdict.txt")
    # 使用了用户自定义词典后的结果:
    ['八一双鹿', '更名', '为', '八一', '南昌', '篮球队', '!']
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9

    1.4 流行中英文分词工具hanlp:

    中英文NLP处理工具包, 基于tensorflow2.0, 使用在学术界和行业中推广最先进的深度学习技术.

    (1)hanlp的安装:

    # 使用pip进行安装
    pip install hanlp
    
    • 1
    • 2

    (2)使用hanlp进行中文分词:

    >>> import hanlp
    # 加载CTB_CONVSEG预训练模型进行分词任务
    >>> tokenizer = hanlp.load('CTB6_CONVSEG')
    >>> tokenizer("工信处女干事每月经过下属科室都要亲口交代24口交换机等技术性器件的安装工作")
    ['工信处', '女', '干事', '每', '月', '经过', '下', '属', '科室', '都', '要', '亲口', '交代', '24口', '交换机', '等', '技术性', '器件', '的', '安装', '工作']
    
    • 1
    • 2
    • 3
    • 4
    • 5

    (3)使用hanlp进行英文分词:

    # 进行英文分词, 英文分词只需要使用规则即可
    >>> tokenizer = hanlp.utils.rules.tokenize_english 
    >>> tokenizer('Mr. Hankcs bought hankcs.com for 1.5 thousand dollars.')
    ['Mr.', 'Hankcs', 'bought', 'hankcs.com', 'for', '1.5', 'thousand', 'dollars', '.']
    
    • 1
    • 2
    • 3
    • 4

    2. 命名实体识别

    2.1 什么是命名实体识别

    • 命名实体: 通常我们将人名, 地名, 机构名等专有名词统称命名实体. 如: 周杰伦, 黑山县, 孔子学院, 24辊方钢矫直机.
    • 顾名思义, 命名实体识别(Named Entity Recognition,简称NER)就是识别出一段文本中可能存在的命名实体.

    举个栗子:

    鲁迅, 浙江绍兴人, 五四新文化运动的重要参与者, 代表作朝花夕拾.
    
    ==>
    
    鲁迅(人名) / 浙江绍兴(地名)/ 五四新文化运动(专有名词) / 重要参与者 / 代表作 / 朝花夕拾(专有名词)
    
    • 1
    • 2
    • 3
    • 4
    • 5

    2.2 命名实体识别的作用

    同词汇一样, 命名实体也是人类理解文本的基础单元, 因此也是AI解决NLP领域高阶任务的重要基础环节.

    2.3 使用hanlp进行中文命名实体识别

    >>> import hanlp
    # 加载中文命名实体识别的预训练模型MSRA_NER_BERT_BASE_ZH
    >>> recognizer = hanlp.load(hanlp.pretrained.ner.MSRA_NER_BERT_BASE_ZH)
    # 这里注意它的输入是对句子进行字符分割的列表, 因此在句子前加入了list()
    # >>> list('上海华安工业(集团)公司董事长谭旭光和秘书张晚霞来到美 国纽约现代艺术博物馆参观。')
    # ['上', '海', '华', '安', '工', '业', '(', '集', '团', ')', '公', '司', '董', '事', '长', '谭', '旭', '光', '和', '秘', '书', '张', '晚', '霞', '来', '到', '美', '国', '纽', '约', '现', '代', '艺', '术', '博', '物', '馆', '参', '观', '。'] 
    >>> recognizer(list('上海华安工业(集团)公司董事长谭旭光和秘书张晚霞来到美国纽约现代艺术博物馆参观。'))
    [('上海华安工业(集团)公司', 'NT', 0, 12), ('谭旭光', 'NR', 15, 18), ('张晚霞', 'NR', 21, 24), ('美国', 'NS', 26, 28), ('纽约现代艺术博物馆', 'NS', 28, 37)]
    
    # 返回结果是一个装有n个元组的列表, 每个元组代表一个命名实体, 元组中的每一项分别代表具体的命名实体, 如: '上海华安工业(集团)公司'; 命名实体的类型, 如: 'NT'-机构名; 命名实体的开始索引和结束索引, 如: 0, 12.
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10

    2.4 使用hanlp进行英文命名实体识别:

    >>> import hanlp
    # 加载英文命名实体识别的预训练模型CONLL03_NER_BERT_BASE_UNCASED_EN
    >>> recognizer = hanlp.load(hanlp.pretrained.ner.CONLL03_NER_BERT_BASE_UNCASED_EN))
    # 这里注意它的输入是对句子进行分词后的结果, 是列表形式.
    >>> recognizer(["President", "Obama", "is", "speaking", "at", "the", "White", "House"])
    [('Obama', 'PER', 1, 2), ('White House', 'LOC', 6, 8)]
    # 返回结果是一个装有n个元组的列表, 每个元组代表一个命名实体, 元组中的每一项分别代>表具体的命名实体, 如: 'Obama', 如: 'PER'-人名; 命名实体的开始索引和结束索引, 如: 1, 2.
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    3. 词性标注

    3.1 什么是词性标注

    • 词性: 语言中对词的一种分类方法,以语法特征为主要依据、兼顾词汇意义对词进行划分的结果, 常见的词性有14种, 如: 名词, 动词, 形容词等.
    • 顾名思义, 词性标注(Part-Of-Speech tagging, 简称POS)就是标注出一段文本中每个词汇的词性.

    举个栗子:

    我爱自然语言处理
    
    ==>/rr,/v, 自然语言/n, 处理/vn
    
    
    rr: 人称代词
    v: 动词
    n: 名词
    vn: 动名词
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11

    3.2 词性标注的作用

    词性标注以分词为基础, 是对文本语言的另一个角度的理解, 因此也常常成为AI解决NLP领域高阶任务的重要基础环节.

    3.3 使用jieba进行中文词性标注

    >>> import jieba.posseg as pseg
    >>> pseg.lcut("我爱北京天安门") 
    [pair('我', 'r'), pair('爱', 'v'), pair('北京', 'ns'), pair('天安门', 'ns')]
    
    # 结果返回一个装有pair元组的列表, 每个pair元组中分别是词汇及其对应的词性, 具体词性含义请参照[附录: jieba词性对照表]()
    
    • 1
    • 2
    • 3
    • 4
    • 5

    3.4 使用hanlp进行中文词性标注:

    >>> import hanlp
    # 加载中文命名实体识别的预训练模型CTB5_POS_RNN_FASTTEXT_ZH
    >>> tagger = hanlp.load(hanlp.pretrained.pos.CTB5_POS_RNN_FASTTEXT_ZH)
    # 输入是分词结果列表
    >>> tagger(['我', '的', '希望', '是', '希望', '和平'])
    # 结果返回对应的词性
    ['PN', 'DEG', 'NN', 'VC', 'VV', 'NN']
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    3.5 使用hanlp进行英文词性标注:

    >>> import hanlp
    # 加载英文命名实体识别的预训练模型PTB_POS_RNN_FASTTEXT_EN
    >>> tagger = hanlp.load(hanlp.pretrained.pos.PTB_POS_RNN_FASTTEXT_EN)
    # 输入是分词结果列表
    >>> tagger(['I', 'banked', '2', 'dollars', 'in', 'a', 'bank', '.'])
    ['PRP', 'VBD', 'CD', 'NNS', 'IN', 'DT', 'NN', '.']
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
  • 相关阅读:
    代购商城源码,打造个人海外购物平台
    ssh宿舍管理系统
    如何使用 ABAP 创建包含不同字体大小的 Word 文档试读版
    Flutter IOS 前后台切换主题自动变化的问题
    SpringBoot中的上传文件接口
    JavaScript For-In循环
    cpu负载4800,根目录磁盘100%,问题排查和解决
    volatile 变量是什么?volatile 变量和 atomic 变量有什么不同?
    shell入门第6课 环境变量
    决策树(decision tree)
  • 原文地址:https://blog.csdn.net/mengxianglong123/article/details/126093519