如何使用glove,fasttext等词库进行word embedding?(代码篇)

建议先看:
如何使用glove,fasttext等词库进行word embedding?(原理篇)
再看本篇。
先睹为快:本文会用到的全部代码:

def get_coefs(word, *arr):
    return word, np.asarray(arr, dtype='float32')
    
def load_embeddings(path):
    with open(path) as f:
        return dict(get_coefs(*line.strip().split(' ')) for line in f)

def build_matrix(word_index, path):
    embedding_index = load_embeddings(path)
    embedding_matrix = np.zeros((len(word_index) + 1, 300))
    for word, i in word_index.items():
        try:
            embedding_matrix[i] = embedding_index[word]
        except KeyError:
            pass
    return embedding_matrix

# f为你下载下来的glove/fasttext训练好的模型
embedding_matrix = build_matrix(tokenizer.word_index, f)
#下面是你的模型。我这里是乱写的。
def build_model(embedding_matrix,...):
	words = Input(shape=(MAX_LEN,))
	x = Embedding(*embedding_matrix.shape, weights=[embedding_matrix], trainable=False)(words)
	lstm = CuDNNLSTM(128)(x)
	predictions = Dense(2)(lstm)
	model = Model(inputs=words, outputs=predictions)
	model.compile(loss='binary_crossentropy', optimizer='adam')
	return model
model = build_model(...)

begin~~

ok。既然你看过上一篇博客,我们现在的任务就是把上文的两个大字典拼成一个权重矩阵了~
首先第一个字典是tokenizer.word_index,是现成的。我们可以直接用。重点是这个字典:也就是glove/fasttext中word与300维向量的字典。长这样:
在这里插入图片描述
在这里插入图片描述
我们如何生成呢?

def get_coefs(word, *arr):
    return word, np.asarray(arr, dtype='float32')
    
def load_embeddings(path):
    with open(path) as f:
        return dict(get_coefs(*line.strip().split(' ')) for line in f)

利用上面两个函数即可。
然后生成权重矩阵

def build_matrix(word_index, path):
    embedding_index = load_embeddings(path)
    embedding_matrix = np.zeros((len(word_index) + 1, 300))
    for word, i in word_index.items():
        try:
            embedding_matrix[i] = embedding_index[word]
        except KeyError:
            pass
    return embedding_matrix

# f为你下载下来的glove/fasttext训练好的模型
embedding_matrix = build_matrix(tokenizer.word_index, f)

上面的代码还是很好理解的,我把一些需要注意的稍微说一下:

def get_coefs(word, *arr):
    return word, np.asarray(arr, dtype='float32')
    
def load_embeddings(path):
    with open(path) as f:
        return dict(get_coefs(*line.strip().split(' ')) for line in f)

