【问题标题】:How to use gensim with pytorch to create an intent classifier (With LSTM NN)?如何使用 gensim 和 pytorch 创建意图分类器(使用 LSTM NN)?
【发布时间】: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


    【解决方案1】:

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

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

    Fast.ai_BERT_ULMFit

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

    【讨论】:

      【解决方案2】:

      如果您有足够的训练数据,您可能不需要花哨的神经网络(甚至是显式的词向量化)。只需针对基本文本表示(例如简单的词袋或字符袋 n-gram)尝试基本的文本分类算法(例如来自 scikit-learn)。

      如果这些都不起作用,或者在遇到新词时失败,那么您可以尝试更高级的文本矢量化选项。例如,您可以用大型 word2vec 模型中的最近已知词替换未知词。或者将查询表示为词向量的平均值——这可能比创建具有零填充的固定长度的巨型连接更好。或使用其他算法对文本进行建模,例如“段落向量”(gensim 中的Doc2Vec)或更深层次的神经网络建模(需要大量数据和训练时间)。

      (如果您拥有或可以获得大量特定领域的训练数据,那么在该文本上训练词向量可能会比重用来自 GoogleNews 的词向量更合适。这些向量是根据专业新闻故事训练的来自大约 2013 年的语料库,与您似乎主要感兴趣的用户键入的查询相比,该语料库的单词拼写和突出的词义非常不同。)

      【讨论】:

        猜你喜欢
        • 2020-10-25
        • 1970-01-01
        • 2018-04-24
        • 2020-05-08
        • 2020-05-11
        • 2021-08-24
        • 2011-07-31
        • 1970-01-01
        • 2021-03-05
        相关资源
        最近更新 更多