0%

文本预处理-文本处理的基本方法

文本预处理-文本处理的基本方法

认识文本预处理

  • 文本预处理的及其作用

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

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

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

文本处理的基本方法

jieba分词

安装

1
pip install jieba

精确模式分词

  • 试图将句子最精确地切开,适合文本分析
1
2
3
4
import jieba
content = "巴西圣保罗州法院裁定苹果在当地出售的iPhone必须配备充电器"
jieba.cut(content, cut_all=False) # cut_all默认为False 返回一个生成器对象
jieba.lcut(content, cut_all=False) # 使用lcut()直接返回列表内容

Building prefix dict from the default dictionary ... Dumping model to file cache /tmp/jieba.cache Loading model cost 1.053 seconds. Prefix dict has been built successfully. ['巴西', '圣保罗州', '法院', '裁定', '苹果', '在', '当地', '出售', '的', 'iPhone', '必须', '配备', '充电器']

全模式分词

  • 把句子中所有的可以成词的词语都扫描出来,速度非常快,但不能消除歧义
1
2
3
4
import jieba
content = "巴西圣保罗州法院裁定苹果在当地出售的iPhone必须配备充电器"
jieba.cut(content, cut_all=True) # cut_all默认为False
jieba.lcut(content, cut_all=True)

Building prefix dict from the default dictionary ... Dumping model to file cache /tmp/jieba.cache Loading model cost 1.005 seconds. Prefix dict has been built successfully. ['巴西', '圣保罗', '圣保罗州', '保罗', '罗州', '法院', '裁定', '苹果', '果在', '当地', '出售', '的', 'iPhone', '必须', '配备', '充电', '充电器', '电器']

搜索引擎模式分词

  • 在精确模式的基础上,对长词再次切分,提高召回率,适用于搜索引擎分词
1
2
3
4
import jieba
content = "巴西圣保罗州法院裁定苹果在当地出售的iPhone必须配备充电器"
jieba.cut_for_search(content)
jieba.lcut_for_search(content)

['巴西', '保罗', '罗州', '圣保罗', '圣保罗州', '法院', '裁定', '苹果', '在', '当地', '出售', '的', 'iPhone', '必须', '配备', '充电', '电器', '充电器']

中文繁体分词

  • 针对中国香港,台湾地区的繁体文本进行分词
1
2
3
import jieba
content = "煩惱既是菩提,我暫且不提"
jieba.lcut(content)

['煩惱', '既', '是', '菩提', ',', '我', '暫且', '不', '提']

使用用户自定义的词典

  • 添加自定义词典后,jieba能够准确识别词典中出现的词汇,提升整体的识别准确率
  • 词典格式:每行分三部分:词语、词频(可省略),用空格隔开,顺序不可颠倒

如:

云计算 5 n

李小福 2 nr

easy_install 3 eng

好用 300

韩玉赏鉴 3 nz

八一双鹿 3 nz

1
2
3
import jieba
# 没有使用用户自定义词典前结果
jieba.lcut("八一双鹿更名为八一南昌篮球队!")

['八', '一双', '鹿', '更名', '为', '八一', '南昌', '篮球队', '!']

1
2
jieba.load_userdict("./userdict.txt")
# 使用自定义词典后的结果

['八一双鹿', '更名', '为', '八一', '南昌', '篮球队', '!']

hanlp

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

hanlp的安装

1
pip install hanlp

使用hanlp进行中文分词

1
2
3
import hanlp
tokenizer = hanlp.load("CTB6_CONVSEG")
tokenizer("巴西圣保罗州法院裁定苹果在当地出售的iPhone必须配备充电器")

Downloading https://file.hankcs.com/hanlp/embeddings/convseg_embeddings.zip#news_tensite.w2v200 to /root/.hanlp/embeddings/convseg_embeddings.zip 100% 188.3 MiB 2.5 MiB/s ETA: 0 s [=========================================] Decompressing /root/.hanlp/embeddings/convseg_embeddings.zip to /root/.hanlp/embeddings Loading word2vec from cache ...88.82% 13.2 MB/14.9 MB Loading word2vec from text file ... ETA: 0 sDownloading https://file.hankcs.com/corpus/char_table.zip#CharTable.txt to /root/.hanlp/thirdparty/file.hankcs.com/corpus/char_table.zip 100% 17.6 KiB 4.4 KiB/s ETA: 0 s [=========================================] Decompressing /root/.hanlp/thirdparty/file.hankcs.com/corpus/char_table.zip to /root/.hanlp/thirdparty/file.hankcs.com/corpus ['巴西', '圣保罗州', '法院', '裁定', '苹果', '在', '当地', '出售', '的', 'iPhone', '必须', '配备', '充电器']

使用hanlp进行英文分词

1
2
3
# 但是我在colab上跑的时候报错了,问题目前还没解决!!!
tokenizer = hanlp.utils.rules.tokenize_english
tokenizer("Don't go gentle into that good night.")

['Do', "n't", 'go', 'gentle', 'into', 'that', 'good', 'night', '.']

命名实体识别

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

如:

鲁迅,浙江绍兴人,五四新文化运动的重要参与者,代表作朝花夕拾。

==>

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

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

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

1
2
3
import hanlp
tokenizer = hanlp.load(hanlp.pretrained.ner.MSRA_NER_BERT_BASE_ZH)
tokenizer("上海华安工业(集团)公司董事长谭旭光和秘书张晚霞来到美国纽约现代艺术博物馆参观。")

[('上海华安工业(集团)公司', 'NT', 0, 12), ('谭旭光', 'NR', 15, 18), ('张晚霞', 'NR', 21, 24), ('美国', 'NS', 26, 28), ('纽约现代艺术博物馆', 'NS', 28, 37)]

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

1
2
3
import hanlp
recoginizer = hanlp.load(hanlp.pretrained.ner.CONLL03_NER_BERT_BASE_UNCASED_EN)
recognizer(["President", "Obama", "is", "speaking", "at", "the", "White", "House"])

[('Obama', 'NR', 1, 2)]

词性标注

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

如:

我爱自然语言处理

==>

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

rr:人称代词

v:动词

n:名词

vn:动名词

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

使用hanlp进行中文词性标注

1
2
3
import hanlp
tagger = hanlp.load(hanlp.pretrained.pos.CTB5_POS_RNN_FASTTEXT_ZH)
tagger(list("我的希望是希望和平"))

['PN', 'DEG', 'NR', 'AD', 'VC', 'NR', 'NN', 'CC', 'NN']

使用hanlp进行英文词性标注

1
2
3
import hanlp
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']