【Pytorch基础教程36】基于Ernie预训练模型和Bert的新闻分类

文章目录

  • 一、新闻分类任务
    • 1.1 中文数据集
    • 1.2 数据特点
    • 1.3 跑起代码
  • 二、 预训练语言模型ERNIE
    • 2.1 ERNIE模型结构
    • 2.2 bert模型结构
  • 三、项目代码
    • 1. bert模型
    • 2. ERNIE预训练模型
  • Reference

一、新闻分类任务

1.1 中文数据集

从THUCNews中抽取了20万条新闻标题,已上传至github,文本长度在20到30之间。一共10个类别,每类2万条。数据以字为单位输入模型。

类别:财经、房产、股票、教育、科技、社会、时政、体育、游戏、娱乐。

数据集划分:

数据集数据量
训练集18万
验证集1万
测试集1万

注意:更换自己的数据集:按照我数据集的格式来格式化你的中文数据集。

1.2 数据特点

训练集有18w条,测试集和验证集均为1w条,每条样本都是20-30个中文汉字。词表直接使用huggingface上的中文词表即可。划分训练测试验证集用如下函数,返回train列表有18w条样本数据,每条样本数据为一个tuple元组,比如train[0]元组大小为4。

def build_dataset(config):def load_dataset(path, pad_size=32):contents = []with open(path, 'r', encoding='UTF-8') as f:for line in tqdm(f):lin = line.strip()if not lin:continuecontent, label = lin.split('\t')token = config.tokenizer.tokenize(content)token = [CLS] + tokenseq_len = len(token)mask = []token_ids = config.tokenizer.convert_tokens_to_ids(token)if pad_size:if len(token) < pad_size:mask = [1] * len(token_ids) + [0] * (pad_size - len(token))token_ids += ([0] * (pad_size - len(token)))else:mask = [1] * pad_sizetoken_ids = token_ids[:pad_size]seq_len = pad_sizecontents.append((token_ids, int(label), seq_len, mask))return contentstrain = load_dataset(config.train_path, config.pad_size)dev = load_dataset(config.dev_path, config.pad_size)test = load_dataset(config.test_path, config.pad_size)return train, dev, test

为了模型后面的训练,先要做文本数据预处理:

  • 获取数据后去除非文本部分
  • 分词(英文文本则不需要分词)
  • 去除停用词
  • 对英文单词进行词干提取(stemming)和词型还原(lemmatization),我们这里是中文,不需要做这个
  • 构建词表
  • 根据词表将文本转为数字

1.3 跑起代码

bert模型放在 bert_pretain目录下,ERNIE模型放在ERNIE_pretrain目录下,每个目录下都是三个文件:

  • pytorch_model.bin
  • bert_config.json
  • vocab.txt

下载地址:

  • 预训练模型下载地址:
    • bert_Chinese: 模型 https://s3.amazonaws.com/models.huggingface.co/bert/bert-base-chinese.tar.gz
    • 词表 https://s3.amazonaws.com/models.huggingface.co/bert/bert-base-chinese-vocab.txt
      来自这里
      备用:模型的网盘地址:https://pan.baidu.com/s/1qSAD5gwClq7xlgzl_4W3Pw
  • ERNIE_Chinese: http://image.nghuyong.top/ERNIE.zip
    来自这里
    备用:网盘地址:https://pan.baidu.com/s/1lEPdDN1-YQJmKEd_g9rLgw

解压后,按照上面说的放在对应目录下,文件名称确认无误即可。

【使用说明】下载好预训练模型就可以跑了。

# 训练并测试:
# bert
python run.py --model bert# bert + 其它
python run.py --model bert_CNN# ERNIE
python run.py --model ERNIE

参数:模型都在models目录下,超参定义和模型定义在同一文件中。

二、 预训练语言模型ERNIE

2.1 ERNIE模型结构

大模型的痛点:

  • 仅考虑单一粒度语义建模,缺乏多粒度知识引入,语义理解能力受限;
  • 受限于 Transformer 结构的建模长度瓶颈,无法处理超长文本;
  • 聚焦语言等单一模态,缺乏工业真实应用场景针对多个模态如语言、视觉、听觉信息的联合建模能力。

