zl程序教程

您现在的位置是:首页 >  云平台

当前栏目

文本预处理的基本方法(分词、词性标注、命名实体识别)

识别方法预处理 基本 文本 命名 实体 标注
2023-09-11 14:15:15 时间

文本预处理及其作用

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

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

  • 文本处理的基本方法(分词、词性标注、命名实体识别)
  • 文本张量表示方法(one-hot编码、Word2vec、Word Embedding)
  • 文本语料的数据分析(标签数量分布、句子长度分布、词频统计与关键词词云)
  • 文本特征处理(添加n-gram特征、文本长度规范)
  • 数据增强方法(回译数据增强法)

什么是分词

  • 分词就是将连续的字序列按照一定的规范重新组合成词序列的过程。我们知道,在英文的行文中,单词之间是以空格作为自然分界符的,而中文只是字、句和段能通过明显的分界符来简单划界,唯独词没有一个形式上的分界符, 分词过程就是找到这样分界符的过程.
  • 分词的作用:
    • 词作为语言语义理解的最小单元, 是人类理解文本语言的基础. 因此也是AI解决NLP领域高阶任务, 如自动问答, 机器翻译, 文本生成的重要基础环节.

  • 流行中文分词工具jieba:
    • 愿景: “结巴”中文分词, 做最好的 Python 中文分词组件.

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

  • jieba的使用:
  • 精确模式分词:
    • 试图将句子最精确地切开,适合文本分析.
import jieba

text = '工信处女干事每月经过下属科室都要亲口交代24口交换机等技术性器件的安装工作 '

ret = jieba.cut(text, cut_all=False)  # cut_all默认为False
# 将返回一个生成器对象
print(ret)
print(list(ret))

# 若需直接返回列表内容, 使用jieba.lcut()
ret2 = jieba.lcut(text, cut_all=False)
print(ret2)

  • 全模式分词:
    • 把句子中所有的可以成词的词语都扫描出来, 速度非常快,但是不能消除歧义.
import jieba

text = '工信处女干事每月经过下属科室都要亲口交代24口交换机等技术性器件的安装工作 '

ret = jieba.cut(text, cut_all=True)  # cut_all默认为False
# 将返回一个生成器对象
print(ret)
print(list(ret))

# 若需直接返回列表内容, 使用jieba.lcut()
ret2 = jieba.lcut(text, cut_all=True)
print(ret2)

  • 搜索引擎模式分词:
    • 在精确模式的基础上,对长词再次切分,提高召回率,适合用于搜索引擎分词.
import jieba

text = '工信处女干事每月经过下属科室都要亲口交代24口交换机等技术性器件的安装工作 '

ret = jieba.cut_for_search(text)
# 将返回一个生成器对象
print(ret)
print(list(ret))

# 若需直接返回列表内容, 使用jieba.lcut_for_search()
ret2 = jieba.lcut_for_search(text)
print(ret2)

  • 中文繁体分词:
    • 针对中国香港, 台湾地区的繁体文本进行分词.
import jieba

text = '煩惱即是菩提,我暫且不提 '

ret = jieba.lcut(text)
print(ret)

  • 使用用户自定义词典:
    • 添加自定义词典后, jieba能够准确识别词典中出现的词汇,提升整体的识别准确率.
      • 词典格式: 每一行分三部分:词语、词频(可省略)、词性(可省略),用空格隔开,顺序不可颠倒.
      • 词典样式如下, 将该词典存为userdict.txt, 方便之后加载使用.
韩玉赏鉴 3 nz
八一双鹿 3 nz
import jieba

text = '八一双鹿更名为八一南昌篮球队!'

# 没有使用用户自定义词典前的结果:
ret = jieba.lcut(text)
print(ret)

jieba.load_userdict('./userdict.txt')
# 使用了用户自定义词典后的结果:
ret = jieba.lcut(text)
print(ret)

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

  • hanlp的安装:
# 使用pip进行安装
pip install hanlp

为了避免不必要的各种报错,直接安装最全的hanlp版本,命令如下

pip install hanlp[full]

这个过程中可能会更新你的tensorflow到更新的版本和hanlp匹配


  • 使用hanlp进行中文分词:
import hanlp

