待完成

  • 示例详解

Attention 原文

Why

  • 全面拥抱Transformer:NLP三大特征抽取器(CNN/RNN/TF)中,近两年新欢Transformer明显会很快成为NLP里担当大任的最主流的特征抽取器。

  • 像Wordvec出现之后一样,在人工智能领域种各种目标皆可向量化,也就是我们经常听到的“万物皆可Embedding”。而Transformer模型和Bert模型的出现,更是NLP领域划时代的产物:将transformer和双向语言模型进行融合,便得到NLP划时代的,也是当下在各自NLP下流任务中获得state-of-the-art的模型-BERT

  • BERT起源于预训练的上下文表示学习,与之前的模型不同,BERT是一种深度双向的、无监督的语言表示,且仅使用纯文本语料库进行预训练的模型。上下文无关模型(如word2vec或GloVe)为词汇表中的每个单词生成一个词向量表示,因此容易出现单词的歧义问题。BERT考虑到单词出现时的上下文。例如,词“水分”的word2vec词向量在“植物需要吸收水分”和“财务报表里有水分”是相同的,但BERT根据上下文的不同提供不同的词向量,词向量与句子表达的句意有关。

Embedding:

img

  • 首先类似 word2vec 的 token化,再进行片段标记( segment ),最后 ids 的位置编码( position )
  • 编码后一个 ’词‘ 有三个信息,token、段落位置信息、绝对位置信息( id: 1、2、3…)

Embedding解决的问题:

  • 首先是之前用的 One-Hot Key,高维度,离散的,低信息密度的储存形式
  • 其次是更好的 Contextual Similarity,上下文相关相似性。

Preview Api

前置查看:

1
2
3
4
5
6
from transformers import BertTokenizer
tokenizer = BertTokenizer.from_pretrained("bert-base-chinese") # 获取相应模型的tokenizer

from transformers import AutoTokenizer, AutoModelForMaskedLM
model = AutoModelForMaskedLM.from_pretrained("bert-base-chinese") #查看模型的分层

函数调用:

字典大小,token化,ids化

1
2
3
4
5
6
7
8
9
10
vocab = tokenizer.vocab
print("字典大小:", len(vocab)) # 查看字典大小

text = "[CLS] 等到潮水 [MASK] 了,就知道谁沒穿裤子。"
tokens = tokenizer.tokenize(text) # 将文字分词
ids = tokenizer.convert_tokens_to_ids(tokens) # 将文字转化为数字,进行编码
'''
['[CLS]', '等', '到', '潮', '水', '[MASK]', '了', ',', '就', '知'] ...
[101, 5023, 1168, 4060, 3717, 103, 749, 8024, 2218, 4761] ...
'''

Mask模型的使用

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
from transformers import BertForMaskedLM
# 除了 tokens 以外我們還需要辨別句子的 segment ids
tokens_tensor = torch.tensor([ids]) # (1, seq_len)
segments_tensors = torch.zeros_like(tokens_tensor) # (1, seq_len)
maskedLM_model = BertForMaskedLM.from_pretrained(PRETRAINED_MODEL_NAME)

# 使用 masked LM 估計 [MASK] 位置所代表的實際 token
maskedLM_model.eval()
with torch.no_grad():
outputs = maskedLM_model(tokens_tensor, segments_tensors)
predictions = outputs[0]
# (1, seq_len, num_hidden_units)
del maskedLM_model

# 將 [MASK] 位置的機率分佈取 top k 最有可能的 tokens 出來
masked_index = 5
k = 3
probs, indices = torch.topk(torch.softmax(predictions[0, masked_index], -1), k)
predicted_tokens = tokenizer.convert_ids_to_tokens(indices.tolist())

# 顯示 top k 可能的字。一般我們就是取 top 1 当做预测值
print("輸入 tokens :", tokens[:10], '...')
print('-' * 50)
for i, (t, p) in enumerate(zip(predicted_tokens, probs), 1):
tokens[masked_index] = t
print("Top {} ({:2}%):{}".format(i, int(p.item() * 100), tokens[:10]), '...')

​ 輸入 tokens : [‘[CLS]’, ‘等’, ‘到’, ‘潮’, ‘水’, ‘[MASK]’, ‘了’, ‘,’, ‘就’, ‘知’] …
​ Top 1 (65%):[‘[CLS]’, ‘等’, ‘到’, ‘潮’, ‘水’, ‘来’, ‘了’, ‘,’, ‘就’, ‘知’] …
​ Top 2 ( 4%):[‘[CLS]’, ‘等’, ‘到’, ‘潮’, ‘水’, ‘过’, ‘了’, ‘,’, ‘就’, ‘知’] …
​ Top 3 ( 4%):[‘[CLS]’, ‘等’, ‘到’, ‘潮’, ‘水’, ‘干’, ‘了’, ‘,’, ‘就’, ‘知’] …

可视化模型: bertviz

Pandas预处理文本

  1. 多使用自定义函数
  2. nltk库的stopwords
  3. textblob库的拼写检查、词干抽取、词性还原等

文本数据的基本体征提取

  • 词汇数量

  • 字符数量

  • 平均字长

  • 停用词数量

  • 特殊字符数量

  • 数字数量

  • 大写字母数量

文本数据的基本预处理

  • 小写转换
  • 去除标点符号
  • 去除停用词
  • 去除频现词
  • 去除稀疏词
  • 拼写校正
  • 分词(tokenization)
  • 词干提取(stemming)
  • 词形还原(lemmatization)