Ernie 2.0是百度在Ernie 1.0基础之上的第二代预训练结构。
模型结构与Ernie 1.0还有 Bert保持一致,12层的transformer的encoder层。
具体可以参考:一文读懂最强中文NLP预训练模型ERNIE

ERNIE:Enhanced Representation through Knowledge Integration
文心 ERNIE 开源版地址:https://github.com/PaddlePaddle/ERNIE
文心 ERNIE 官网地址:https://wenxin.baidu.com/
论文地址:https://arxiv.org/pdf/1904.09223v1.pdf
在这里插入图片描述

  • 受Bert mask策略的启发,提出一种新的语言表示模型,称为ERNIE(Enhanced Representation through Knowledge Integration).ERNIE旨在学习到通过知识屏蔽策略增强的语言表示,其中屏蔽策略包括实体级屏蔽(Entity-level strategy)和短语级屏蔽(Phrase-level strategy)。
    • entity-level 策略通常会掩盖由多个单词组成的实体;
    • Phrase-level 策略会掩盖由几个词共同作为概念单元的整体短语。
    • 实验结果表明,ERNIE优于其他基准方法,在包括自然语言推理、语义相似性、命名实体识别、情感分析、问答系统在内的五个自然语言处理任务上取得了好结果 。作者还证明了ERNIE在完形填空测试中具有更强大的知识推理能力。
  • 在绝大多数的研究中,仅仅通过上下文来预测丢失的单词并对其进行建模。 这些模型没有考虑句子中的先验知识。 例如,在句子“哈利·波特是由罗琳(J. K. Rowling)创作的一系列幻想小说”中。 哈利·波特(Harry Potter)是小说的名字,而罗琳(J. K. Rowling)是作家。
  • 模型很容易通过实体内部的单词搭配来预测实体Harry Potter的缺失单词,而无需借助较长的上下文。如果模型学习更多有关先验知识的信息,则该模型可以获得更可靠的语言表示。ERNIE不是直接添加知识嵌入(knowledge embedding),而是隐式地学习有关知识和较长语义依赖性的信息,例如实体之间的关系,实体的属性和事件的类型,以指导单词嵌入学习。

2.2 bert模型结构

  • 常用的BERT模型其实就是transformer模型的编码器部分,用户为下游任务生成一段话的文本表示。BERT是一个无监督学习的过程,可通过MLM和NSP两种预训练任务实现无监督训练的过程。
  • MLM预训练任务:首先随机遮盖或替换一句话中的某个单词,然后让下游模型通过上下文预测被遮盖或替换的单词,最后构建只针对预测部分的损失函数用以训练BERT模型。
    • 为防止过拟合并提高模型对文本本身的理解能力,MLM在遮盖或替换单词时,采用混合方式:大部分(80%)单词被遮盖为[mask],小部分(10%)单词被随机替换为其他单词,另外小部分(10%)单词保持不变。
    • ex:比如对于文本”我喜欢打篮球“,在10%概率下MLM会改为如:”我喜欢打咖啡“
  • NSP预训练任务:MLM倾向于抽取单词层次的表征,当任务需要句子层级的表征时,则需要NSP任务预训练的模型。NSP目标是预测两个句子之间是否相连:NSP以50%的相连概率从语料库中抽取N对句子,加入[cls]预测标记和[sep]分句标记后输入BERT模型,使用[cls]预测标记收集到的全局表征进行二分类预测,并使用分类损失优化BERT模型。
    • ex:比如句子”我喜欢打篮球,尤其是3v3篮球“,NSP任务将其转为:[cls]我喜欢打篮球[sep]尤其是3v3篮球[sep]
  • MLM和NSP两种预训练任务可以同时进行,都从无标签文本数据中进行构建(即都是自监督学习self-supervision训练),降低数据成本。transformer可并行训练,故BERT可在超大规模语料库上进行训练, 为下游任务提高高质量、可迁移的预训练文本表征支持。
    • ex:如还是刚才的句子”我喜欢打篮球,尤其是3v3篮球“,MLM和NSP任务同时进就是[cls]我喜欢打[mask][sep]尤其是3v3篮球[sep]

在这里插入图片描述

三、项目代码

1. bert模型

