计算机视觉和图像处理
NLP自然语言处理
一、NLP简介
自然语言处理(Natural Language Processing,简称 NLP)是计算机科学、人工智能和语言学的一个分支,旨在使计算机能够理解、解释和生成人类的自然语言。NLP 的目标是弥合人类通信和计算机理解之间的差距,使得计算机能够以更智能、更有效的方式处理文本和语音数据。
NLP 的主要任务
- 文本分类:
- 情感分析:判断文本的情感倾向,如正面、负面或中性。
- 主题分类:将文档归类到预定义的主题类别中。
- 垃圾邮件检测:识别电子邮件或消息是否为垃圾信息。
- 命名实体识别(NER):
- 识别文本中的特定实体,如人名、地名、组织名、日期等。
- 关系抽取:
- 从文本中提取实体之间的关系,如“奥巴马是美国的总统”。
- 句法分析:
- 词性标注:为每个词标注其词性(名词、动词、形容词等)。
- 依存关系分析:分析句子中词与词之间的依存关系。
- 语义分析:
- 语义角色标注:识别句子中的谓词及其论元。
- 共指消解:确定文本中哪些词语指的是同一个实体。
- 机器翻译:
- 将一种自然语言翻译成另一种自然语言,如将英文翻译成中文。
- 对话系统:
- 聊天机器人:构建能够与用户进行自然对话的系统。
- 语音识别:将语音信号转换为文本。
- 语音合成:将文本转换为语音信号。
- 文本生成:
- 自动摘要:生成文本的简洁摘要。
- 创意写作:生成诗歌、故事等创意文本。
NLP 的技术方法
- 统计方法:
- 使用统计模型(如朴素贝叶斯、支持向量机、隐马尔可夫模型等)来处理文本数据。
- 深度学习方法:
- 循环神经网络(RNN):处理序列数据,适用于文本生成和序列标注任务。
- 长短期记忆网络(LSTM):改进的 RNN,能够更好地处理长依赖问题。
- Transformer 模型:基于自注意力机制的模型,广泛应用于各种 NLP 任务,如 BERT、GPT 等。
- 卷积神经网络(CNN):用于提取局部特征,适用于文本分类任务。
二、文本预处理
2.1 文本预处理简介
文本语料在输送给模型前一般需要一系列的预处理工作, 才能符合模型输入的要求, 如: 将文本转化成模型需要的张量, 规范张量的尺寸等, 而且科学的文本预处理环节还将有效指导模型超参数的选择, 提升模型的评估指标.
2.2 文本处理的基本方法
分词就是将连续的字序列按照一定的规范重新组合成词序列的过程。
分词的作用:
词作为语⾔语义理解的最小单元, 是⼈类理解文本语言的基础. 因此也是AI解决NLP领域高阶任务, 如自动问答, 机器翻译, 文本生成的重要基础环节.
jieba分词器
使用jieba前需要先导包,在命令行输入:pip install jieba
- 精确模式分词,试图将句子最精确地切开,适合文本分析.
import jieba
# 精确模式分词,cut_all=False
content = "它的主要功能是作为Jupyter的内核,允许 Jupyter Notebook与不同的Python环境进行交互。"
jieba.cut(content,cut_all=False)
返回一个生成器对象
# lcut直接显示分词内容
words = jieba.lcut(content)
result = ' '.join(words)
result
- 全模式分词,把句子中所有的可以成词的词语都扫描出来, 速度非常快,但是不能消除歧义
# 全模式分词,cut_all=True
content = "它的主要功能是作为Jupyter的内核,允许 Jupyter Notebook与不同的Python环境进行交互"
jieba.cut(content,cut_all=True)
words = jieba.lcut(content)
result = ' '.join(words)
result
- 搜索引擎模式分词,在精确模式的基础上,对长词再次切分,提高召回率。
# 搜索引擎模式分词
content = "它的主要功能是作为Jupyter的内核,允许 Jupyter Notebook与不同的Python环境进行交互"
jieba.cut_for_search(content)
words = jieba.lcut_for_search(content)
result = ' '.join(words)
result
- 中文繁体分词
content = "煩惱即是菩提,我暫且不提"
jieba.cut(content,cut_all=False)
jieba.lcut(content)
- 自定义词典分词
# 使用不了自定义词典,加载不到userdict.txt! 但方法就是这方法
jieba.load_userdict("./userdict.txt")
jieba.lcut("⼋⼀双⿅更名为⼋⼀南昌篮球队!")
- 使用jieba进行中文词性标注
# 使用jieba进行中文词性标注
import jieba.posseg as pseg
pseg.lcut("我爱北京天安门")
2.3 文本张量表示方法
2.3.1 onehot编码
# 用于对象的保存和加载
import joblib
from tensorflow.keras.preprocessing.text import Tokenizer
# onehot编码
words = {
"周杰伦", "陈奕迅", "王力宏", "李宗盛", "吴亦凡", "鹿晗"}
# 实例化词汇映射器对象
# char_level词汇单位是单词而不是字符
t = Tokenizer(num_words=None,char_level=False)
# 拟合现有的文本数据
t.fit_on_texts(words)
print(f"词汇表及索引:{
t.word_index}")
for word in words:
one_hot = [0]*len(words)
# texts_to_sequences将当前词汇转换为其在词汇表中的索引位置
# 返回样式[[1]]、[[2]]等
word_index = t.texts_to_sequences([word])[0][0] - 1
one_hot[word_index] = 1
print(f"{
word} 的one-hot编码为:{
one_hot}")
#保存映射
tokenizer_path = "./Tokenizer"
joblib.dump(t,tokenizer_path)
# onehot编码器的使用
# 加载之间保存的Tokenizer
t = joblib.load(tokenizer_path)
# 编码王力宏
word = "王力宏"
word_index = t.texts_to_sequences([word])[0][0] - 1
one_hot[word_index] = 1
print(f"{
word}的one-hot编码为:{
one_hot}")
2.3.2 word2vec编码
fasttext包我导不进来,调了两三个小时!
import fasttext
# 第一步:获取训练数据
data = [
"周杰伦是一位著名的歌手",
"陈奕迅的歌曲非常受欢迎"