NLP 快速上手

阅读: 评论:0

NLP 快速上手

NLP 快速上手

文章目录

    • 前言
    • NLP 历史回顾
    • NLP任务
    • 基本概念
      • TF-IDF词袋模型
      • Word2Vec
      • word2vec使用示例
      • BERT的语言模型
      • Bert做embedding的示例代码
    • 语料的标注
      • AI语料标注师岗位职责
    • 模型
      • Transformer
      • BERT
    • Hugging Face
    • transformer模型的使用
      • Hugging Face模型的下载
      • 模型转换
    • 在ElasticSearch中使用NLP
    • 参考链接
      • NLP文献
      • 模型库
      • 开源NLP

前言

学习NLP,解决两个问题:

  • 如何使用别人训练好的模型?
  • 如何基于别人的模型,加入自己的数据,训练得到自己的模型?

答案是使用预训练模型。预训练模型(pre-training model)是先通过一批语料进行训练模型,然后在这个初步训练好的模型基础上,再继续训练或者另作他用。这样的理解基本上是对的,预训练模型的训练和使用分别对应两个阶段:预训练阶段(pre-training)和 微调(fune-tuning)阶段。

NLP 历史回顾

文法规则->统计语言学->神经网络方法


2017年谷歌提出了Transformer架构模型,2018年底,基于Transformer架构,谷歌推出了bert模型,bert模型一诞生,便在各大11项NLP基础任务中展现出了卓越的性能(一个排名榜单),现在很多模型都是基于或参考Bert模型进行改造。

Transformer 架构是自然语言处理领域最近几乎所有主要发展的核心。这种 Transformer 架构的性能优于 RNN 和 CNN(卷积神经网络)。而且训练模型所需的计算资源也大为减少。

BERT (Bidirectional Encoder Representations)双向编码器表示是第一个无监督、深度双向的自然语言处理模型预训练系统。它只使用纯文本语料库进行训练。

NLP任务

目前NLP可以处理的任务主要包含以下几个大类:问答系统,文档摘要,机器翻译,语音识别,文档分类等。

基本概念

TF-IDF词袋模型

TF-IDF(Term Frequency-inverse Document Frequency)是一种针对关键词的统计分析方法,用于评估一个词对一个文件集或者一个语料库的重要程度。一个词的重要程度跟它在文章中出现的次数成正比,跟它在语料库出现的次数成反比。这种计算方式能有效避免常用词对关键词的影响,提高了关键词与文章之间的相关性。

其中TF指的是某词在文章中出现的总次数,该指标通常会被归一化定义为TF=(某词在文档中出现的次数/文档的总词量),这样可以防止结果偏向过长的文档(同一个词语在长文档里通常会具有比短文档更高的词频)。IDF逆向文档频率,包含某词语的文档越少,IDF值越大,说明该词语具有很强的区分能力,IDF=loge(语料库中文档总数/包含该词的文档数+1),+1的原因是避免分母为0。TFIDF=TFxIDF,TFIDF值越大表示该特征词对这个文本的重要性越大。

Word2Vec

Word2Vec是google在2013年推出的一个NLP工具,它的特点是能够将单词转化为向量来表示。基本出发点和Distributed representation类似:上下文相似的两个词,它们的词向量也应该相似。​ word2vec在 2018 年之前非常流行,但是随着 BERT、GPT2.0 等方法的出现,这种方式已经不算效果最好的方法了。

word2vec主要包含两个模型:

  • 连续词袋模型(CBOW,continuous bag of words):
    通过上下文来预测当前值。相当于一句话中扣掉一个词,让你猜这个词是什么。在CBOW模型中包含三层,即输入层,映射层和输出层。输入层是当前词周围每个词对应的词向量,在映射层将这些词的词向量相加求平均,在输出层求出为当前词的概率。

如何根据一个词的one-hot编码,得到它对应的词向量,可以看下图所示:

word2vec训练的目的就是得到这个隐藏层参数矩阵。

  • 跳字模型(skip-gram):
    用当前词来预测上下文。相当于给你一个词,让你猜前面和后面可能出现什么词。输入层是当前词对应的词向量,映射层什么也不做,在输出层求出当前词上下文窗口中词的概率。

word2vec使用示例