class Model(nn.Module):def __init__(self, config):super(Model, self).__init__()self.bert = BertModel.from_pretrained(config.bert_path)for param in self.bert.parameters():param.requires_grad = Trueself.fc = nn.Linear(config.hidden_size, config.num_classes)def forward(self, x):context = x[0]  # 输入的句子mask = x[2]  # 对padding部分进行mask,和句子一个size,padding部分用0表示,如:[1, 1, 1, 1, 0, 0]_, pooled = self.bert(context, attention_mask=mask, output_all_encoded_layers=False)out = self.fc(pooled)return out

进入上面forward函数的x列表有3个元素,x[0]是输入的句子,x[2]是mask_tensor,即如果当前句子位置存在元素则为1,否则为0(这0为padding元素)。比如第一个句子有19个中文汉字,first_lst = x[2][0].cpu().numpy(),通过sum([x for x in first_lst])统计到确实是有19个1,剩下全为0。

通过torchinfo.summarymodel对象结构如下:

================================================================================
Layer (type:depth-idx)                                  Param #
================================================================================
Model                                                   --
├─BertModel: 1-1                                        --
│    └─BertEmbeddings: 2-1                              --
│    │    └─Embedding: 3-1                              16,226,304
│    │    └─Embedding: 3-2                              393,216
│    │    └─Embedding: 3-3                              1,536
│    │    └─BertLayerNorm: 3-4                          1,536
│    │    └─Dropout: 3-5                                --
│    └─BertEncoder: 2-2                                 --
│    │    └─ModuleList: 3-6                             85,054,464
│    └─BertPooler: 2-3                                  --
│    │    └─Linear: 3-7                                 590,592
│    │    └─Tanh: 3-8                                   --
├─Linear: 1-2                                           7,690
================================================================================
Total params: 102,275,338
Trainable params: 102,275,338
Non-trainable params: 0
================================================================================

2. ERNIE预训练模型

class Model(nn.Module):def __init__(self, config):super(Model, self).__init__()self.bert = BertModel.from_pretrained(config.bert_path)for param in self.bert.parameters():param.requires_grad = Trueself.fc = nn.Linear(config.hidden_size, config.num_classes)def forward(self, x):context = x[0]  # 输入的句子mask = x[2]  # 对padding部分进行mask,和句子一个size,padding部分用0表示,如:[1, 1, 1, 1, 0, 0]_, pooled = self.bert(context, attention_mask=mask, output_all_encoded_layers=False)out = self.fc(pooled)return out

对应的模型结构:

