Заменить случайное слово на сходство с word2vec - PullRequest
0 голосов
/ 29 апреля 2019

Я хотел бы заменить случайное слово из предложения на наиболее похожее слово из word2vec, например, слово из предложения question = 'Can I specify which GPU to use?'.

Я использовал этот рекурсивный метод, потому что в функции split некоторые слова (например, to) не входят в word2vecmodel:

import gensim.models.keyedvectors as word2vec
import random as rd

model = word2vec.KeyedVectors.load_word2vec_format('/Users/nbeau/Desktop/Word2vec/model/GoogleNews-vectors-negative300.bin', binary=True)

def similar_word(sentence, size):
    pos_to_replace = rd.randint(0, size-1)
    try:
        similarity = model.most_similar(positive = [sentence[pos_to_replace]])
        similarity = similarity[0][0]
    except KeyError:
        similarity, pos_to_replace = test(sentence, size)
        return similarity, pos_to_replace
    return similarity, pos_to_replace

question = question.split()
size = len(question)
similarity, pos_to_replace = similar_word(question, size)
sentence[pos_to_replace] = similarity

Я хотел бы знать, есть ли лучший способ избежать слов, которых нет в модели word2vec.

1 Ответ

1 голос
/ 29 апреля 2019

Несколько мыслей:

  • Если kv_model является вашей KeyedVectors моделью, вы можете сделать 'to' in kv_model, чтобы проверить, присутствует ли слово, вместо того, чтобы пытаться, но потом ловитьKeyError.Но быть оптимистом и ловить ошибку - это тоже распространенная идиома!

  • Ваша рекурсия не обязательно завершится: если предоставленный текст не содержит известных слов, он будет продолжать рекурсивные попытки бесконечно (или, возможно, когда достигнут некоторый предел реализации глубины вызова).Кроме того, он может попробовать одно и то же слово много раз.

Я бы предложил использовать цикл, а не рекурсию, и использовать метод random.shuffle() Python для создания единственной случайной перестановки всех потенциальных индексов.Затем попробуйте выполнить каждый из них по очереди, вернувшись, как только замена возможна, или указав сбой, если замена невозможна.

Сохранение подписи возврата того же метода:

def similar_word(sentence):
    indexes = range(len(sentence))
    random.shuffle(indexes)
    for i in indexes:
        if sentence[i] in kv_model:
            return model.most_similar(sentence[i], topn=1)[0][0], i
    return None, -1  # no replacement was possible

(НоОтдельно от вашего вопроса: если бы 100% времени результат функции использовался для выполнения замены, я просто переместил бы замену внутри функции, поменяв переданный sentence. И функция могла бы сообщить, какон произвел много замен: 0 для отказа, 1 для обычного случая - и, возможно, в будущем может принять параметр для запроса более 1 замены.)

...