NLP入门

目录

一、自然语言处理入门

1.NLP定义

2.NLP发展简史

3.NLP应用场景

二、文本预处理

1.认识文本预处理

2.文本处理的基本方法

[2.1 分词](#2.1 分词)

[2.2 命名实体识别(NER)](#2.2 命名实体识别(NER))

3.文本张量的表示方法

[3.1 One-Hot 词向量表示](#3.1 One-Hot 词向量表示)

[3.2 Word2Vec模型](#3.2 Word2Vec模型)

CBOW

skipgram

Fasttext实现word2vec的训练

[3.3 WordEmbedding词向量](#3.3 WordEmbedding词向量)


一、自然语言处理入门

1.NLP定义

复制代码
NLP:让计算机去理解人类的语言

2.NLP发展简史

复制代码
1950: 图灵提出:机器能够思考吗?划时代的话题
1957-1970: NLP领域形成两大阵营:规则+统计
1994-1999: 基于统计的方法占据上风
2000-2008: 机器学习占据领导地位
2015-2023: 深度学习技术改革NLP
2023年至今: 大模型AIGC时代

3.NLP应用场景

复制代码
语音识别
机器翻译
搜素引擎
智能对话
。。。

二、文本预处理

1.认识文本预处理

文本预处理及作用:

复制代码
pandas第三方库:本质就是进行数据分析
对中文文本进行数据预处理,来符合模型输入的要求

文本预处理的主要环节:

复制代码
1. 文本处理的基本方法: 分词、词性标注、命名实体识别
2. 文本张量的表示方法: one-hot、 word2vec、wordEmbedding
...

2.文本处理的基本方法

2.1 分词

分词的意义:

复制代码
定义: 将连续的字序列,按照一定的方式重新组合成词序列的过程
原因: 1.模型训练之前,必须先分词,单词是我们理解语意的基本单元;2.英文具有天然的空格切分,但是中文没有

常用分词工具:

jieba分词工具:

  • 精确模式:就是按照人类擅长的表达词汇的习惯来分词
python 复制代码
import jieba
content = "传智教育是一家上市公司,旗下有黑马程序员品牌。我是在黑马这里学习人工智能"
# 精确模型:试图将句子最精确地切开,适合文本分析。也属于默认模式
jieba.cut(content, cut_all=False)  # cut_all默认为False

# 将返回一个生成器对象
<generator object Tokenizer.cut at 0x7f8d9053e650>

# 若需直接返回列表内容, 使用jieba.lcut即可
jieba.lcut(content, cut_all=False)
['传智', '教育', '是', '一家', '上市公司', ',', '旗下', '有', '黑马', '程序员', '品牌', '。', '我', '是', '在', '黑马', '这里', '学习', '人工智能']
  • 全模式分词:将尽可能成词的词汇分割出来
python 复制代码
# 若需直接返回列表内容, 使用jieba.lcut即可
jieba.lcut(content, cut_all=True)

['传', '智', '教育', '是', '一家', '上市', '上市公司', '公司', '', '', '旗下', '下有', '黑马', '程序', '程序员', '品牌', '', '', '我', '是', '在', '黑马', '这里', '学习', '人工', '人工智能', '智能']

# 注意1:人工智能全模型分成三个词
# 注意2:逗号和句号也给分成了词
  • 搜索引擎模式:在精确模式分词的基础上,将长粒度的词再次切分
python 复制代码
import jieba
content = "传智教育是一家上市公司,旗下有黑马程序员品牌。我是在黑马这里学习人工智能"
jieba.cut_for_search(content)

# 将返回一个生成器对象
<generator object Tokenizer.cut_for_search at 0x7f8d90e5a550>

# 若需直接返回列表内容, 使用jieba.lcut_for_search即可
jieba.lcut_for_search(content)
['传智', '教育', '是', '一家', '上市', '公司', '上市公司', ',', '旗下', '有', '黑马', '程序', '程序员', '品牌', '。', '我', '是', '在', '黑马', '这里', '学习', '人工', '智能', '人工智能']

# 对'无线电'等较长词汇都进行了再次分词.
  • 支持中文繁体分词
python 复制代码
import jieba
content = "煩惱即是菩提,我暫且不提"
jieba.lcut(content)
['煩惱', '即', '是', '菩提', ',', '我', '暫且', '不', '提']
  • 支持用户自定义词典
  • 词典的意义:
python 复制代码
如果用户指定的词典,那么jieba优先根据词典里面的词进行分词
词典的构造格式:
每一行有3个元素:word 词频(省略) 词性(省略)
# 格式:word1 freq1 word_type1
黑马程序员 5 n
传智教育 6 n
人工智能 7 nz
学习 3
上市 3 
  • 代码实现:
python 复制代码
import jieba

sentence = '传智教育是一家上市公司,旗下有黑马程序员品牌。我是在黑马这里学习人工智能'
# 1 没有使用用户自定义词典
mydata = jieba.lcut(sentence, cut_all=False)
print('mydata-->', mydata)

# 2 使用用户自定义词典
jieba.load_userdict("./userdict.txt")
mydata2 = jieba.lcut(sentence, cut_all=False)
print('mydata2-->', mydata2)

# 没有使用用户自定义词典的分词效果
mydata--> ['传智', '教育', '是', '一家', '上市公司', ',', '旗下', '有', '黑马', '程序员', '品牌', '。', '我', '是', '在', '黑马', '这里', '学习', '人工智能']

# 使用用户自定义词典的分词效果
mydata2--> ['传智教育', '是', '一家', '上市公司', ',', '旗下', '有', '黑马程序员', '品牌', '。', '我', '是', '在', '黑马', '这里', '学习', '人工智能']

2.2 命名实体识别(NER)

  • 定义:
python 复制代码
命名实体:通常指:人名、地名、机构名等专有名词
NER:从一段文本中识别出上述描述的命名实体
  • 实现方式:
python 复制代码
模型训练
  • 词性标注
  • 定义:
python 复制代码
对每个词语进行词性的标注:动词、名词、形容词等
  • 实现方式:
python 复制代码
import jieba.posseg as pseg
content = "我喜欢学习"
pseg.lcut(content)

3.文本张量的表示方法

  • 文本张量表示
python 复制代码
意义:将文本转换为向量(数字)的形式,使得模型能够识别进而实现训练,一般是进行词向量的表示
实现的方式:
one-hot
word2Vec
wordEmbedding

3.1 One-Hot 词向量表示

  • 定义:
python 复制代码
针对每一个词汇,都会用一个向量表示,向量的长度是n,n代表去重之后的词汇总量,而且向量中只有0和1两种数字
俗称:独热编码、01编码
  • 代码实现
python 复制代码
import jieba
# 导入keras中的词汇映射器Tokenizer
from tensorflow.keras.preprocessing.text import Tokenizer
# 导入用于对象保存与加载的joblib
from sklearn.externals import joblib

# 思路分析 生成onehot
# 1 准备语料 vocabs
# 2 实例化词汇映射器Tokenizer, 使用映射器拟合现有文本数据 (内部生成 index_word word_index)
# 2-1 注意idx序号-1
# 3 查询单词idx 赋值 zero_list,生成onehot
# 4 使用joblib工具保存映射器 joblib.dump()
def dm_onehot_gen():

    # 1 准备语料 vocabs
    vocabs = {"周杰伦", "陈奕迅", "王力宏", "李宗盛", "吴亦凡", "鹿晗"}

    # 2 实例化词汇映射器Tokenizer, 使用映射器拟合现有文本数据 (内部生成 index_word word_index)
    # 2-1 注意idx序号-1
    mytokenizer = Tokenizer()
    mytokenizer.fit_on_texts(vocabs)

    # 3 查询单词idx 赋值 zero_list,生成onehot
    for vocab in vocabs:
        zero_list = [0] * len(vocabs)
        idx = mytokenizer.word_index[vocab] - 1
        zero_list[idx] = 1
        print(vocab, '的onehot编码是', zero_list)

    # 4 使用joblib工具保存映射器 joblib.dump()
    mypath = './mytokenizer'
    joblib.dump(mytokenizer, mypath)
    print('保存mytokenizer End')

    # 注意5-1 字典没有顺序 onehot编码没有顺序 []-有序 {}-无序 区别
    # 注意5-2 字典有的单词才有idx idx从1开始
    # 注意5-3 查询没有注册的词会有异常 eg: 狗蛋
    print(mytokenizer.word_index)
    print(mytokenizer.index_word)
  • One-Hot的使用
python 复制代码
# 思路分析
# 1 加载已保存的词汇映射器Tokenizer joblib.load(mypath)
# 2 查询单词idx 赋值zero_list,生成onehot 以token为'李宗盛'
# 3 token = "狗蛋" 会出现异常
def dm_onehot_use():

    vocabs = {"周杰伦", "陈奕迅", "王力宏", "李宗盛", "吴亦凡", "鹿晗"}

    # 1 加载已保存的词汇映射器Tokenizer joblib.load(mypath)
    mypath = './mytokenizer'
    mytokenizer = joblib.load(mypath)

    # 2 编码token为"李宗盛"  查询单词idx 赋值 zero_list,生成onehot
    token = "李宗盛"
    zero_list = [0] * len(vocabs)
    idx = mytokenizer.word_index[token] - 1
    zero_list[idx] = 1
    print(token, '的onehot编码是', zero_list)
  • One-Hot编码的缺点:
python 复制代码
割裂了词与词之间的联系(主要)
如果n过大,会导致占用大量的内存(维度爆炸)

3.2 Word2Vec模型

python 复制代码
word2vec是一种无监督的训练方法,本质是训练一个模型,将模型的参数矩阵当作所有词汇的词向量表示
两种训练方式:cbow、skipgram
CBOW
python 复制代码
给一段文本,选择一定的窗口,然后利用上下文预测中间目标词
  • 实现过程:
skipgram
  • 定义:给你一段文本,选定特定的窗口长度,然后利用中间词来预测上下文

  • 实现过程:1、选定一个窗口长度:3、5、7等;2、指定词向量的维度:人为规定

  • 获取词向量
Fasttext实现word2vec的训练
  • 基本过程:

    • 导包:fasttext
    • 获取数据集
    • 训练和保存
    • 加载使用
python 复制代码
# 导入fasttext
import fasttext

def dm_fasttext_train_save_load():
    # 1 使用train_unsupervised(无监督训练方法) 训练词向量
    mymodel = fasttext.train_unsupervised('./data/fil9')
    print('训练词向量 ok')

    # 2 save_model()保存已经训练好词向量 
    # 注意,该行代码执行耗时很长 
    mymodel.save_model("./data/fil9.bin")
    print('保存词向量 ok')

    # 3 模型加载
    mymodel = fasttext.load_model('./data/fil9.bin')
    print('加载词向量 ok')


# 步骤1运行效果如下:
有效训练词汇量为124M, 共218316个单词
Read 124M words
Number of words:  218316
Number of labels: 0
Progress: 100.0% words/sec/thread:   53996 lr:  0.000000 loss:  0.734999 ETA:   0h 0m

3.3 WordEmbedding词向量

  • 定义:将词映射到指定维度的空间:词向量的一种表示方法

  • 实现过程

python 复制代码
def dm02_nnembeding_show():

    # 1 对句子分词 word_list
    sentence1 = '传智教育是一家上市公司,旗下有黑马程序员品牌。我是在黑马这里学习人工智能'
    sentence2 = "我爱自然语言处理"
    sentences = [sentence1, sentence2]

    word_list = []
    for s in sentences:
        word_list.append(jieba.lcut(s))
    # print('word_list--->', word_list)

    # 2 对句子word2id求my_token_list,对句子文本数值化sentence2id
    mytokenizer = Tokenizer()
    mytokenizer.fit_on_texts(word_list)
    # print(mytokenizer.index_word, mytokenizer.word_index)

    # 打印my_token_list
    my_token_list = mytokenizer.index_word.values()
    print('my_token_list-->', my_token_list)

    # 打印文本数值化以后的句子
    sentence2id = mytokenizer.texts_to_sequences(word_list)
    print('sentence2id--->', sentence2id, len(sentence2id))

    # 3 创建nn.Embedding层
    embd = nn.Embedding(num_embeddings=len(my_token_list), embedding_dim=8)
    # print("embd--->", embd)
    # print('nn.Embedding层词向量矩阵-->', embd.weight.data, embd.weight.data.shape, type(embd.weight.data))

    # 4 创建SummaryWriter对象 词向量矩阵embd.weight.data 和 词向量单词列表my_token_list
    summarywriter = SummaryWriter()
    summarywriter.add_embedding(embd.weight.data, my_token_list)
    summarywriter.close()

    # 5 通过tensorboard观察词向量相似性
    # cd 程序的当前目录下执行下面的命令
    # 启动tensorboard服务 tensorboard --logdir=runs --host 0.0.0.0
    # 通过浏览器,查看词向量可视化效果 http://127.0.0.1:6006

    print('从nn.Embedding层中根据idx拿词向量')
    # # 6 从nn.Embedding层中根据idx拿词向量
    for idx in range(len(mytokenizer.index_word)):
        tmpvec = embd(torch.tensor(idx))
        print('%4s'%(mytokenizer.index_word[idx+1]), tmpvec.detach().numpy())
  • 可视化:
  • 工具:tensorboard
  • 命令: tensorboard --logdir=runs --host 0.0.0.0
相关推荐
独隅1 小时前
将MAE模型从PyTorch无缝迁移到TensorFlow Lite的完整实践指南
人工智能·pytorch·tensorflow
HackTorjan1 小时前
AI图像处理的核心原理:深度学习驱动的视觉特征提取与重构
图像处理·人工智能·深度学习·django·sqlite
梦梦代码精2 小时前
从工程视角拆解 BuildingAI:一个企业级开源智能体平台的架构设计与实现
人工智能·gitee·开源·github
supericeice2 小时前
复杂项目管理如何用好大模型:RAG、知识图谱与AI编排的落地框架
人工智能·知识图谱
AI机器学习算法8 小时前
深度学习模型演进:6个里程碑式CNN架构
人工智能·深度学习·cnn·大模型·ai学习路线
Ztopcloud极拓云视角8 小时前
从 OpenRouter 数据看中美 AI 调用量反转:统计口径、模型路由与多云应对方案
人工智能·阿里云·大模型·token·中美ai
AI医影跨模态组学8 小时前
如何将深度学习MTSR与膀胱癌ITGB8/TGF-β/WNT机制建立关联,并进一步解释其与患者预后及肿瘤侵袭、免疫抑制的生物学联系
人工智能·深度学习·论文·医学影像
搬砖的前端8 小时前
AI编辑器开源主模型搭配本地模型辅助对标GPT5.2/GPT5.4/Claude4.6(前端开发专属)
人工智能·开源·claude·mcp·trae·qwen3.6·ops4.6
Python私教9 小时前
Hermes Agent 安全加固与生态扩展:2026-04-23 更新解析
人工智能