首页 > 解决方案 > 如何使用 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]]]

通过遵循一些教程,我将其转换为 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 表。

一旦我解决了这个问题,我会在这里发布。

标签: pythonpytorchlstmword2vectorch

解决方案


您既不需要神经网络,也不需要词嵌入。使用带有 NLTK 的解析树,其中意图是V作用于entities给定 (N)上的动词utterance

短语

要对句子进行分类,您可以使用神经网络。我个人喜欢 fast.ai 中的 BERT。再一次,你不需要嵌入来运行分类,你可以用多语言来做:

Fast.ai_BERT_ULMFit

此外,Named Entity Recognition如果您正在使用聊天机器人,您可以使用它来指导对话。


推荐阅读