【发布时间】:2020-03-25 23:33:48
【问题描述】:
要解决的问题:给定一个句子,返回它背后的意图(想想聊天机器人)
简化的示例数据集(dict 左侧的 Intent):
data_raw = {"mk_reservation" : ["i want to make a reservation",
"book a table for me"],
"show_menu" : ["what's the daily menu",
"do you serve pizza"],
"payment_method" : ["how can i pay",
"can i use cash"],
"schedule_info" : ["when do you open",
"at what time do you close"]}
我已经用 spaCy 剥离了句子,并使用 gensim 库提供的 word2vec 算法对每个单词进行了标记。
这是使用word2vec模型GoogleNews-vectors-negative300.bin的结果:
[[[ 5.99331968e-02 6.50703311e-02 5.03010787e-02 ... -8.00536275e-02
1.94782894e-02 -1.83010306e-02]
[-2.14406010e-02 -1.00447744e-01 6.13847338e-02 ... -6.72588721e-02
3.03986594e-02 -4.14126664e-02]
[ 0.00000000e+00 0.00000000e+00 0.00000000e+00 ... 0.00000000e+00
0.00000000e+00 0.00000000e+00]
...
[ 0.00000000e+00 0.00000000e+00 0.00000000e+00 ... 0.00000000e+00
0.00000000e+00 0.00000000e+00]
[ 0.00000000e+00 0.00000000e+00 0.00000000e+00 ... 0.00000000e+00
0.00000000e+00 0.00000000e+00]
[ 0.00000000e+00 0.00000000e+00 0.00000000e+00 ... 0.00000000e+00
0.00000000e+00 0.00000000e+00]]
[[ 4.48647663e-02 -1.03907576e-02 -1.78682189e-02 ... 3.84555124e-02
-2.29179319e-02 -2.05144612e-03]
[-5.39291985e-02 -9.88398306e-03 4.39085700e-02 ... -3.55276838e-02
-3.66208404e-02 -4.57760505e-03]
[ 0.00000000e+00 0.00000000e+00 0.00000000e+00 ... 0.00000000e+00
0.00000000e+00 0.00000000e+00]
...
[ 0.00000000e+00 0.00000000e+00 0.00000000e+00 ... 0.00000000e+00
0.00000000e+00 0.00000000e+00]
[ 0.00000000e+00 0.00000000e+00 0.00000000e+00 ... 0.00000000e+00
0.00000000e+00 0.00000000e+00]
[ 0.00000000e+00 0.00000000e+00 0.00000000e+00 ... 0.00000000e+00
0.00000000e+00 0.00000000e+00]]]
- 这是一个句子列表,每个句子都是单词列表([sentences[sentence[word]]])
- 每个句子(列表)的大小必须为 10 个字(我用零填充剩余部分)
- 每个单词(列表)有 300 个元素(word2vec 维度)
通过遵循一些教程,我将其转换为 TensorDataset。
此时,我对如何使用 word2vec 感到非常困惑,可能我只是在浪费时间,到目前为止,我认为 LSTM 配置中的 嵌入层 应该通过导入来组成word2vec 模型权重使用:
import gensim
model = gensim.models.KeyedVectors.load_word2vec_format('path/to/file')
weights = torch.FloatTensor(model.vectors)
word_embeddings = nn.Embedding.from_pretrained(weights)
这还不够,因为 pytorch 说它不接受索引不是 INT 类型的嵌入。
编辑:我发现从 gensim word2vec 导入权重矩阵并不简单,还必须导入 word_index 表。
一旦我解决了这个问题,我会在这里发布。
【问题讨论】:
标签: python pytorch lstm word2vec torch