← 返回文章列表

文本预处理,jieba分词与词向量

概念 文本语料在输送给模型前一般需要一系列的预处理工作, 才能符合模型输入的要求 • 比如:将文本转化成模型需要的张量、规范张量的 …

概念

文本语料在输送给模型前一般需要一系列的预处理工作, 才能符合模型输入的要求

• 比如:将文本转化成模型需要的张量、规范张量的尺寸

• 比如:关于标签Y:分类问题查看标签是否均匀;关于数据X:数据有没有脏数据 数据长度分布等等

作用

指导模型超参数的选择 、提升模型的评估指标

大白话:文本预处理的工作,就是准备出模型需要的x,y;然后送给模型

主要环节

基本方法

• 分词概念

• 定义:将连续的字序列按照一定的规范重新组合成词序列的过程

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

• 中文为什么要分词?中文没有明显的分界符,英文天然空格分界符

• 流行中文分词工具jieba

• jieba 是一个python实现的分词库,对中文有着很强大的分词能力

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

• jieba工具主要功列表介绍:

• 支持多种分词模式**(三种模式)**

精确模式 :试图将句子最精确地切开,适合文本分析

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

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

• 支持中文繁体分词 • 支持用户自定义词典 自定义字典的格式

分词过程:找到分界符的过程,找到分界符就可以分词了

jieba分词

精确模式演示

#todo:1定义函数,演示jieba精确分词模式,适用于:文本分析
def dm01():
    content = '传智教育是一家上市公司,旗下有黑马程序员品牌。我是在黑马这里学习人工智能'

    result1 = jieba.cut(content,cut_all=False)
    print(f'result1:{result1}')
    print(next(result1))
    print(next(result1))
    print('-*-'*30)
    for i in result1:
        print(i)
    print('=*='*30)
    list1 = list(result1)
    print(f'List1:{list1}')

    list2=jieba.lcut(content,cut_all=False)
    print(f'list2:{list2}')

输出:

注:result是生成器对象,只能遍历一次

全模式

#todo:2.定义函数,演示jieba全模式,适用于:关键词提取,不需要严格分词准确性的场景
def dm02():
    content = '传智教育是一家上市公司,旗下有黑马程序员品牌。我是在黑马这里学习人工智能'

    result1 = jieba.cut(content,cut_all=True)
    print(f'result1:{result1}')
    print(next(result1))
    print(next(result1))
    print('-*-'*30)
    for i in result1:
        print(i)
    print('=*='*30)
    list1 = list(result1)
    print(f'List1:{list1}')

    list2=jieba.lcut(content,cut_all=True)
    print(f'list2:{list2}')

图片缺失:image-20260721154220202(原文引用的是作者本地 Typora 路径,源站没有该文件)

可见,全模式的分词更多,提取的关键词

搜索引擎模式

解释: 搜索引擎分词模式→在精确模式分词的基础上,对长词进行再次切分,提高召回率. 例如: 场景1:用户录入”程序员” 精确模式:只能匹配包含完整“程序员”的文档. 搜索引擎模式:不仅能匹配”程序员”文档,还能匹配”程序”,“员”的文档,提高召回.

场景2:实际应用场景(电商搜索),商品标题为:<<苹果手机保护套>>,用户搜索 <<苹果套>>

​ 精确模式:无法匹配,分词为:(“苹果”,“手机”,“保护套”)

​ 搜索引擎模式:能匹配,分词为:(“苹果”,“手机”,“保护”,“套”)

#todo3.定义函数,演示jieba搜索引擎模式,适用于:搜索引擎分词,文本匹配
def dm03():
    content = '传智教育是一家上市公司,旗下有黑马程序员品牌。我是在黑马这里学习人工智能'

    result1 = jieba.cut_for_search(content)
    print(f'result1:{result1}')
    print(next(result1))
    print(next(result1))
    print('-*-'*30)
    for i in result1:
        print(i)
    print('=*='*30)
    list1 = list(result1)
    print(f'List1:{list1}')

    list2=jieba.lcut_for_search(content)
    print(f'list2(搜索引擎模式):{list2}')

输出:

分词——繁体字

def dm04():
    content = '煩惱即是菩提,我暫且不提'

    result = jieba.lcut(content,cut_all=False)
    print(result)

支持用户自定义词典

#格式:word1 freq1 word_type1 词语(必选) 词频(可选) 词性(可选)

黑马程序员 5 n 传智教育 6 n 人工智能 7 nz 学习 3 上市 3

添加自定义词典后,jieba能够准确识别出词典中出现的词汇,提升整体的识别准确率.

#todo5.定义函数,演示jieba分词之自定义词典 适用于:稍微生僻点的词或者特殊要求的词组
def dm05():
    content = '传智教育是一家上市公司,旗下有黑马程序员品牌。我是在黑马这里学习人工智能'
    list1 = jieba.lcut(content)
    print(f'精确模式分词:{list1}')

    jieba.load_userdict('./data/userdict.txt')
    list2 = jieba.lcut(content)
    print(f'list2(加载自定义词典后的分词):{list2}')

输出:

命名实体识别(NER)

• 命名实体: 将人名, 地名, 机构名等专有名词统称命名实体。如: 周杰伦, 黑山县, 孔子学院, 24辊方钢矫直机