Model((bert): BertModel((embeddings): BertEmbeddings((word_embeddings): Embedding(18000, 768, padding_idx=0)(position_embeddings): Embedding(513, 768)(token_type_embeddings): Embedding(2, 768)(LayerNorm): BertLayerNorm()(dropout): Dropout(p=0.1, inplace=False))(encoder): BertEncoder((layer): ModuleList((0): BertLayer((attention): BertAttention((self): BertSelfAttention((query): Linear(in_features=768, out_features=768, bias=True)(key): Linear(in_features=768, out_features=768, bias=True)(value): Linear(in_features=768, out_features=768, bias=True)(dropout): Dropout(p=0.1, inplace=False))(output): BertSelfOutput((dense): Linear(in_features=768, out_features=768, bias=True)(LayerNorm): BertLayerNorm()(dropout): Dropout(p=0.1, inplace=False)))(intermediate): BertIntermediate((dense): Linear(in_features=768, out_features=3072, bias=True))(output): BertOutput((dense): Linear(in_features=3072, out_features=768, bias=True)(LayerNorm): BertLayerNorm()(dropout): Dropout(p=0.1, inplace=False)))(1): BertLayer((attention): BertAttention((self): BertSelfAttention((query): Linear(in_features=768, out_features=768, bias=True)(key): Linear(in_features=768, out_features=768, bias=True)(value): Linear(in_features=768, out_features=768, bias=True)(dropout): Dropout(p=0.1, inplace=False))(output): BertSelfOutput((dense): Linear(in_features=768, out_features=768, bias=True)(LayerNorm): BertLayerNorm()(dropout): Dropout(p=0.1, inplace=False)))(intermediate): BertIntermediate((dense): Linear(in_features=768, out_features=3072, bias=True))(output): BertOutput((dense): Linear(in_features=3072, out_features=768, bias=True)(LayerNorm): BertLayerNorm()(dropout): Dropout(p=0.1, inplace=False)))(2): BertLayer((attention): BertAttention((self): BertSelfAttention((query): Linear(in_features=768, out_features=768, bias=True)(key): Linear(in_features=768, out_features=768, bias=True)(value): Linear(in_features=768, out_features=768, bias=True)(dropout): Dropout(p=0.1, inplace=False))(output): BertSelfOutput((dense): Linear(in_features=768, out_features=768, bias=True)(LayerNorm): BertLayerNorm()(dropout): Dropout(p=0.1, inplace=False)))(intermediate): BertIntermediate((dense): Linear(in_features=768, out_features=3072, bias=True))(output): BertOutput((dense): Linear(in_features=3072, out_features=768, bias=True)(LayerNorm): BertLayerNorm()(dropout): Dropout(p=0.1, inplace=False)))(3): BertLayer((attention): BertAttention((self): BertSelfAttention((query): Linear(in_features=768, out_features=768, bias=True)(key): Linear(in_features=768, out_features=768, bias=True)(value): Linear(in_features=768, out_features=768, bias=True)(dropout): Dropout(p=0.1, inplace=False))(output): BertSelfOutput((dense): Linear(in_features=768, out_features=768, bias=True)(LayerNorm): BertLayerNorm()(dropout): Dropout(p=0.1, inplace=False)))(intermediate): BertIntermediate((dense): Linear(in_features=768, out_features=3072, bias=True))(output): BertOutput((dense): Linear(in_features=3072, out_features=768, bias=True)(LayerNorm): BertLayerNorm()(dropout): Dropout(p=0.1, inplace=False)))(4): BertLayer((attention): BertAttention((self): BertSelfAttention((query): Linear(in_features=768, out_features=768, bias=True)(key): Linear(in_features=768, out_features=768, bias=True)(value): Linear(in_features=768, out_features=768, bias=True)(dropout): Dropout(p=0.1, inplace=False))(output): BertSelfOutput((dense): Linear(in_features=768, out_features=768, bias=True)(LayerNorm): BertLayerNorm()(dropout): Dropout(p=0.1, inplace=False)))(intermediate): BertIntermediate((dense): Linear(in_features=768, out_features=3072, bias=True))(output): BertOutput((dense): Linear(in_features=3072, out_features=768, bias=True)(LayerNorm): BertLayerNorm()(dropout): Dropout(p=0.1, inplace=False)))(5): BertLayer((attention): BertAttention((self): BertSelfAttention((query): Linear(in_features=768, out_features=768, bias=True)(key): Linear(in_features=768, out_features=768, bias=True)(value): Linear(in_features=768, out_features=768, bias=True)(dropout): Dropout(p=0.1, inplace=False))(output): BertSelfOutput((dense): Linear(in_features=768, out_features=768, bias=True)(LayerNorm): BertLayerNorm()(dropout): Dropout(p=0.1, inplace=False)))(intermediate): BertIntermediate((dense): Linear(in_features=768, out_features=3072, bias=True))(output): BertOutput((dense): Linear(in_features=3072, out_features=768, bias=True)(LayerNorm): BertLayerNorm()(dropout): Dropout(p=0.1, inplace=False)))(6): BertLayer((attention): BertAttention((self): BertSelfAttention((query): Linear(in_features=768, out_features=768, bias=True)(key): Linear(in_features=768, out_features=768, bias=True)(value): Linear(in_features=768, out_features=768, bias=True)(dropout): Dropout(p=0.1, inplace=False))(output): BertSelfOutput((dense): Linear(in_features=768, out_features=768, bias=True)(LayerNorm): BertLayerNorm()(dropout): Dropout(p=0.1, inplace=False)))(intermediate): BertIntermediate((dense): Linear(in_features=768, out_features=3072, bias=True))(output): BertOutput((dense): Linear(in_features=3072, out_features=768, bias=True)(LayerNorm): BertLayerNorm()(dropout): Dropout(p=0.1, inplace=False)))(7): BertLayer((attention): BertAttention((self): BertSelfAttention((query): Linear(in_features=768, out_features=768, bias=True)(key): Linear(in_features=768, out_features=768, bias=True)(value): Linear(in_features=768, out_features=768, bias=True)(dropout): Dropout(p=0.1, inplace=False))(output): BertSelfOutput((dense): Linear(in_features=768, out_features=768, bias=True)(LayerNorm): BertLayerNorm()(dropout): Dropout(p=0.1, inplace=False)))(intermediate): BertIntermediate((dense): Linear(in_features=768, out_features=3072, bias=True))(output): BertOutput((dense): Linear(in_features=3072, out_features=768, bias=True)(LayerNorm): BertLayerNorm()(dropout): Dropout(p=0.1, inplace=False)))(8): BertLayer((attention): BertAttention((self): BertSelfAttention((query): Linear(in_features=768, out_features=768, bias=True)(key): Linear(in_features=768, out_features=768, bias=True)(value): Linear(in_features=768, out_features=768, bias=True)(dropout): Dropout(p=0.1, inplace=False))(output): BertSelfOutput((dense): Linear(in_features=768, out_features=768, bias=True)(LayerNorm): BertLayerNorm()(dropout): Dropout(p=0.1, inplace=False)))(intermediate): BertIntermediate((dense): Linear(in_features=768, out_features=3072, bias=True))(output): BertOutput((dense): Linear(in_features=3072, out_features=768, bias=True)(LayerNorm): BertLayerNorm()(dropout): Dropout(p=0.1, inplace=False)))(9): BertLayer((attention): BertAttention((self): BertSelfAttention((query): Linear(in_features=768, out_features=768, bias=True)(key): Linear(in_features=768, out_features=768, bias=True)(value): Linear(in_features=768, out_features=768, bias=True)(dropout): Dropout(p=0.1, inplace=False))(output): BertSelfOutput((dense): Linear(in_features=768, out_features=768, bias=True)(LayerNorm): BertLayerNorm()(dropout): Dropout(p=0.1, inplace=False)))(intermediate): BertIntermediate((dense): Linear(in_features=768, out_features=3072, bias=True))(output): BertOutput((dense): Linear(in_features=3072, out_features=768, bias=True)(LayerNorm): BertLayerNorm()(dropout): Dropout(p=0.1, inplace=False)))(10): BertLayer((attention): BertAttention((self): BertSelfAttention((query): Linear(in_features=768, out_features=768, bias=True)(key): Linear(in_features=768, out_features=768, bias=True)(value): Linear(in_features=768, out_features=768, bias=True)(dropout): Dropout(p=0.1, inplace=False))(output): BertSelfOutput((dense): Linear(in_features=768, out_features=768, bias=True)(LayerNorm): BertLayerNorm()(dropout): Dropout(p=0.1, inplace=False)))(intermediate): BertIntermediate((dense): Linear(in_features=768, out_features=3072, bias=True))(output): BertOutput((dense): Linear(in_features=3072, out_features=768, bias=True)(LayerNorm): BertLayerNorm()(dropout): Dropout(p=0.1, inplace=False)))(11): BertLayer((attention): BertAttention((self): BertSelfAttention((query): Linear(in_features=768, out_features=768, bias=True)(key): Linear(in_features=768, out_features=768, bias=True)(value): Linear(in_features=768, out_features=768, bias=True)(dropout): Dropout(p=0.1, inplace=False))(output): BertSelfOutput((dense): Linear(in_features=768, out_features=768, bias=True)(LayerNorm): BertLayerNorm()(dropout): Dropout(p=0.1, inplace=False)))(intermediate): BertIntermediate((dense): Linear(in_features=768, out_features=3072, bias=True))(output): BertOutput((dense): Linear(in_features=3072, out_features=768, bias=True)(LayerNorm): BertLayerNorm()(dropout): Dropout(p=0.1, inplace=False)))))(pooler): BertPooler((dense): Linear(in_features=768, out_features=768, bias=True)(activation): Tanh()))(fc): Linear(in_features=768, out_features=10, bias=True)
)