dels import word2vec
import jiebadef train():with open('/pub/NLP/天龙八部.txt', errors='ignore', encoding='utf-8') as fp:lines = fp.readlines()for line in lines:seg_list = jieba.cut(line)with open('/pub/NLP/分词后的天龙八部.txt', 'a', encoding='utf-8') as ff:ff.write(' '.join(seg_list)) # 词汇用空格分开# 加载语料sentences = word2vec.Text8Corpus('/pub/NLP/分词后的天龙八部.txt')# 训练模型model = word2vec.Word2Vec(sentences)# 保存模型model.save('/pub/NLP/天龙八部.model')def test_word2vec_model():# 加载模型model = word2vec.Word2Vec.load('/pub/NLP/天龙八部.model')# 选出最相似的10个词for e in st_similar(positive=['段誉'], topn=10):print(e[0], e[1])

输出结果:

乔峰 0.9072518348693848
游坦之 0.9017099738121033
木婉清 0.8961336016654968
虚竹 0.8942322731018066
阿紫 0.8807579874992371
王语嫣 0.8777897953987122
慕容复 0.87125563621521
萧峰 0.8666722178459167
乌老大 0.8532173037528992
段正淳 0.8409541249275208

BERT的语言模型

Bert最关键两点,一点是特征抽取器采用Transformer;第二点是预训练的时候采用双向语言模型。使用Bert得到的embedding可以为下游任务提供高质量的特征。即使没有关键字重叠,还是可以找出比较相似的句子。

BERT是 word2vec的高级进化版,进化的后果【用进废退】就是:BERT广泛成长,word2vec逐渐废弃。
Bert 与 word2vec 的区别是:word2vec中每个单词都有一个固定的表示,而与单词出现的上下文无关;bert生成的单词表示是由单词周围的单词动态形成的。

Bert 有自己的word to vector方法,可以将其看做是embedding生成机制中的一种,但Bert得到embedding是动态的,即使同一个单词得到的embedding可能都不是一样的(因为其上下文可能不同)。但有个问题是:BERT 是由12层 Transformer 构成,每个层得到的输出embedding各不相同,所以就需要我们自己考虑取哪些层的输出。通常情况下,取最后一层的embedding就OK了。

Bert 可以得到word的embedding,句子的embedding,句子的embedding是通过[CLS]获取的。

Attention 是一种算法,可以将其看成是平级于 RNN,LSTM 的一种方法。这种方法的特别之处在于它对一个句子不同的词赋以不同的优先级。transformer 是一种架构,它基于Attention 机制实现。所谓的transformer也就是数个ecoder layer叠加得到的块。【同时需要注意,我们平常也会使用一个包叫做Transformer,这个包实现了诸如BERT,GPT这种常用且著名的算法,这个包由著名的hugging face团队开发】。BERT是一种集合transfomer+双向检索思想得到的算法,它可以很好的提取出文本中的信息。

Bert做embedding的示例代码