• 命名实体识别:(Named Entity Recognition,简称NER),识别出一段文本中可能存在的命名实体

• 作用:命名实体也是人类理解文本的基础单元,是AI解决NLP领域高阶任务的重要基础环节

命名实体识别 – 栗子

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

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

词性标注

• 词性: 语言中对词的一种分类方法,以语法特征为主要依据、兼顾词汇意义对词进行划分的结果

​ 常见的词性有14种, 如: 名词, 动词, 形容词等

• 词性标注:(Part-Of-Speech tagging, 简称POS),标注出一段文本中每个词汇的词性

• 词向标注作用:对文本语言的另一个角度的理解,AI解决NLP领域高阶任务的重要基础环节

词性标注 – 栗子

​ 我爱自然语言处理

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

​ rr: 人称代词

​ v: 动词

​ n: 名词

​ vn: 动名词

def dm01():
    content = '我爱武汉黄鹤楼和东湖'

    result = pseg.lcut(content)
    print(f'result:{result}')
    for word,flag in result:
        print(f'词语:{word},词性:{flag}')

输出:

one-hot编码

One-hot编码(One-Hot Encoding),也叫稀疏词向量表示

​ • 是将分类变量转换为数字格式的常用方法,通常用于AI任务中处理分类标签y数据

​ • 在One-hot编码中,对于一个具有n个不同类别的分类变量,将其表示为一个n维的向量 其中只有一个维度 的值为1(代表该样本属于这个类别),其他维度的值均为0。

• 记忆释义:一个位置为1,其他全为零

例子:

一个颜色变量,可能取值“红色”、“绿色”和“蓝色”

==> 红色: [1, 0, 0] 绿色: [0, 1, 0] 蓝色: [0, 0, 1]

[“改变”, “要”, “如何”, “起头”]

==>

[[1, 0, 0, 0],

[0, 1, 0, 0],

[0, 0, 1, 0],

[0, 0, 0, 1]]

def dm01():
    vocabs = {'周杰伦','陈奕迅','王力宏','李宗盛','李薇薇','江苏龙'}
    my_tokenizer = Tokenizer()
    my_tokenizer.fit_on_texts(vocabs)
    print(my_tokenizer.word_index)
    print('=-='*10)
    for vocab in vocabs:
        zero_list = [0] * len(vocabs)
        print(zero_list)
        idx = my_tokenizer.word_index[vocab]-1
        zero_list[idx] = 1
        print(f'{vocab}的one-hot编码为:{zero_list}')

    joblib.dump(my_tokenizer,'./model/one-hot_tokenizer.pkl')
    print('one-hot编码器保存成功!')

输出:

one-hot编码的使用

def dm02():
    my_tokenizer = joblib.load('./model/one-hot_tokenizer.pkl')

    print(my_tokenizer.word_index)

    token = '陈奕迅'
    zero_list = [0]*len(my_tokenizer.word_index)
    idx = my_tokenizer.word_index[token] -1
    zero_list[idx] = 1
    print(f'{token}对应的one-hot编码为:{zero_list}')

输出:

one-hot编码的简单实现

def dm03():
    vocabs = {'周杰伦', '陈奕迅', '王力宏', '李宗盛', '李薇薇', '江苏龙'}
    word2index = {vocab:i for i,vocab in enumerate(vocabs)}
    print(word2index)
    for vocab in vocabs:
        zero_list =[0]*len(vocabs)
        idx = word2index[vocab]
        zero_list[idx]=1
        print(f'{vocab}对应的one-hot编码为:{zero_list}')

输出:

每个都是固定的

• 优缺点 ·优点:操作简单,容易理解 ·缺点;完全割裂了词与词之间的联系;大语料集下,每个向量的长度过大,占据大量内存 属于稀疏词向量表示

• 抛砖 ·正因为one-hot编码隔离了词和词的联系,又易浪费内存空间 ·出现了:稠密向量的表示方法:word2vec 和word embedding

word2vec

Word2Vec概念

是一种将单词转换为词向量的自然语言处理技术 是利用深度学习网络来探索单词和单词之间的语义关系,用深度学习的网络权重参数表示词向量是在无监督的语料上构建了一个有监督的任务

word2vec训练词向量的方式

CBOW(Continuous Bag of Words)-适用于高频词

试图根据上下文中的周围单词来预测当前单词(简言之:两侧预测中间) 它将周围单词的词向量求和或取平均作为上下文的表示,然后通过一个神经网络进行预测。

Skip-gram方式训练词向量-适用于低频词

试图根据当前单词来预测上下文中的周围单词(简言之:中间预测两侧) 它将当前单词的词向量作为输入,然后通过一个神经网络来预测周围单词

CBOW方式

·例子:构建神经网络通过CBOW方式来训练词向量 ·已知数据:有5个字母构成的文本序列:“abcdeaaeddccbadae …”; 其中a、b、c、d、e的one-hot表示为见表格

需求: 构建神经网络,输入层数据要求5个特征,隐藏层有3个神经元(超参数,可自定义),输出层5个神经元。 使用已知数据训练这个神经网络。 用隐藏层的权重参数充当“a”“b”“c”“d”这5个单词的词向量。