跑Ernie的文本分类效果是比Bert效果好的:

No optimization for a long time, auto-stopping...
Test Loss:  0.24,  Test Acc: 92.54%
Precision, Recall and F1-Score...precision    recall  f1-score   supportfinance     0.9465    0.8840    0.9142      1000realty     0.9171    0.9510    0.9337      1000stocks     0.8738    0.8520    0.8628      1000education     0.9658    0.9590    0.9624      1000science     0.8395    0.9100    0.8733      1000society     0.9348    0.9170    0.9258      1000politics     0.9232    0.9010    0.9119      1000sports     0.9649    0.9890    0.9768      1000game     0.9630    0.9360    0.9493      1000
entertainment     0.9335    0.9550    0.9441      1000accuracy                         0.9254     10000macro avg     0.9262    0.9254    0.9254     10000weighted avg     0.9262    0.9254    0.9254     10000Confusion Matrix...
[[884  13  68   3  10   7  10   4   0   1][  9 951   3   0   8   5   5   4   2  13][ 31  43 852   1  37   1  25   6   2   2][  1   2   1 959  10  16   3   0   0   8][  3   1  20   4 910  14   8   1  29  10][  2  16   0  10  14 917  22   2   1  16][  2   4  29  10  36  11 901   1   0   6][  0   2   0   1   2   1   1 989   0   4][  1   1   2   1  42   5   1   3 936   8][  1   4   0   4  15   4   0  15   2 955]]
Time usage: 0:00:09