text = '工信处女干事每月经过下属科室都要亲口交代24口交换机等技术性器件的安装工作'
# 加载CTB_CONVSEG预训练模型进行分词任务
tokenizer = hanlp.load('CTB6_CONVSEG')
ret = tokenizer(text)
print(ret)
  • 使用hanlp进行英文分词:
# 进行英文分词, 英文分词只需要使用规则即可
tokenizer = hanlp.utils.rules.tokenize_english
ret = tokenizer('I love you very much!')
print(ret)

什么是命名实体识别

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

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

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

  • 使用hanlp进行中文命名实体识别:
import hanlp

# 加载中文命名实体识别的预训练模型MSRA_NER_BERT_BASE_ZH
recognizer = hanlp.load(hanlp.pretrained.ner.MSRA_NER_BERT_BASE_ZH)
#  这里注意它的输入是对句子进行字符分割的列表, 因此在句子前加入了list()
#  list('上海华安工业(集团)公司董事长谭旭光和秘书张晚霞来到美 国纽约现代艺术博物馆参观。')
#  ['上', '海', '华', '安', '工', '业', '(', '集', '团', ')', '公', '司', '董', '事', '长', '谭', '旭', '光', '和', '秘', '书', '张', '晚', '霞', '来', '到', '美', '国', '纽', '约', '现', '代', '艺', '术', '博', '物', '馆', '参', '观', '。']
ret = recognizer(list('上海华安工业(集团)公司董事长谭旭光和秘书张晚霞来到美国纽约现代艺术博物馆参观。'))
print(ret)  
# [('上海华安工业(集团)公司', 'NT', 0, 12), ('谭旭光', 'NR', 15, 18), ('张晚霞', 'NR', 21, 24), ('美国', 'NS', 26, 28), ('纽约现代艺术博物馆', 'NS', 28, 37)]

# 返回结果是一个装有n个元组的列表, 每个元组代表一个命名实体, 元组中的每一项分别代表具体的命名实体, 如: '上海华安工业(集团)公司'; 命名实体的类型, 如: 'NT'-机构名; 命名实体的开始索引和结束索引, 如: 0, 12.

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

# 加载英文命名实体识别的预训练模型CONLL03_NER_BERT_BASE_UNCASED_EN
recognizer = hanlp.load(hanlp.pretrained.ner.CONLL03_NER_BERT_BASE_UNCASED_EN)

# 这里注意它的输入是对句子进行分词后的结果, 是列表形式.
ret = recognizer(["President", "Obama", "is", "speaking", "at", "the", "White", "House"])
print(ret)
# [('Obama', 'PER', 1, 2), ('White House', 'LOC', 6, 8)]
# 返回结果是一个装有n个元组的列表, 每个元组代表一个命名实体, 元组中的每一项分别代>表具体的命名实体, 如: 'Obama', 如: 'PER'-人名; 命名实体的开始索引和结束索引, 如: 1, 2.

什么是词性标注

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

==>

我/rr, 爱/v, 自然语言/n, 处理/vn

rr: 人称代词
v: 动词
n: 名词
vn: 动名词
  • 词性标注的作用:
    • 词性标注以分词为基础, 是对文本语言的另一个角度的理解, 因此也常常成为AI解决NLP领域高阶任务的重要基础环节.

  • 使用jieba进行中文词性标注:
import jieba.posseg as pseg

ret = pseg.lcut('我爱北京天安门')
print(ret)

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

# 加载中文命名实体识别的预训练模型CTB5_POS_RNN_FASTTEXT_ZH
tagger = hanlp.load(hanlp.pretrained.pos.CTB5_POS_RNN_FASTTEXT_ZH)

# 输入是分词结果列表
ret = tagger(['我', '的', '希望', '是', '希望', '和平'])

#  返回对应的词性
print(ret)  # ['PN', 'DEG', 'NN', 'VC', 'VV', 'NN']
  • 使用hanlp进行英文词性标注:
import hanlp

# 加载英文命名实体识别的预训练模型PTB_POS_RNN_FASTTEXT_EN
tagger = hanlp.load(hanlp.pretrained.pos.PTB_POS_RNN_FASTTEXT_EN)
# 输入是分词结果列表
ret = tagger(['I', 'banked', '2', 'dollars', 'in', 'a', 'bank', '.'])
#  返回对应的词性
print(ret)  # ['PRP', 'VBD', 'CD', 'NNS', 'IN', 'DT', 'NN', '.']