python - 如何使用 gensim 和 pytorch 创建意图分类器(使用 LSTM NN)?
问题描述
要解决的问题:给定一个句子,返回它背后的意图(想想聊天机器人)
简化示例数据集(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 表。
一旦我解决了这个问题,我会在这里发布。
解决方案
您既不需要神经网络,也不需要词嵌入。使用带有 NLTK 的解析树,其中意图是V
作用于entities
给定 (N)上的动词utterance
:
要对句子进行分类,您可以使用神经网络。我个人喜欢 fast.ai 中的 BERT。再一次,你不需要嵌入来运行分类,你可以用多语言来做:
此外,Named Entity Recognition
如果您正在使用聊天机器人,您可以使用它来指导对话。
推荐阅读
- algorithm - 如何推导二叉树的主深度为 O(sqrt(N))?
- go - 如何从数据存储中获取名称/密钥
- postgresql - postgres - 根据条件计算累积和
- r - 制作“可绘制”反应贴图
- c - Linked List 包含另一个链表,嵌套链表
- google-cloud-platform - 'projects/$project_id/regions/us-central1 所需的 'compute.regions.get' 权限
- sql-server - 如何在 Order by 子句中使用计算别名?
- cors - 对 Tomcat 服务器进行 API 调用时如何修复“被 CORS 策略阻止”错误
- vue-cli - Vue-cli 运行构建 TypeError 'name' 未定义
- reactjs - 如何在反应中使用钩子路由器获取当前的url路径?