我正在处理文本分类任务,其中我的数据集包含许多缩写和专有名词。例如: 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 这样的单词?显然,这个缩写代表巧克力。
答案 0 :(得分:1)
如果训练中没有足够大的语料库,调整word2vec嵌入通常不是一个好主意。为了澄清这一点,举一个例子,你的语料库有电视而不是 TV 。即使他们可能有word2vec嵌入,在训练后只有电视将被调整而不是 TV 。所以你破坏了word2vec的信息。
要解决此问题,您有3个选项:
答案 1 :(得分:0)
这样做的一种方法是添加一个函数,将您的缩写映射到最可能相关的现有向量,即:初始化 choc 向量到w2v中的巧克力矢量。
word_in_your_embedding_matrix[:len(abbreviated_word)]
有两种可能的情况: