Python word2Vec和缩写
我正在进行文本分类任务,其中我的数据集包含许多缩写和专有名词。例如:米尔卡巧克力。酒吧 我的想法是使用双向LSTM模型和word2vec嵌入。 我的问题是如何给字典里没有的单词编码? 我通过将预先训练的向量与随机初始化的向量合并,部分解决了这个问题。以下是我的实现:Python word2Vec和缩写,python,keras,nlp,word2vec,Python,Keras,Nlp,Word2vec,我正在进行文本分类任务,其中我的数据集包含许多缩写和专有名词。例如:米尔卡巧克力。酒吧 我的想法是使用双向LSTM模型和word2vec嵌入。 我的问题是如何给字典里没有的单词编码? 我通过将预先训练的向量与随机初始化的向量合并,部分解决了这个问题。以下是我的实现: import gensim from gensim.models import Word2Vec from gensim.utils import simple_preprocess from gensim.models.keye
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这样的单词编码吗?显然,这个缩写代表巧克力 如果培训中没有足够大的语料库,调整word2vec嵌入通常不是一个好主意。为了澄清这一点,举一个例子,你的语料库有电视,但没有电视。即使他们可能有word2vec嵌入,在培训后,只有电视将被调整,而不是电视。所以你破坏了word2vec的信息 要解决此问题,您有3个选项: 您可以让上层的LSTM根据上下文来确定单词的含义。例如,我喜欢巧克力。LSTM可以确定它是一个对象。这一点可以通过以下例子加以证明。 简单的选项,预处理,在传递到模型之前尽可能规范化。拼写检查器通常能很好地捕获这些信息,而且速度非常快。 您可以使用字符编码和side word2vec。这在许多问答模型中都有应用,例如字符表示与word2vec合并,因此您可以获得一些与字符相关的信息。在这种情况下,巧克力可能类似于巧克力。
一种方法是添加一个函数,将缩写映射到最可能相关的现有向量,即:将choc向量初始化为w2v中的巧克力向量
word_in_your_embedding_matrix[:len(abbreviated_word)]
有两种可能的情况:
只有一个候选词以与缩写词相同的n个字母开头,然后,您可以使用该向量初始化缩写词嵌入。
有多个项目以与缩写相同的n个字母开头,您可以使用平均值作为yout初始化向量。
非常感谢,这是一个非常好的帖子。我应该对我的问题加上更详细的描述。我正在研究文本分类,其中目标向量的大小约为30k。你知道选择什么型号吗?