[深度学习] embedding 在test阶段遇到OOV怎么办

本文讨论了在使用char级别的RNN模型时如何处理测试阶段遇到的OOV问题。提出了两种主要思路:一是为UNK提供特定的embedding;二是不为UNK提供embedding,将其初始化为0向量或每次随机初始化。

即使是char级别的rnn模型,在test阶段也会遇到OOV

这种情况肯定是没法用embedding层的lookup的


如果OOV情况不多,就可以当做UNK处理

有两类思路:

1. UNK有对应的embedding

    这种情况怎么来的呢,就是把训练集中所有出现频率小于某个阈值的词都标记为UNK,当然也别太多,这样就得到了UNK的embedding,这里的embedding有一定的语义信息,仁者见仁,可能不好使  


2. UNK没有对应的embedding

    a. 把UNK都初始化成0的向量

    b. 每次都把UNK初始化成一个新的随机向量

    

    都初始化成0向量,会使得UNK都共享相同的语义信息,所以很多人都倾向于对UNK直接随机,因为本身每个UNK都不同,随机更符合我们对UNK基于最大熵的估计,即我不知道你是个啥,所以我就随机出一个,很多地方也证实使用随机向量处理UNK带来的好处:

How to add new embeddings for unknown words in Tensorflow

Initializing Out of Vocabulary (OOV) tokens



如果OOV的情况较多,建议重新train一份embedding

### 关于深度学习情感分析模型的实现 深度学习的情感分析通常依赖于复杂的神经网络结构来捕捉文本中的语义特征。常见的深度学习架构包括循环神经网络 (RNN)[^1]、长短时记忆网络 (LSTM) 和双向 LSTM 结构,以及近年来流行的 Transformer 架构及其变体如 BERT。 #### 数据预处理 在构建情感分析模型之前,数据预处理是一个重要的环节。这一步骤可能涉及去除停用词、分词、词嵌入转换等操作。常用的词嵌入技术有 Word2Vec 或 GloVe,而更先进的方法则采用上下文敏感的词嵌入方式,比如 ELMo 或者 BERT 的 Fine-tuning 方法。 #### 常见模型架构 以下是几种常见的情感分析深度学习模型: 1. **卷积神经网络 (CNN)** CNN 可用于提取局部模式并捕获短距离内的关系,在某些情况下能够很好地应用于情感分类任务。它通过一系列滤波器检测特定的语言模式,并将其映射到更高维度的空间中进行分类。 2. **循环神经网络 (RNN) / 长短期记忆网络 (LSTM)** RNN 能够有效处理序列化输入,尤其适合像句子这样的时间序列数据。然而,标准 RNN 容易受到梯度消失的影响;因此,改进版的 LSTM 成为了主流选择之一。LSTM 利用了门控机制保存长期状态信息,从而更好地理解上下文含义。 3. **Transformer 与 BERT** Transformer 是一种完全基于注意力机制的新颖框架,摒弃了传统的 RNN/CNN 设计思路。BERT(Bidirectional Encoder Representations from Transformers)作为其中的一个代表作,已经在多项 NLP 评测上刷新记录。通过对大规模无标注语料库的学习,BERT 提供了一个强大的通用语言表征工具箱,可以直接迁移至下游任务如情感分析之上。 #### 示例代码:使用 Keras 实现简单的 LSTM 情感分析模型 下面展示如何利用 Python 中的 TensorFlow/Keras 库快速搭建一个基础版本的 LSTM 文本分类器。 ```python import tensorflow as tf from tensorflow.keras.preprocessing.text import Tokenizer from tensorflow.keras.preprocessing.sequence import pad_sequences # 参数设置 vocab_size = 10000 # 字典大小 embedding_dim = 64 # 嵌入维度 max_length = 100 # 输入长度截断/填充的最大值 trunc_type='post' # 截断位置 padding_type='post' # 补齐位置 oov_tok = "<OOV>" # OOV标记符 # 加载数据集... tokenizer = Tokenizer(num_words=vocab_size, oov_token=oov_tok) tokenizer.fit_on_texts(sentences) sequences = tokenizer.texts_to_sequences(sentences) padded = pad_sequences(sequences, maxlen=max_length, padding=padding_type, truncating=trunc_type) model = tf.keras.Sequential([ tf.keras.layers.Embedding(vocab_size, embedding_dim), tf.keras.layers.Bidirectional(tf.keras.layers.LSTM(embedding_dim)), tf.keras.layers.Dense(24, activation='relu'), tf.keras.layers.Dense(1, activation='sigmoid') ]) model.compile(loss='binary_crossentropy', optimizer='adam', metrics=['accuracy']) history = model.fit(padded, labels, epochs=num_epochs, validation_data=(test_padded, test_labels)) ``` 上述脚本定义了一个双方向 LSTM 层配合全连接层完成二元情绪预测的任务。当然实际项目里还需要考虑更多细节优化过程诸如超参数调整、正则项引入等等。
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值