Как использовать gensim с pytorch для создания намеренного классификатора (с LSTM NN)? - PullRequest
0 голосов
/ 01 декабря 2019

Задача, которую нужно решить: С учетом предложения верните намерение, стоящее за ним (Think chatbot)

Сокращенный пример набора данных (Намерение слева от dict):

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 и токенизировал каждое слово, используя алгоритм word2vec , предоставленный библиотекой gensim.

Вот что стало результатом использования модели word2vec GoogleNews-vectors-positive300.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]]]
  • Это список предложений, а каждое предложение - это списокслова ( [предложения [предложение [слово]]] )
  • Каждое предложение (список) должно быть размером 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.

Как только я исправлюэтот вопрос я выложу здесь.

Ответы [ 2 ]

2 голосов
/ 01 декабря 2019

Вам не нужны ни нейронная сеть, ни вложения слов. Используйте проанализированные деревья с NLTK, где намерениями являются глаголы V, действующие на entities (N) в данном utterance:

Phrase

Комуклассифицировать предложение, то вы можете использовать нейронную сеть. Мне лично нравится BERT в fast.ai. Еще раз, вам не понадобятся вложения для запуска классификации, и вы можете сделать это на нескольких языках:

Fast.ai_BERT_ULMFit

Также вы можете использовать Named Entity Recognition если вы работаете в чат-боте, чтобы вести беседы.

1 голос
/ 01 декабря 2019

Если у вас достаточно обучающих данных, вам могут не понадобиться причудливые нейронные сети (или даже явная векторизация слов). Просто попробуйте базовые алгоритмы классификации текста (например, scikit-learn) против базовых текстовых представлений (таких как простой набор слов или набор символов n-грамм).

Если они не работают или терпят неудачу при столкновении с новыми словами, вы можете попробовать более интересные варианты векторизации текста. Например, вы можете заменить неизвестные слова ближайшим известным словом из большой модели word2vec. Или представление запросов в виде векторов средних слов - что, вероятно, является лучшим выбором, чем создание гигантских конкатенаций фиксированной длины с заполнением нулями. Или используйте другие алгоритмы для моделирования текста, такие как «Вектор абзаца» (Doc2Vec in gensim) или более глубокое моделирование нейронной сети (которое требует много данных и времени обучения).

(Если у вас есть или вы можете получить много обучающих данных, относящихся к конкретной области, обучающие векторы слов в этом тексте, скорее всего, дадут вам более подходящие векторы слов, чем их повторное использование из GoogleNews. Эти векторы обучались напрофессиональные новостные сюжеты из корпуса около 2013 года, которые будут иметь совсем другой набор орфографических и выдающихся словосочетаний, чем то, что кажется вам главным интересом, пользовательские запросы.)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...