当前位置: 首页 > news >正文

北京网站怎么建设指数

北京网站怎么建设,指数,网站开发和软件开发区别,如何做app推广运营目录 1、思路 2、基于paddle的ERINE模型进行迁移学习训练 3、分步实现 3.1 获取数据 #xff08;1#xff09;数据解压 #xff08;2#xff09;将文本转成变量#xff0c;这里为了好计算#xff0c;我只选了新闻标题做文本分类 3.2 中文分词 基于jieba的分词 基…目录 1、思路 2、基于paddle的ERINE模型进行迁移学习训练 3、分步实现 3.1 获取数据 1数据解压 2将文本转成变量这里为了好计算我只选了新闻标题做文本分类 3.2 中文分词 基于jieba的分词 基于paddlehub的lac分词 3.3 创建语料字典并将语料序列化 基于语料本身的序列化 基于word2vec或已有字典的序列化 3.4 词嵌入 基于embedding的词嵌入 基于word2vec的词嵌入 3.5 构建分类模型 基于LSTM的分类模型 实现环境AI studio 1、思路 文本分类任务步骤通常是 文本预处理 文本预处理的方法很多类似于词性分析句法分析命名实体识别等在进行文本分类之前需要将文本进行结构化常见的方法有one-hotn_gramword2vec等与英文不同可以简单用空格和符号进行分词中文是比较紧密连接的结构化之前需要对文本进行分词如jieba分词此外还需要将分词之后的语料转化为ID序列然后进行词嵌入word Embedding。 DL特征提取和分类模型 适合文本的dl model有RNNLSTMGRU等。 预测 训练完然后对数据进行预测。 2、基于paddle的ERINE模型进行迁移学习训练 教程https://aistudio.baidu.com/aistudio/projectdetail/1735533?forkThirdPart1 3、分步实现 3.1 获取数据 1数据解压 !unzip /home/aistudio/data/data8164/THUCNews.zip 解压之后结果有14个类别文件夹里边是新闻文本 2将文本转成变量这里为了好计算我只选了新闻标题做文本分类 (后续觉得数据量太小就选了全量数据来做遇到了正则表达式处理慢和分词慢的情况推荐FlashText,中英文符号处理) def read_data(file_dir): z_list []for parent, dirnames, filenames in os.walk(file_dir):if parentfile_dir:print(父目录)else:for curDir, dirs, files in os.walk(parent):print(当前文件夹,curDir)label curDir.split(/)[-1]title_list []for i in range(len(files)):fo open(parent/files[i],r,encodingutf-8)title fo.readline().strip()title_list.append((title,label))z_list.extend(title_list)return z_list file_dir /home/aistudio/THUCNews data read_data(file_dir)3.2 中文分词 基于jieba的分词 jieba_c_list [] #停用词字典 stopwords {}.fromkeys([ line.rstrip() for line in open(/home/aistudio/stopwords.txt) ]) for i in range(len(data)):s_t data[i][0].replace( ,)s_t re.sub(r\d,,s_t)s_t re.sub(r\((.*?)\), , s_t)s_t re.sub(r\, , s_t)s_t re.sub(r\,, , s_t)s_t re.sub(r\., , s_t)s_t re.sub(r\%, , s_t)s_t re.sub(r\:, , s_t)s_t re.sub(r\《, , s_t)s_t re.sub(r\》, , s_t)s_list jieba.cut(s_t,cut_allFalse)final []for seg in s_list:# seg seg.encode(gbk)# print(seg)if seg not in stopwords:# print(seg)final.append(seg)jieba_c_list.append((final,data[i][1])) 基于paddlehub的lac分词 lac paddlehub.Module(namelac) lac_list [] for i in range(len(data)):s_t data[i][0].replace( ,)s_t re.sub(r\d,,s_t)s_t re.sub(r\((.*?)\), , s_t)s_t re.sub(r\, , s_t)s_t re.sub(r\,, , s_t)s_t re.sub(r\., , s_t)s_t re.sub(r\%, , s_t)s_t re.sub(r\:, , s_t)s_t re.sub(r\《, , s_t)s_t re.sub(r\》, , s_t)results lac.lexical_analysis(texts[s_t],batch_size1)lac_ results[0][word]# print(lac_)lac_list.append((lac_,data[i][1])) 3.3 创建语料字典并将语料序列化 基于语料本身的序列化 1构建语料字典 # 构造词典统计每个词的频率并根据频率将每个词转换为一个整数id def build_dict(corpus):word_freq_dict dict()for sentence,_ in corpus:for word in sentence:if word not in word_freq_dict:word_freq_dict[word] 0word_freq_dict[word] 1word_freq_dict sorted(word_freq_dict.items(), key lambda x:x[1], reverse True)word2id_dict dict()word2id_freq dict()# 一般来说我们把oov和pad放在词典前面给他们一个比较小的id这样比较方便记忆并且易于后续扩展词表# word2id_dict[[oov]] 0# word2id_freq[0] 1e10# word2id_dict[[pad]] 1# word2id_freq[1] 1e10for word, freq in word_freq_dict:word2id_dict[word] len(word2id_dict)word2id_freq[word2id_dict[word]] freqreturn word2id_freq, word2id_dictword2id_freq, word2id_dict build_dict(jieba_c_list) vocab_size len(word2id_freq) print(there are totoally %d different words in the corpus % vocab_size) for _, (word, word_id) in zip(range(10), word2id_dict.items()):print(word %s, its id %d, its word freq %d % (word, word_id, word2id_freq[word_id])) 2ID序列化 label_dict {时政:1,星座:2,股票:3,彩票:4,科技:5,娱乐:6,房产:7,社会:8,财经:9,游戏:10,体育:11,时尚:12,家居:13,教育:14} def convert_corpus_to_id(corpus, word2id_dict):data_set []for sentence, sentence_label in corpus:# 将句子中的词逐个替换成id如果句子中的词不在词表内则替换成oov# 这里需要注意一般来说我们可能需要查看一下test-set中句子oov的比例# 如果存在过多oov的情况那就说明我们的训练数据不足或者切分存在巨大偏差需要调整sentence [word2id_dict[word] if word in word2id_dict \else word2id_dict[[oov]] for word in sentence] data_set.append((sentence, label_dict[sentence_label]))return data_settrain_corpus convert_corpus_to_id(jieba_c_list, word2id_dict) print(%d tokens in the corpus % len(train_corpus)) print(train_corpus[:5]) 基于word2vec或已有字典的序列化 from paddlehub.reader.tokenization import load_vocablabel_dict {时政:1,星座:2,股票:3,彩票:4,科技:5,娱乐:6,房产:7,社会:8,财经:9,游戏:10,体育:11,时尚:12,家居:13,教育:14}# 这是把 中文词语 转化为 词表 中对应 ID 的函数 def convert_tokens_to_ids(vocab, tokens): # 输入为词表和要转化的 textwids [] # 初始化一个空的集合用于存放输出#tokens text.split( ) # 将传入的 text 用 空格 做分割变成 词语字符串 的列表for token in tokens: # 每次从列表里取出一个 词语wid vocab.get(token, None)if not wid:wid vocab[unknown]wids.append(wid)return widsmodule paddlehub.Module(nameword2vec_skipgram) # 实例化 word2vec_skipgram 模型vocab load_vocab(module.get_vocab_path()) # 获得 词表 字典# 我们要获取词表直接利用 paddlehub.reader.tokenization 中的 load_vocab 函数即可 # load_vocab 函数的输入是具体的词表文件这里我们用 word2vec_skipgram 附带的词表 # 模块的实例化对象 module 下用 get_vocab_path() 方法 # 该方法可以在指定的 Module 中这里就是word2vec_skipgram查找 assets 文件夹下面有没有 vocab.txt 文件 # 如果找到则返回该文件的 具体文件路径 # load_vocab 函数的返回值是一个 字典里面 key 为 词语value 是词语对应的 IDtokens_ids [] for item,_ in lac_list:item_ids convert_tokens_to_ids(vocab, item) # 获得组成句子的 词语 的 ID 列表tokens_ids.append((item_ids,label_dict[_]))for i in range(5):print(token: %s; id: %s % (lac_list[i], tokens_ids[i])) 3.4 词嵌入 基于embedding的词嵌入 embedding在构建神经网络模型时使用。函数为paddle.nn.Embedding Embedding(num_embeddingsvocab_size, embedding_dimhidden_size, sparseFalse, weight_attrpaddle.ParamAttr(initializerpaddle.nn.initializer.Uniform(low-init_scale, highinit_scale))) 基于word2vec的词嵌入 Word2Vec有GBOW和skip-gram两种实现方式实现的库有gensim、paddlehub这里用gensim实现。 import gensim #将取字符串忽略类别已转成ID序列 from gensim.models.word2vec import Word2Vecnum_features 100 # Word vector dimensionality num_workers 8 # Number of threads to run in paralleltrain_texts list(map(lambda x: list(x.split()), train_texts)) model Word2Vec(train_texts, workersnum_workers, sizenum_features) model.init_sims(replaceTrue)# save model model.save(./word2vec.bin) #也可转换为txt 结果的第一行是词数量,词向量的维度就是num_features 第二行就是词向量ID和对应的词向量 3.5 构建分类模型 基于LSTM的分类模型此处的class_num改为和新闻类别一致的数量 from paddle.nn import LSTM, Embedding, Dropout, Linear import paddle.nn.functional as F# 定义一个用于情感分类的网络实例SentimentClassifier class SentimentClassifier(paddle.nn.Layer):def __init__(self, hidden_size, vocab_size, class_num14, num_steps128, num_layers1, init_scale0.1, dropoutNone):# 参数含义如下# 1.hidden_size表示embedding-sizehidden和cell向量的维度# 2.vocab_size模型可以考虑的词表大小# 3.class_num情感类型个数可以是2分类也可以是多分类# 4.num_steps表示这个情感分析模型最大可以考虑的句子长度# 5.num_layers表示网络的层数# 6.init_scale表示网络内部的参数的初始化范围# 长短时记忆网络内部用了很多TanhSigmoid等激活函数这些函数对数值精度非常敏感# 因此我们一般只使用比较小的初始化范围以保证效果super(SentimentClassifier, self).__init__()self.hidden_size hidden_sizeself.vocab_size vocab_sizeself.class_num class_numself.init_scale init_scaleself.num_layers num_layersself.num_steps num_stepsself.dropout dropout# 声明一个LSTM模型用来把每个句子抽象成向量self.simple_lstm_rnn LSTM(input_sizehidden_size, hidden_sizehidden_size, num_layersnum_layers)# 声明一个embedding层用来把句子中的每个词转换为向量self.embedding Embedding(num_embeddingsvocab_size, embedding_dimhidden_size, sparseFalse, weight_attrpaddle.ParamAttr(initializerpaddle.nn.initializer.Uniform(low-init_scale, highinit_scale)))# 在得到一个句子的向量表示后需要根据这个向量表示对这个句子进行分类# 一般来说可以把这个句子的向量表示乘以一个大小为[self.hidden_size, self.class_num]的W参数# 并加上一个大小为[self.class_num]的b参数从而达到把句子向量映射到分类结果的目的# 我们需要声明最终在使用句子向量映射到具体情感类别过程中所需要使用的参数# 这个参数的大小一般是[self.hidden_size, self.class_num]self.cls_fc Linear(in_featuresself.hidden_size, out_featuresself.class_num, weight_attrNone, bias_attrNone)self.dropout_layer Dropout(pself.dropout, modeupscale_in_train)def forward(self, input, label):# 首先我们需要定义LSTM的初始hidden和cell这里我们使用0来初始化这个序列的记忆init_hidden_data np.zeros((self.num_layers, batch_size, embedding_size), dtypefloat32)init_cell_data np.zeros((self.num_layers, batch_size, embedding_size), dtypefloat32)# 将这些初始记忆转换为飞桨可计算的向量# 设置stop_gradientTrue避免这些向量被更新从而影响训练效果init_hidden paddle.to_tensor(init_hidden_data)init_hidden.stop_gradient Trueinit_cell paddle.to_tensor(init_cell_data)init_cell.stop_gradient Trueinit_h paddle.reshape(init_hidden, shape[self.num_layers, -1, self.hidden_size])init_c paddle.reshape(init_cell, shape[self.num_layers, -1, self.hidden_size])# 将输入的句子的mini-batch转换为词向量表示x_emb self.embedding(input)x_emb paddle.reshape(x_emb, shape[-1, self.num_steps, self.hidden_size])if self.dropout is not None and self.dropout 0.0:x_emb self.dropout_layer(x_emb)# 使用LSTM网络把每个句子转换为向量表示rnn_out, (last_hidden, last_cell) self.simple_lstm_rnn(x_emb, (init_h, init_c))last_hidden paddle.reshape(last_hidden[-1], shape[-1, self.hidden_size])# 将每个句子的向量表示映射到具体的情感类别上projection self.cls_fc(last_hidden)pred F.softmax(projection, axis-1)# 根据给定的标签信息计算整个网络的损失函数这里我们可以直接使用分类任务中常使用的交叉熵来训练网络loss F.softmax_with_cross_entropy(logitsprojection, labellabel, soft_labelFalse)loss paddle.mean(loss)# 最终返回预测结果pred和网络的lossreturn pred, loss 5训练和预测 # 编写一个迭代器每次调用这个迭代器都会返回一个新的batch用于训练或者预测 def build_batch(word2id_dict, corpus, batch_size, epoch_num, max_seq_len, shuffle True, drop_last True):# 模型将会接受的两个输入# 1. 一个形状为[batch_size, max_seq_len]的张量sentence_batch代表了一个mini-batch的句子。# 2. 一个形状为[batch_size, 1]的张量sentence_label_batch每个元素都是非0即1代表了每个句子的情感类别正向或者负向sentence_batch []sentence_label_batch []for _ in range(epoch_num): #每个epoch前都shuffle一下数据有助于提高模型训练的效果#但是对于预测任务不要做数据shuffleif shuffle:random.shuffle(corpus)for sentence, sentence_label in corpus:sentence_sample sentence[:min(max_seq_len, len(sentence))]if len(sentence_sample) max_seq_len:for _ in range(max_seq_len - len(sentence_sample)):sentence_sample.append(word2id_dict[[pad]])sentence_sample [[word_id] for word_id in sentence_sample]sentence_batch.append(sentence_sample)sentence_label_batch.append([sentence_label])if len(sentence_batch) batch_size:yield np.array(sentence_batch).astype(int64), np.array(sentence_label_batch).astype(int64)sentence_batch []sentence_label_batch []if not drop_last and len(sentence_batch) 0:yield np.array(sentence_batch).astype(int64), np.array(sentence_label_batch).astype(int64)#训练预测 def train():step 0sentiment_classifier SentimentClassifier(embedding_size, vocab_size, num_stepsmax_seq_len, num_layers1)# 创建优化器Optimizer用于更新这个网络的参数 optimizer paddle.optimizer.Adam(learning_rate0.01, beta10.9, beta20.999, parameters sentiment_classifier.parameters()) sentiment_classifier.train()for sentences, labels in build_batch(word2id_dict, train_corpus, batch_size, epoch_num, max_seq_len):sentences_var paddle.to_tensor(sentences)labels_var paddle.to_tensor(labels)pred, loss sentiment_classifier(sentences_var, labels_var)# 后向传播loss.backward()# 最小化lossoptimizer.step()# 清除梯度optimizer.clear_grad()step 1if step % 100 0:print(step %d, loss %.3f % (step, loss.numpy()[0]))# 我们希望在网络训练结束以后评估一下训练好的网络的效果# 通过eval()函数将网络设置为eval模式在eval模式中网络不会进行梯度更新eval(sentiment_classifier)def eval(sentiment_classifier):sentiment_classifier.eval()# 这里我们需要记录模型预测结果的准确率# 对于二分类任务来说准确率的计算公式为# (true_positive true_negative) / # (true_positive true_negative false_positive false_negative)tp 0.tn 0.fp 0.fn 0.for sentences, labels in build_batch(word2id_dict, test_corpus, batch_size, 1, max_seq_len):sentences_var paddle.to_tensor(sentences)labels_var paddle.to_tensor(labels)# 获取模型对当前batch的输出结果pred, loss sentiment_classifier(sentences_var, labels_var)# 把输出结果转换为numpy array的数据结构# 遍历这个数据结构比较预测结果和对应label之间的关系并更新tptnfp和fnpred pred.numpy()for i in range(len(pred)):if labels[i][0] 1:if pred[i][1] pred[i][0]:tp 1else:fn 1else:if pred[i][1] pred[i][0]:fp 1else:tn 1# 输出最终评估的模型效果print(the acc in the test set is %.3f % ((tp tn) / (tp tn fp fn)))全量数据带新闻内容的预测准确率在0.682考虑优化特征向量或者更改其他模型 参考资料 https://blog.csdn.net/qq_42067550/article/details/106101183 https://paddleinference.paddlepaddle.org.cn/product_introduction/inference_intro.html https://blog.csdn.net/xiaoxiaojie521/article/details/97240436
http://www.yutouwan.com/news/454220/

