HF 01
待完成
示例详解
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:
首先类似 word2vec 的 token化,再进行片段标记( segment ),最后 ids 的位置编码( position )
编码后一个 ’词‘ 有三个信息,token、段落位置信息、绝对位置信息( id: 1、2、3…)
Embedding解决的问题:
首先是之前用的 One-Hot Key,高维度,离散的,低信息密度的储存形式
其次是更好的 Contextual Similarity,上下文相关相似性。
Preview Api前置查看:123456from transformers import BertTokenizertokenizer = BertTokenizer.from_pretrained("bert-base-chinese") # 获取相应模型的tokenizerfrom transformers import AutoTokenizer, AutoModelForMaskedLMmodel = AutoModelForMaskedLM.from_pretrained("bert-base-chinese") #查看模型的分层
函数调用:字典大小,token化,ids化12345678910vocab = tokenizer.vocabprint("字典大小:", 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模型的使用1234567891011121314151617181920212223242526from transformers import BertForMaskedLM# 除了 tokens 以外我們還需要辨別句子的 segment idstokens_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 = 5k = 3probs, 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]’, ‘等’, ‘到’, ‘潮’, ‘水’, ‘干’, ‘了’, ‘,’, ‘就’, ‘知’] …
可视化模型: bertvizPandas预处理文本
多使用自定义函数
nltk库的stopwords
textblob库的拼写检查、词干抽取、词性还原等
文本数据的基本体征提取
词汇数量
字符数量
平均字长
停用词数量
特殊字符数量
数字数量
大写字母数量
文本数据的基本预处理
小写转换
去除标点符号
去除停用词
去除频现词
去除稀疏词
拼写校正
分词(tokenization)
词干提取(stemming)
词形还原(lemmatization)
Pandas 工作流
待完成
示例引入
map applymap apply
map apply都是对series操作
map只能操作 len count 基础函数
apply 能传入自定义函数 以axis=1或者0分别按一个series操作
applymap 对DataFrame的地图炮
applymap对所有元素统一操作
str + apply
pandas对象带的对字符串函数
apply自定义处理字符串函数
sort
sort_values
by 哪一列
key + lambda 对值处理后的排序
Apply the key function to the values before sorting. This is similar to the key argument in the builtin sorted() function, with the notable difference that this key function should be vectorized. It should expect a Series and return a Series with the same shape as the input. It will be applied to each column in by independently.
groupby + apply
groupby 分组,返回一个group对象 配合apply使用
transform 分组处理返回值,并保持表格不变
拼接
merge
join
how= inner left right outer
cat
Matplotlib 概述
待完成本文简单概述Matplotlib绘图库三个主要的类
Axes
Figure
Artist
通过以上三个类来了解作图的逻辑。推荐学习官网的示例
Axes首先介绍Axes,他可以理解为坐标系,他的子类是aixs坐标轴(见名知意很好理解)。一下我们通过一个示例理解
1234import matplotlib.pyplot as pltfig, axs = plt.subplots() axs.plot([1, 2, 3, 4], [1, 4, 2, 3])
以上我们引入matplotlib中的pyplot别名为plt
通过调用plt.subplots() 返回两个对象 fig( figure),axs( axes)。
AxisAxis顾名思义数轴,可以定义刻度,单位等
Figure整体画布
Artist图画元素, 线条的形状等
面向对象语法axes123plt.subplot() # 初始化一个axesplt.subplots(m, n) # m行n列axes
1234567fig , axes = plt.subplots(2,1, figsize=(6,6)) # 两行一列,axes[0].bar(sm1, sm2) # 柱状图axes[1].plot(sm1, sm2) # 折线图plt.show()
12345fig , axes = plt.subplots(2,2, figsize=(6,6))axes[0, 0]axes[0, 1] # 以坐标调用
Figureplt.figure()返回一个画布
可以设定很多参数
12345678910def figure(num=None, # autoincrement if None, else integer from 1-N figsize=None, # defaults to rc figure.figsize #多少英寸 dpi=None, # defaults to rc figure.dpi #清晰度 facecolor=None, # defaults to rc figure.facecolor #背景色 edgecolor=None, # defaults to rc figure.edgecolor # 边缘色 frameon=True, FigureClass=Figure, clear=False, **kwargs ):
全局参数123456789mpl.rcParams['font.family'] = ['Heiti SC'] # 字体mpl.rcParams['figure.dpi'] = 300 # 清晰度mpl.rcParams.get('figure.figsize') # 获得画布尺寸para = {'figure.dpi': 500, 'figure.figsize': [10, 10]} mpl.rcParams.update(para) # 通过上面的参数进行一次更新