项目完整代码链接稍等放上。

Reference

[1] 百度搜索首届技术创新挑战赛:赛道一
[2] 超详细中文预训练模型ERNIE使用指南
[3] BERT与知识图谱的结合——ERNIE模型浅析
[4] 赛题baseline:使用RocketQA进行篇章检索判定是否存在答案 + 使用 ERNIE 3.0进行阅读理解答案抽取
搜索问答赛道,包含答案抽取和答案检验两大任务。
Coggle阿水:https://aistudio.baidu.com/aistudio/projectdetail/5013840
致Great:https://aistudio.baidu.com/aistudio/projectdetail/5043272
洪荒流1st:https://aistudio.baidu.com/aistudio/projectdetail/4960090
[5] BERT: Pre-training of Deep Bidirectional Transformers for Language Understanding
[6] ERNIE: Enhanced Representation through Knowledge Integration
[6] 百度文心大模型ERNIE:https://github.com/PaddlePaddle/ERNIE
[7] https://github.com/649453932/Bert-Chinese-Text-Classification-Pytorch
[8] 一文读懂最强中文NLP预训练模型ERNIE.飞桨
[9] 超详细的 Bert 文本分类源码解读 | 附源码
[10] pytorch的bert预训练模型名称及下载路径
[11] 记一次工业界文本分类任务的尝试(文本分类+序列标注+文本抽取)
[12] NLP学习之使用pytorch搭建textCNN模型进行中文文本分类
[13] Pytorch实现中文文本分类任务(Bert,ERNIE,TextCNN,TextRNN,FastText,TextRCNN,BiLSTM_Attention, DPCNN, Transformer)
[14] 领域自适应之继续预训练demo.预训练模型加载
[15] 百度飞桨项目:基于BERT的中文分词
[16] https://github.com/huggingface/transformers/tree/main/src/transformers/models/bert
[17] NLP&深度学习:PyTorch文本分类
[18] 自然语言处理 — Bert开发实战 (Transformers)
[19] BERT模型实战之多文本分类(附源码)
[20] 使用chatGPT看论文:https://www.humata.ai/
[21] 四大模型」革新NLP技术应用,百度文心ERNIE最新开源预训练模型
[22] 论文解读 | 百度 ERNIE: Enhanced Representation through Knowledge Integration
[23] 预训练模型之Ernie2.0. 某乎
[24] 预训练模型(四)—Ernie
[25] https://wenxin.baidu.com/

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/72747.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

马斯克入驻推特造成大恐慌!这俩戏精还冒充被裁员工,外媒全被耍了

【导读】马斯克进驻推特后&#xff0c;又是审查代码&#xff0c;又是疑似将灭霸式裁员&#xff0c;人心惶惶之际&#xff0c;这两位戏精也出动了。 最近&#xff0c;马院士进驻推特的事儿可是闹得人仰马翻&#xff0c;鸡犬不宁。 上周四&#xff0c;马斯克抱着水槽走进大楼&a…

