word2Vec和缩写

时间:2018-06-18 09:28:25

标签: python keras nlp word2vec

我正在处理文本分类任务,其中我的数据集包含许多缩写和专有名词。例如: Milka choc。杆即可。
我的想法是使用带有word2vec嵌入的双向LSTM模型 这是我的问题如何编码字,不出现在字典中? 我通过合并预先训练的矢量和随机初始化来部分地解决了这个问题。这是我的实施:

import gensim
from gensim.models import Word2Vec
from gensim.utils import simple_preprocess

from gensim.models.keyedvectors import KeyedVectors

word_vectors = KeyedVectors.load_word2vec_format('ru.vec', binary=False, unicode_errors='ignore')

EMBEDDING_DIM=300
vocabulary_size=min(len(word_index)+1,num_words)
embedding_matrix = np.zeros((vocabulary_size, EMBEDDING_DIM))
for word, i in word_index.items():
    if i>=num_words:
        continue
    try:
        embedding_vector = word_vectors[word]
        embedding_matrix[i] = embedding_vector
    except KeyError:
        embedding_matrix[i]=np.random.normal(0,np.sqrt(0.25),EMBEDDING_DIM)

def LSTMModel(X,words_nb, embed_dim, num_classes):
    _input = Input(shape=(X.shape[1],))
    X = embedding_layer = Embedding(words_nb,
                            embed_dim,
                            weights=[embedding_matrix],
                            trainable=True)(_input)
   X = The_rest_of__the_LSTM_model()(X)

你认为,允许模型调整嵌入权重是一个好主意吗? 你能告诉我,我怎么能编码像 choc 这样的单词?显然,这个缩写代表巧克力

2 个答案:

答案 0 :(得分:1)

如果训练中没有足够大的语料库,调整word2vec嵌入通常不是一个好主意。为了澄清这一点,举一个例子,你的语料库有电视而不是 TV 。即使他们可能有word2vec嵌入,在训练后只有电视将被调整而不是 TV 。所以你破坏了word2vec的信息。

要解决此问题,您有3个选项:

  1. 您让上层的LSTM根据其上下文确定该词可能意味着什么。例如,我喜欢choc。 LSTM可以判断它是一个对象。这由Memory Networks证实。
  2. 简单的选项,预处理,在传递给模型之前尽可能地规范化。法术检查员经常抓住这些并且非常快。
  3. 您可以在word2vec旁边使用字符编码。这在许多问答模型中使用,例如BiDAF,其中字符表示与word2vec合并,因此您有一些信息将字符与单词相关联。在这种情况下, choc 可能类似于巧克力

答案 1 :(得分:0)

这样做的一种方法是添加一个函数,将您的缩写映射到最可能相关的现有向量,即:初始化 choc 向量到w2v中的巧克力矢量。

word_in_your_embedding_matrix[:len(abbreviated_word)]

有两种可能的情况:

  • 只有一个候选人以与您的缩写相同的n个字母开头,然后,您可以使用该向量初始化缩写嵌入。
  • 有多个项目以与缩写相同的n个字母开头,您可以使用平均值作为yout初始化向量。