"""
实现bert做embedding
"""
import torch
from transformers import BertTokenizer, BertModel # 导入transformer 的包
#torch.set_printoptions(profile="full") # 输出tensor的整个部分
"""
1.from_pretrained()方法是类PreTrainedModel的一个方法
2.这里的如果加上 output_hidden_states=True,那么就会把所有的hidden_states 给输出
如果没有加,那么就只能得到最后一个隐层的输出。
"""
model = BertModel.from_pretrained("bert-base-uncased",output_hidden_states = True)tokenizer = BertTokenizer.from_pretrained('bert-base-uncased')inputs = tokenizer("hello,my dog",return_tensors='pt')
#  执行model[BertModel实例]的forward()方法,但是在执行之前,仍然做了很多其他的事情
_grad():outputs = model(**inputs)hiddden_states = outputs[2] # get the hidden states# The last hidden-state is the first element of the output tuple
last_hidden_states = outputs[0]print(last_hidden_states)"""
1.如果我的句子是 "hello,my dog is cute",那么得到last_hidden_state 的size 
就是torch.Size([1, 8, 768]);如果我的句子是"hello,my dog",那么得到的last_hidden_state
的 就是 torch.size([1,6,768])。也就是中间那个维度的大小是跟句子长度有关系"""
print(last_hidden_states.size())  #"""
inputs 是个字典,的内容如下:
{'input_ids': tensor([[  101,  7592,  1010,  2026,  3899,  2003, 10140,   102]]), 
'token_type_ids': tensor([[0, 0, 0, 0, 0, 0, 0, 0]]), 
'attention_mask': tensor([[1, 1, 1, 1, 1, 1, 1, 1]])
}
"""

语料的标注

标注工具的选择,市面上有多种标注工具可供选择,例如MAE, Callisto,Brandeis Annotation Tool,Prodigy(收费)等。

AI语料标注师岗位职责

1.负责语料库的收集、整理和分类工作
2.根据需求完成数据预处理任务
3.使用自然语言处理技术对语料进行解析和分析,并产生文本数据
4.通过分析数据和算法实现自动化文本分类模型训练
5.持续优化模型性能和精度,提升效果
6.编写相关文档资料等,协助其他人员使用语料库
7.维护语料库并进行定期更新和维护

模型

Transformer

自从 BERT 和 GPT 模型取得重大成功之后, Transformer 结构已经替代了循环神经网络 (RNN) 和卷积神经网络 (CNN),成为了当前 NLP 模型的标配。两个著名 Transformer 模型: GPT和BERT。

Transformers 是由 Hugging Face 开发的一个 NLP 包,支持加载目前绝大部分的预训练模型。随着 BERT、GPT 等大规模语言模型的兴起,越来越多的公司和研究者采用 Transformers 库来构建 NLP 应用。

BERT

2018 年底随着 BERT 的提出,这一阶段神经语言模型的发展终于出现了一位集大成者,它在 11 个 NLP 任务上都达到了最好性能。
BERT 在模型大框架上采用和 GPT 完全相同的两阶段模型,首先是语言模型预训练,然后使用微调模式解决下游任务。BERT 不仅像 GPT 模型一样采用 Transformer 作为编码器,而且在预训练阶段采用了类似 ELMO 的双向语言模型。

因此 BERT 不仅编码能力强大,而且对各种下游任务,Bert 都可以简单地通过改造输入输出部分来完成。但是 BERT 的优点同样也是它的缺陷,由于 BERT 构建的是双向语言模型,因而无法直接用于文本生成任务。

Hugging Face

Hugging Face Transformers 是自然语言处理领域的重要开源项目,提供了基于通用架构(如 BERT,GPT-2,RoBERTa)的数千个预训练模型,并提供了 PyTorch 和 TensorFlow 的良好互操作性。

Hugging face 起初是一家总部位于纽约的聊天机器人初创服务商,他们本来打算创业做聊天机器人,然后在github上开源了一个Transformers库,虽然聊天机器人业务没搞起来,但是他们的这个库在机器学习社区迅速大火起来。目前已经共享了超100,000个预训练模型,10,000个数据集,变成了机器学习界的github。

Hugging Face Hub 平台为自然语言处理社区提供了一个中心化的地方,使人们可以共享和发现各种自然语言处理模型和数据集。该公司主要是提供nlp服务,同时它提供了一个很🐂的开源社区,这里可以找到大部分开源model。其对外提供了一个库 Transformers,Transformers 提供了数以千计的预训练模型,支持 100 多种语言的文本分类、信息抽取、问答、摘要、翻译、文本生成,并且Transformers 与 PyTorch、 TensorFlow 无缝整合。
功能包括:

  • 模型
  • 数据集
  • 模型验证
  • 模型部署等
    使开发人员可以更轻松地管理和使用自然语言处理模型,任何人都可以利用机器学习进行探索、实验、合作和构建技术。

transformer模型的使用

一般transformer模型有三个部分组成&#kennizer,2.Model,3.Post processing。如下图所示,图中第二层和第三层是每个部件的输入/输出以及具体的案例。我们可以看到三个部分的具体作用:Tokenizer就是把输入的文本做切分,然后变成向量,Model负责根据输入的变量提取语义信息,输出logits;最后Post Processing根据模型输出的语义信息,执行具体的nlp任务,比如情感分析,文本自动打标签等;可见Model是其中的核心部分,Model又可以分为三种模型,针对不同的NLP任务,需要选取不同的模型类型:Encoder模型(如Bert,常用于句子分类、命名实体识别(以及更普遍的单词分类)和抽取式问答。),Decoder模型(如GPT,GPT2,常用于文本生成),以及sequence2sequence模型(如BART,常用于摘要,翻译,生成性问答等):

    bert_dir = '/opt/data/models/bert-base-chinese'   tokenizer = AutoTokenizer.from_pretrained(bert_dir, local_files_only=True)config = BertConfig.from_pretrained(os.path.join(bert_dir, "config.json"))# 导入模型    model = AutoModelForMaskedLM.from_pretrained(bert_dir,config=config,local_files_only=True)device = torch.device("cuda:0" if torch.cuda.is_available() else "cpu")(device)sentence = '中国足球为何不能进世界杯'inputs = tokenizer(sentence,truncation="longest_first",return_tensors="pt")inputs = (device)_grad():outputs = model(**inputs)logits = outputs[0]label = torch.max(logits.data, 1)[1].tolist()print("分类结果:" + config.label_list[label[0]])

Hugging Face模型的下载

方式一, 采用git lfs:

brew install git-lfs
git clone
如:git clone

方式二,采用huggingface_hub库:
安装:

python -m pip install huggingface_hub

from huggingface_hub import snapshot_download
snapshot_download(repo_id="bert-base-chinese")
## 指定文件或忽略文件使用参数:allow_regex,ignore_regex
snapshot_download(repo_id="bert-base-chinese", ignore_regex=["*.h5", "*.ot", "*.msgpack"])

也可以使用proxy:

import requests
from huggingface_hub import configure_http_backend, get_session# Create a factory function that returns a Session with configured proxies
def backend_factory() -> requests.Session:session = requests.Session()session.proxies = {"http": ":3128", "https": ":1080"}return session# Set it as the default session factory
configure_http_backend(backend_factory=backend_factory)# In practice, this is mostly done internally in `huggingface_hub`
session = get_session()

单一文件下载:

from huggingface_hub import hf_hub_download
hf_hub_download(repo_id="lysandre/arxiv-nlp", filename="config.json")hf_hub_download(repo_id="google/fleurs", filename="fleurs.py", repo_type="dataset")

指定版本:

hf_hub_download(repo_id="lysandre/arxiv-nlp", filename="config.json", revision="v1.0")hf_hub_download(repo_id="lysandre/arxiv-nlp", filename="config.json", revision="test-branch")hf_hub_download(repo_id="lysandre/arxiv-nlp", filename="config.json", revision="refs/pr/3")hf_hub_download(repo_id="lysandre/arxiv-nlp", filename="config.json", revision="877b84a8f93f2d619faa2a6e514a32beef88ab0a")

使用命令行工具huggingface-cli:

huggingface-cli download gpt2 config.json

模型转换

将TensorFlow版本模型转为Pytorch版本:.html
具体每个模型如何转为相应的Pytorch版本:.py文件,如bert的.py

在ElasticSearch中使用NLP

ES可以在矢量相似度搜索中使用NLP模型。矢量相似度搜索(通常也称为语义搜索)超越了传统的基于关键字的搜索,让用户可以找到语义相似但可能没有任何共同关键字的文档,从而提供更广泛的结果。矢量相似度搜索作用于密集矢量,并使用 k-最近邻搜索来查找相似矢量。

将模型导入集群:

eland_import_hub_model --url <user>:<password>@localhost:9200/ --hub-model-id sentence-transformers/msmarco-MiniLM-L-12-v3 --task-type text_embedding --start

参考链接

NLP文献

  • transformers快速入门
  • 从零开始训练GPT
  • 知乎看山杯第一名解决方案
  • 用深度学习(CNN RNN Attention)解决大规模文本分类问题 - 综述和实践
  • 知乎“看山杯” 夺冠记
  • 汉语自然语言处理
  • 汉语自然语言处理-BERT的解读语言模型预训练
  • 前端工程师如何快速使用一个NLP模型
  • 深度学习百科及面试资源
  • BERT初学者九问

模型库

  • 华为昇腾ModelZoo

  • Hugging Face

  • transformers

  • huggingface github

  • huggingface_hub 模型下载API

  • A Survey of Large Language Models

  • 预训练模型下载

开源NLP

  • PaddleNLP
  • HanLP
  • FudanNLP
  • 哈工大NLP

本文发布于:2024-02-01 09:37:40,感谢您对本站的认可!

本文链接:https://www.4u4v.net/it/170675146035710.html

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。

标签:上手   快速   NLP
留言与评论(共有 0 条评论)
   
验证码:

Copyright ©2019-2022 Comsenz Inc.Powered by ©

网站地图1 网站地图2 网站地图3 网站地图4 网站地图5 网站地图6 网站地图7 网站地图8 网站地图9 网站地图10 网站地图11 网站地图12 网站地图13 网站地图14 网站地图15 网站地图16 网站地图17 网站地图18 网站地图19 网站地图20 网站地图21 网站地图22/a> 网站地图23