为什么程序员很难找到合适的另一半?

虽然现在社会很多人说程序员收入高&#xff0c;是体制外是最好的男友&#xff0c;可是程序员不是总被说成情商低、不懂浪漫吗&#xff1f; 找到合适的另一半&#xff0c;这个难度超过西天取经。指不定你要和九九八十一个妹子错过去&#xff0c;当然对于女生也没那么容易&#x…

佳缘男的计算机软件出差,交友我在世纪佳缘认识了一个男人,今年32岁,通信接近一个月,觉得 爱问知识人...

2006-06-29 16:46:27 见一面也好&#xff0c;见了你就断了对他的念头。也就不用这么高分问我们这个无聊的问题了。 哈哈 全部 2006-06-29 16:46:27 2006-06-29 16:04:28 外表是一方面的内容。但是要有深层次的了解才知道你们是否会适合在一起。 全部 2006-06-29 16:04:28 2006-…

有一种男人叫“程序员”,遇到就嫁了吧!

都说程序改变世界&#xff0c;那程序又是出自谁手呢&#xff0c;自然是程序员了。 全民编程时代&#xff0c;家里没有个会写程序的人&#xff0c;可怎么办啊&#xff1f;所以&#xff0c;今天就给妹纸们推荐一款性价比极高的老公候选人—程序员。 首先&#xff0c;程序员收入高…

当你爱上一个程序员……

点击上方“程序员大咖”&#xff0c;选择“置顶公众号” 关键时刻&#xff0c;第一时间送达&#xff01; 1.当你爱上一个程序员…… 2.程序员家的孩子 3.调试使我开心 4.程序员的类型 5.Java & C 语言程序员 6.程序员自学完一个新框架后 来源&#xff1a;菜鸟教程程序员大咖…

雅思练习和考试平台市场现状研究分析报告 -

辰宇信息咨询市场调研公司最近发布-《2022-2028中国雅思练习和考试平台市场现状研究分析与发展前景预测报告 》 内容摘要 本文研究中国市场雅思练习和考试平台现状及未来发展趋势,侧重分析在中国市场扮演重要角色的企业,重点呈现这些企业在中国市场的雅思练习和考试平台收…

雅思阅读错题分析

目录 C-15TEST4Passage1 (9/13)Passage2(11/13)Passage3&#xff08;8/14&#xff09; TEST3Passage1(10/13)Passage2(11/13)Passage3(8/13) TEST2Passage1(9/13)Passage2(4/13)Passage3(10/14) Test1Passage1(11/13)Passage2(11/13&#xff09; C-15 TEST4 Passage1 (9/13) …

雅思考试和PET考试哪个更容易通过?

雅思PTE的“自我介绍”&#xff1a; 雅思&#xff1a;全称为国际英语测试系统&#xff08;International English Language Testing System&#xff09;简称雅思&#xff08;IELTS&#xff09;&#xff0c;是著名的国际性英语标准化水平测试之一。雅思考试于1989年设立&#xf…

大连雅思培训百家国际雅思考试词汇量要求与记忆方法是什么

雅思考试词汇量要求与记忆方法是什么 一、雅思考试词汇量要求 雅思考试词汇量要求与记忆方法是什么 1.雅思5.5分所需的词汇量 雅思5.5分水平估计词汇量至少要到3000&#xff0c;口语听力词汇要有800&#xff0c;写作词汇要有500&#xff0c;阅读词汇要有1000&#xff0c;一…

雅思阅读真经总纲_大神名师炸翻现场,2019学为贵全国教育展引爆雅思圈!

9月28日&#xff0c;学为贵全国教育展圆满落幕。此次活动以“万变不离真经”为主题&#xff0c;学为贵联合“当当”、“爱奇艺知识”&#xff0c;跨越北京、长沙、广州、成都、重庆、哈尔滨、南京、西安等全国12个城市&#xff0c;多位大神名师亲临现场&#xff0c;深度分析雅思…

雅思考试自己的复习进度以及方法使用【日更版】

