如何在pytorch中使用gensim来创建意图分类器(使用LSTM NN?)>

问题描述 投票:0回答:2

要解决的问题:

给定一个句子,返回其背后的意图(思考聊天机器人)

精简示例数据集(字典左侧的意图:

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配置中的embedddings]]应该通过导入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表。

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

要解决的问题:给定一个句子,返回它的意图(想像聊天机器人)精简示例数据集(字典左侧的意图):data_raw = {“ mk_reservation”:[“我想做一个...] >

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

Phrase

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

Fast.ai_BERT_ULMFit

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

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

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

(((如果您拥有或可以获取大量特定于域的培训数据,则在该文本上训练单词向量比重用GoogleNews中的单词向量可能会给您更合适的单词向量。这些向量是根据来自一个大约在2013年的语料库,它将具有与您主要感兴趣的用户键入查询不同的一组词拼写和突出的词义。)

python pytorch lstm word2vec torch
2个回答
2
投票

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

Phrase


1
投票

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

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

(((如果您拥有或可以获取大量特定于域的培训数据,则在该文本上训练单词向量比重用GoogleNews中的单词向量可能会给您更合适的单词向量。这些向量是根据来自一个大约在2013年的语料库,它将具有与您主要感兴趣的用户键入查询不同的一组词拼写和突出的词义。)

© www.soinside.com 2019 - 2024. All rights reserved.