相关文章:

  • 大连网站建设哪家公司好站长工具站长之家官网
  • 全国城建中心官方网站网页游戏传奇盛世开服表
  • 罗湖商城网站建设哪家好金山网站建设推广
  • 浙江省网站建设报价建立自己的摄影网站
  • 网站代码有哪些文网站建设费用计入什么科目
  • 建设银行网站证书网站建设 食品
  • 做网站需要知道什么软件计算机软件开发是干什么的
  • 电商设计素材网站有哪些重点培育学科建设网站
  • 网站建设工作人员有哪些职责网络推广加盟
  • 企业网站怎么搜索优化邯郸住宅与房地产信息网
  • 手机如何制作一个网站建设摩托车型号大全
  • 手机网站淘宝客网站前后台模板
  • 自己做网站的成本要哪些东西梅州网站建设求职简历
  • 个人博客网站域名注册网络推广网站公司推荐
  • 网站建设推广关键词百度搜不到公司网站
  • acfun网站设计改进在线ps网站
  • 广西建设厅网站地址wordpress取消主题
  • 建站容易吗找个做游戏的视频网站
  • 规划和布局营销型网站的四大重点企业型网站建设
  • 免费个人网站怎么建立替代wordpress
  • 一流高职院校建设网站软件工程师工资高吗
  • 上杭网站制作新型网络营销方式
  • 广州网站制作联系方式杨凌企业网站建设
  • 用rp怎么做网站原型哈尔滨网站建设价格
  • 建设一个企业网站荥阳网
  • wordpress迁站到阿里云h5做招聘网站可以吗
  • 阜阳网站建设专业机构自适应网站做推广
  • 视频作品投票网站如何做考研比较厉害的培训机构
  • 建设网站 目标现在互联网创业可以做哪些项目
  • 绿色网站模版废旧物品手工制作图片