雅思第几套听力阅读 写作口语IELTS 5 听力&#xff1a; 1.何琼网课(腾讯课堂) 2.雅思王听力真题语料库&#xff1a;只刷第三章名词(每天半小时到一小时听写&#xff0c;半小时到一小时改错)&#xff0c;电话号码&#xff0c;姓名地址拼写 3.剑桥雅思真题&#xff1a; ①从后…

【雅思阅读】王希伟阅读P3(Heading)

List of Heading 段意题 特点 1. 出题位置特殊&#xff1a;文章前出现 2. 主旨题 3. 难度大&#xff08;时间&#xff0c;出错连续&#xff09; 4.无复选 解题根本思路&#xff1a; 找段落主旨与选项搭配 80%段落有主旨句 做题步骤 一 审选项 1、 读例子并去掉例子已经…

FashionAI服装属性标签图像识别Top1-5方案分享

向AI转型的程序员都关注了这个号&#x1f447;&#x1f447;&#x1f447; 机器学习AI算法工程 公众号&#xff1a; datayx 服饰属性标签是构成服饰知识体系的重要根基&#xff0c;内部庞大复杂。我们对服饰属性进行了专业的整理和抽象&#xff0c;构建了一个符合认知过程&…

这波服装设计作品对女性美的诠释,十分到位

女性是温柔的、美丽的&#xff0c;多样的&#xff0c;莱佛士学生Xu Xinyi作品《Femininity&Softness》便是围绕女性展开创作。而Xinyi的作品想要传达的是&#xff1a;女性不应该被物化&#xff0c;她们是美丽且具有多样性的。 莱佛士服装设计专业学生作品 在设计中&#xf…

绘图软件Tecplot如何保存调用自己的绘图风格style

1、保存 点击上方菜单栏“Frame”&#xff1b; 点击“Save frame style” &#xff0c;选择位置保存即可。 2、调用 点击上方菜单栏“Frame”&#xff1b; 点击“Load frame style” &#xff0c;选择style位置调用即可。

Marvelous Designer 服装设计与模拟

制作真实的角色衣服是CG动画中一项很具有挑战性的工作&#xff0c;是角色开发过程中非常重要的一步。它可以体现角色在故事中的性格&#xff0c;在技术发达的今天&#xff0c;制作一件虚拟衣服很容易。我们可以使用正确的工具发挥想象力在很短的时间内就能创作出真实的衣服。说…

【2023,学点儿新Java-16】编程语言的学习方法总结 | 编程的本质和架构 | 如何深度理解编程知识和技能 | 如何成为优秀的软件开发工程师 | 附:Java初学者的困惑!

前情回顾&#xff1a; 【2023&#xff0c;学点儿新Java-15】案例分享&#xff1a;基于Java实现餐厅点餐系统&#xff08;附完整源代码&#xff09;【2023&#xff0c;学点儿新Java-14】携程面试题&#xff1a;如何看待Java是一门半编译半解释型的语言&#xff1f;| 咨询互联网…

函数计算导论 - AI 时代助燃剂

开始之前 开始之前请先鉴赏各家公有云的函数计算&#xff08;自行鉴赏&#xff0c;笔者不发表任何评论&#xff09; 阿里云&#xff1a; 腾讯云&#xff1a; Laf: 函数计算价值 每个企业都应该标配一个函数计算平台&#xff0c;不管是直接使用公有云还是涉及敏感数据需要私有…

2023年,对人工智能的思考与展望

近些年来&#xff0c;人工智能的话题一次次的冲上热榜&#xff0c;而在前段时间内&#xff0c;chatgpt以及midjourney又一次冲上了热搜&#xff0c;在海内外引起广泛的讨论&#xff0c;我个人在研究了近一个多月的技术文档和文献资料后&#xff0c;也对人工智能的未来有了很多的…

已知公钥pubkey,进行RSA公钥加密

RSA加密解密的例子非常多&#xff0c;但是已知pubkey&#xff0c;然后进行RSA公钥加密的很少&#xff0c;原理都差不多&#xff0c; 下面就是个简单的例子&#xff1a; 首先拿到pubkey,拿到是字符串的形式&#xff0c;需要转一下&#xff0c;然后进行加密&#xff0c;返回的是…