Ошибка Gensim doc2vec: KeyError: “слово ‘senseless’ не в словаре”

Вопрос или проблема

Я новичок в машинном обучении и попробовал doc2vec на наборе данных с дубликатами вопросов Quora. new_dfx имеет столбцы ‘question1’ и ‘question2’, которые содержат предварительно обработанные вопросы в каждой строке. Вот пример размеченного документа:

входные данные:

q_arr = np.append(new_dfx['question1'].values, new_dfx['question2'].values)
tagged_data1 = [TaggedDocument(words=word_tokenize(_d.lower()), tags=[str(i)]) for i, _d in enumerate(q_arr)]
tagged_data1[50001]

выходные данные:

TaggedDocument(words=['senseless', 'movi', 'like', 'dilwal', 'happi', 'new', 'year', 'earn', 'easi', '100', 'crore', 'india'], tags=['50001'])

Вход:

model_dbow1 = Doc2Vec(dm=1, vector_size=300, negative=5, workers=cores)
model_dbow1.build_vocab([x for x in tqdm(tagged_data1)])
train_documents1  = utils.shuffle(tagged_data1)
model_dbow1.train(tagged_data1,total_examples=len(train_documents1), epochs=30)

— чтобы проверить, правильно ли обучена модель

model_dbow1.most_similar('senseless')

Ошибка:

KeyError: "word 'senseless' not in vocabulary"

Данные, которые я передал модели для обучения, содержат слово “senseless”, так почему возникает эта ошибка? Не могли бы вы помочь?Другое слово дает выходные данные

Это Doc2Vec, а не Word2Vec, поэтому я не думаю, что вам нужно передавать слово в most_similar(). Вместо:

model_dbow1.most_similar('senseless')

Я думаю, что вам следует сделать:

model_dbow1.most_similar('55001')

Или, альтернативно, если вы действительно хотите искать однословное предложение:

vector = model_dbow1.infer_vector(["senseless"])
model_dbow1.most_similar([vector])

(Вышеуказанное – это немного догадок, основанных на онлайн-документах для Doc2Vec и некоторых учебниках (например, это и, например, Сходство предложений с использованием Doc2vec). Где возможно, приведите полностью воспроизводимый пример, который мы можем протестировать.)

API Doc2Vec должен быть вызван так:

vector = model_dbow1.infer_vector(["senseless"])
model_dbow1.wv.most_similar([vector])

Вот полный рабочий пример:

from gensim.models.doc2vec import Doc2Vec, TaggedDocument
from nltk.tokenize import word_tokenize
from tqdm import tqdm

q_arr = " ".join(['senseless', 'movi', 'like', 'dilwal', 'happi', 'new', 'year', 'earn', 'easi', '100', 'crore', 'india'])
cores = 4
train_documents1 = q_arr
tagged_data1 = [TaggedDocument(words=word_tokenize(_d.lower()), tags=[str(i)]) for i, _d in enumerate(q_arr)]
model_dbow1 = Doc2Vec(dm=1, vector_size=300, negative=5, workers=cores)
model_dbow1.build_vocab([x for x in tqdm(tagged_data1)])
# train_documents1  = utils.shuffle(tagged_data1)
train_documents1  = tagged_data1
model_dbow1.train(tagged_data1,total_examples=len(train_documents1), epochs=30)

vector = model_dbow1.infer_vector(["senseless"])
model_dbow1.wv.most_similar([vector])

Ответ или решение

Ошибка KeyError в Gensim Doc2Vec: "слово ‘senseless’ не в словаре"

Вас беспокоит ошибка KeyError: "слово 'senseless' не в словаре" при работе с моделью Doc2Vec в рамках вашего проекта по обучению на датасете Quora duplicate. Давайте разберемся в её причинах и способах решения.

Описание проблемы

Вы находитесь на этапе, где обучаете модель Doc2Vec с использованием обработанных вопросов из колонок question1 и question2 вашего датафрейма new_dfx. Вы подготовили данные, создав список tagged_data1, представляющий собой список классов TaggedDocument, в который передаются слова в нижнем регистре и идентификаторы для каждого документа. Однако после обучения модели и попытки вызвать метод most_similar с аргументом ‘senseless’, вы получаете ошибку, указывая на отсутствие этого слова в словаре.

Анализ причин

  1. Тип модели: Doc2Vec отличается от Word2Vec. Модель Doc2Vec создаётся для обработки целых документов, а не отдельных слов. Поэтому, чтобы получить схожие документы, вам необходимо использовать идентификаторы документов (теги), а не слова.

  2. Модель не включает слово: Возможно, слово ‘senseless’ не попало в словарь во время этапа построения словаря, если оно не встречалось в обучающих данных, либо в процессе между токенизацией и построением словаря была потеряна информация.

Решение проблемы

  1. Используйте infer_vector для анализа слова: Чтобы получить схожие документы или слова на основе отдельного слова, вам необходимо использовать метод infer_vector. Например:

    vector = model_dbow1.infer_vector(["senseless"])
    similar_words = model_dbow1.wv.most_similar([vector])

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

  2. Работа с тегами: Вместо того чтобы пытаться искать по слову, вы можете экспериментировать с тегами. Например:

    model_dbow1.most_similar('50001')

    Здесь вы используете идентификатор документа, который соответствовал вашему запросу.

  3. Проверьте пополнение словаря: Убедитесь, что ваши данные правильно очищены и токенизированы перед построением словаря. Если слова, которые вы хотите использовать, были неправильно обработаны, они могут быть исключены из финального словаря.

Итоговое решение

Вот пример кода, который может помочь правильно обучить вашу модель и получить схожие документы на основе отдельного слова:

from gensim.models.doc2vec import Doc2Vec, TaggedDocument
from nltk.tokenize import word_tokenize
from tqdm import tqdm
import numpy as np
import pandas as pd

# Создание примерного датафрейма new_dfx
data = {'question1': ['What is a senseless movie?'], 'question2': ['Is senseless a good movie?']}
new_dfx = pd.DataFrame(data)

# Подготовка данных
q_arr = np.append(new_dfx['question1'].values, new_dfx['question2'].values)
tagged_data1 = [TaggedDocument(words=word_tokenize(_d.lower()), tags=[str(i)]) for i, _d in enumerate(q_arr)]

# Обучение модели
model_dbow1 = Doc2Vec(dm=1, vector_size=300, negative=5, workers=4)
model_dbow1.build_vocab(tagged_data1)
model_dbow1.train(tagged_data1, total_examples=len(tagged_data1), epochs=30)

# Получение схожих слов
vector = model_dbow1.infer_vector(["senseless"])
similar_docs = model_dbow1.wv.most_similar([vector])
print(similar_docs)

Если следовать указанным шагам, вы сможете не только устранить данную ошибку, но и оптимизировать использование модели Doc2Vec в вашем проекте.

Оцените материал
Добавить комментарий

Капча загружается...