R语言用Keras长短期记忆LSTM神经网络分类分析问答文本数据

原文链接:http://tecdat.cn/?p=26709 

原文出处:拓端数据部落公众号

介绍

本文是在 R 中使用 Keras 的LSTM神经网络分类简单介绍。

软件包

  1.  
    library(tidyverse) #导入、清理、可视化
  2.  
    library(keras) # 用keras进行深度学习
  3.  
    library(data.table) # 快速读取csv数据

导入

让我们看一下数据

  1.  
     
  2.  
    tst %>% head()

初步查看

让我们考虑几个 用户可能提出的“不真诚”问题的例子

trn %>% filter(tart == 1) %>% sme_n(5)

我可以理解为什么这些问题被认为是“不真诚的”:它们不是在寻求真正的答案,而是倾向于将提问者的信念陈述为事实,或者试图故意挑衅。想知道我们的模型会怎么样?

标记化

让我们从标记句子开始。

  1.  
    # 设置一些参数
  2.  
     
  3.  
    mx_s <- 15000 # 考虑作为特征的最大词数
  4.  
    mxen <- 64 # 在n个词之后的文本截断
  5.  
     
  6.  
     
  7.  
    # 准备对文本进行标记
  8.  
     
  9.  
    ful <- rbind(tin %>% select(qon_t), test %>% select(quin_ext))
  10.  
    tts <- full$qesio_tx
  11.  
     
  12.  
    toer <- text_tokenizer(nu_ors = m_wods) %>% >。
  13.  
    fi_txt_ner(txt
  14.  
     
  15.  
    # 符号化 - 即把文本转换成整数序列
  16.  
     
  17.  
    seqnces <- tts_tseecs(toenze, txts)
  18.  
    rd_idex <- toker$wordiex
  19.  
     
  20.  
    # 垫出文本,使所有内容都是相同的长度
  21.  
     
  22.  
    daa = pad_sques(quecs, maxlen = aln)

数据拆分

  1.  
    # 分割回训练和测试
  2.  
     
  3.  
    tri_mrx = data[1:nrow(tan),] # 分割回训练和测试。
  4.  
    ttmix = da[(nrow(ran)+1):nrow(at),] # 准备训练标签。
  5.  
     
  6.  
     
  7.  
    # 准备好训练标签
  8.  
     
  9.  
    laes = trin$trgt
  10.  
     
  11.  
     
  12.  
    # 准备一个验证集
  13.  
     
  14.  
    set.seed(1337)
  15.  
     
  16.  
    traingsales = nrow(trinix)*0.90
  17.  
     
  18.  
    inie = sample(1:nrow(tra_trix))
  19.  
    trining_idies = indices[1:training_samples] 。
  20.  
    valdaton_inces = indices[(ranng_sples + 1): (trningmes + vliiopls)] 。
  21.  
     
  22.  
    xtrin = tainmax[trinig_dces,] 。
  23.  
    y_an = labels[ainginies]
  24.  
     
  25.  
    x_vl = traimarix[valito_inces,] y_val = labels[traginces]。
  26.  
    y_al = labels[vlitnidies]。
  27.  
     
  28.  
    # 训练维度
  29.  
     
  30.  
    dim(x_ran)
  31.  
    table(y_tan)

这里非常严重的不平衡,我们需要稍后解决这个问题。

嵌入

我们的第一个模型将基于一个提供的词嵌入。我们从较小的嵌入文件开始。

  1.  
    lis <- readLines('1M.vec')
  2.  
     
  3.  
    fsti_emedisndx = nw.ev(hash = TRUE, parent = eptev())
  4.  
     
  5.  
    ies <- lns[2:legt(lie)]
  6.  
     
  7.  
    b <- tPrgssBr(min = 0, max = lenth(lns), style = 3)
  8.  
    for (i in 1:length(les)){
  9.  
     
  10.  
    vaus <- strsplit(le, " ")[[1]]
  11.  
    wd<- vaus[[1]]
  12.  
    fsiemgndx[[word]] = as.double(vaes[-1])
  13.  
    etxPressar(pb, i)
  14.  
    }
  15.  
     
  16.  
    # 创建我们的嵌入矩阵
  17.  
     
  18.  
    faikimbddngim = 300
  19.  
    fawkiebiix = array(0, c(mx_ords, faii_mdig_m))
  20.  
     
  21.  
    for (wrd in names(wrddex)){
  22.  
    idx <- wr_dx[[od]]
  23.  
    if (nex < ma_ds){
  24.  
    faiki_embdg_vctor =astwkedgdex[[word]]
  25.  
    if (!is.null(fasiembddigveor))
  26.  
    fatwki_bednrix[iex+1,] <- faswiiedin_vor # 没有嵌入的词都是零
  27.  
    }
  28.  
     

模型架构

我们从一个简单的 LSTM 开始,顶层有一个用于预测的密集层。

  1.  
    # 设置输入
  2.  
     
  3.  
    inpt <- layput(
  4.  
    shape = list(NULL),
  5.  
     
  6.  
     
  7.  
    # 模型层
  8.  
     
  9.  
    embding <- input %>%
  10.  
    layeing(input_dim = maords, output_dim = fasing_dim, name = "embedding")
  11.  
     
  12.  
    lstm <- eming %>%
  13.  
    layer_lstm(units = maxn,drout = 0.25, recudroput = 0.25, reseques = FALSE, name = "lstm")
  14.  
     
  15.  
    dese <- lstm %>%
  16.  
    ladese(units = 128, actin = "rlu", name = "dese")
  17.  
     
  18.  
     
  19.  
     
  20.  
    # 把模型集中起来
  21.  
     
  22.  
    mol <- kmoel(input, preds)
  23.  
     
  24.  
    # 最初冻结嵌入权重,以防止更新的权重回传,破坏我们的嵌入。
  25.  
     
  26.  
    getlar(ml, name = "embedding") %>%
  27.  
    sehts(list(fasatrix)) %>%
  28.  
    frehts()
  29.  
     
  30.  
     
  31.  
    # 编译
  32.  
     
  33.  
     
  34.  
    print(model)

模型训练

保持对初始基准模型的快速训练。

  1.  
    # 训练模型
  2.  
     
  3.  
    history <- model %>% fit(
  4.  
    x_train,
  5.  
    y_train,
  6.  
     
  7.  
    # 看看训练结果
  8.  
     
  9.  
    print(hisy)

模型可以很容易地通过微调来改进:只需嵌入层并再训练模型几个 epoch,注意不要过度拟合。


最受欢迎的见解

1.用于NLP的Python:使用Keras的多标签文本LSTM神经网络分类

2.Python中利用长短期记忆模型LSTM进行时间序列预测分析 – 预测电力消耗数据

3.python在Keras中使用LSTM解决序列问题

4.Python中用PyTorch机器学习分类预测银行客户流失模型

5.R语言多元Copula GARCH 模型时间序列预测

6.在r语言中使用GAM(广义相加模型)进行电力负荷时间序列分析

7.R语言中ARMA,ARIMA(Box-Jenkins),SARIMA和ARIMAX模型用于预测时间序列数

8.R语言估计时变VAR模型时间序列的实证研究分析案例

9.用广义加性模型GAM进行时间序列分析

posted @ 2022-06-02 16:31  拓端tecdat  阅读(274)  评论(0)    收藏  举报