如果你没有理解那肯定是这一段代码没看懂,它是在干嘛呢?
get_coefs(*line.strip().split(’ ')) for line in f
这句话,就是把文件f的每一行都做了一件事,去掉每行前后的空格,然后以空格进行split,得到一个列表。具体是这样的:
原来的一行是这样:

, -0.082752 0.67204 -0.14987 -0.064983 0.056491 0.40228 0.0027747 -0.3311 -0.30691 2.0817 0.031819 0.013643 0.30265 0.0071297 -0.5819 -0.2774 -0.062254 1.1451 -0.24232 0.1235 -0.12243 0.33152 -0.006162 -0.30541 -0.13057 -0.054601 0.037083 -0.070552 0.5893 -0.30385 0.2898 -0.14653 -0.27052 0.37161 0.32031 -0.29125 0.0052483 -0.13212 -0.052736 0.087349 -0.26668 -0.16897 0.015162 -0.0083746 -0.14871 0.23413 -0.20719 -0.091386 0.40075 -0.17223 0.18145 0.37586 -0.28682 0.37289 -0.16185 0.18008 0.3032 -0.13216 0.18352 0.095759 0.094916 0.008289 0.11761 0.34046 0.03677 -0.29077 0.058303 -0.027814 0.082941 0.1862 -0.031494 0.27985 -0.074412 -0.13762 -0.21866 0.18138 0.040855 -0.113 0.24107 0.3657 -0.27525 -0.05684 0.34872 0.011884 0.14517 -0.71395 0.48497 0.14807 0.62287 0.20599 0.58379 -0.13438 0.40207 0.18311 0.28021 -0.42349 -0.25626 0.17715 -0.54095 0.16596 -0.036058 0.08499 -0.64989 0.075549 -0.28831 0.40626 -0.2802 0.094062 0.32406 0.28437 -0.26341 0.11553 0.071918 -0.47215 -0.18366 -0.34709 0.29964 -0.66514 0.002516 -0.42333 0.27512 0.36012 0.16311 0.23964 -0.05923 0.3261 0.20559 0.038677 -0.045816 0.089764 0.43151 -0.15954 0.08532 -0.26572 -0.15001 0.084286 -0.16714 -0.43004 0.060807 0.13121 -0.24112 0.66554 0.4453 -0.18019 -0.13919 0.56252 0.21457 -0.46443 -0.012211 0.029988 -0.051094 -0.20135 0.80788 0.47377 -0.057647 0.46216 0.16084 -0.20954 -0.05452 0.15572 -0.13712 0.12972 -0.011936 -0.003378 -0.13595 -0.080711 0.20065 0.054056 0.046816 0.059539 0.046265 0.17754 -0.31094 0.28119 -0.24355 0.085252 -0.21011 -0.19472 0.0027297 -0.46341 0.14789 -0.31517 -0.065939 0.036106 0.42903 -0.33759 0.16432 0.32568 -0.050392 -0.054297 0.24074 0.41923 0.13012 -0.17167 -0.37808 -0.23089 -0.019477 -0.29291 -0.30824 0.30297 -0.22659 0.081574 -0.18516 -0.21408 0.40616 -0.28974 0.074174 -0.17795 0.28595 -0.039626 -0.2339 -0.36054 -0.067503 -0.091065 0.23438 -0.0041331 0.003232 0.0072134 0.008697 0.21614 0.049904 0.35582 0.13748 0.073361 0.14166 0.2412 -0.013322 0.15613 0.083381 0.088146 -0.019357 0.43795 0.083961 0.45309 -0.50489 -0.10865 -0.2527 -0.18251 0.20441 0.13319 0.1294 0.050594 -0.15612 -0.39543 0.12538 0.24881 -0.1927 -0.31847 -0.12719 0.4341 0.31177 -0.0040946 -0.2094 -0.079961 0.1161 -0.050794 0.015266 -0.2803 -0.12486 0.23587 0.2339 -0.14023 0.028462 0.56923 -0.1649 -0.036429 0.010051 -0.17107 -0.042608 0.044965 -0.4393 -0.26137 0.30088 -0.060772 -0.45312 -0.19076 -0.20288 0.27694 -0.060888 0.11944 0.62206 -0.19343 0.47849 -0.30113 0.059389 0.074901 0.061068 -0.4662 0.40054 -0.19099 -0.14331 0.018267 -0.18643 0.20709 -0.35598 0.05338 -0.050821 -0.1918 -0.37846 -0.06589

按上面说的做完后,变成一个列表,[’,’ , ‘-0.082752’ , ‘0.67204’…]。前面不是还有个*号嘛,他的意思就是把这个列表拆开,变成301个独立的元素。
*的意思可参见
python 在列表,元组,字典变量前加*号。。

之后把这301个元素传到get_coefs()函数中,第一元素’,'就变成了返回值word,剩下300个元素则被as成array了。
也就是这个函数:

def get_coefs(word, *arr):
    return word, np.asarray(arr, dtype='float32')

最终就成了
在这里插入图片描述
这样的字典。key值为单词,value为一个(300,)的numpy array。
然后用build_matrix函数生成权重矩阵即可。
整体代码请看文章开头。

参考:
https://blog.csdn.net/weixin_40877427/article/details/82931899
https://www.kaggle.com/thousandvoices/simple-lstm?scriptVersionId=12556909

  • 4
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
对于实现词嵌入(Word Embedding)的代码,有多种方法可以选择。以下是一个简单的示例,演示了如何使用Python和gensim库来训练和使用Word2Vec模型: 首先,确保已经安装了gensim库。可以使用以下命令进行安装: ``` pip install gensim ``` 接下来,我们可以使用以下代码来实现Word Embedding: ```python from gensim.models import Word2Vec # 训练数据 sentences = [["I", "like", "apples"], ["I", "like", "bananas"], ["I", "like", "oranges"]] # 训练Word2Vec模型 model = Word2Vec(sentences, min_count=1) # 获取单词的词向量 word_vector = model.wv['apples'] print(word_vector) # 找到与指定单词最相似的单词 similar_words = model.wv.most_similar('apples') print(similar_words) ``` 在上述代码中,我们首先定义了训练数据(sentences),它是一个包含多个句子的列表,每个句子都是一个包含多个单词的列表。然后,我们使用这些句子来训练Word2Vec模型。 在训练完成后,我们可以使用`model.wv[word]`来获取指定单词的词向量。词向量是一个表示单词语义特征的向量。 此外,我们还可以使用`model.wv.most_similar(word)`来找到与指定单词最相似的单词列表。 请注意,这只是Word Embedding的一种实现方式。还有其他方法,例如GloVeFastText等。具体实现方式可能有所不同,但基本原理是相似的。 希望以上代码能对你有所帮助!如果你有任何问题,请随时提问。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值