Маркировка предложений Gensim doc2vec

Я пытаюсь понять doc2vec и могу ли я использовать его для решения своего сценария. Я хочу пометить предложения с 1 или более тегами, используя TaggedSentences([слова], [теги]), но я не уверен, правильно ли я понимаю.

в общем, мне нужно, чтобы это произошло (или я совсем не в теме)

Я создаю 2 TaggedDocuments

TaggedDocument(words=["the", "bird", "flew", "over", "the", "coocoos", "nest", labels=["animal","tree"])
TaggedDocument(words=["this", "car", "is", "over", "one", "million", "dollars", labels=["motor","money"])

Я строю свою модель

model = gensim.models.Doc2Vec(documents, dm=0, alpha=0.025, size=20, min_alpha=0.025, min_count=0)

Затем я тренирую свою модель

model.train(documents, total_examples=len(documents), epochs=1)

Итак, когда я все это сделал, я ожидаю, когда я выполню

model.most_similar(positive=["bird", "flew", "over", "nest])

это [животное,дерево], но я получаю

[('the', 0.4732949137687683), 
('million', 0.34103643894195557),
('dollars', 0.26223617792129517),
('one', 0.16558100283145905),
('this', 0.07230066508054733),
('is', 0.012532509863376617),
('cocos', -0.1093338280916214),
('car', -0.13764989376068115)]

ОБНОВЛЕНИЕ: когда я делаю вывод

vec_model = model.Word2Vec.load(os.path.join("save","vec.w2v"))
infer = vec_model.infer_vector(["bird", "flew", "over", "nest"])
print(vec_model.most_similar(positive=[infer], topn=10))

я получил

[('bird', 0.5196993350982666),
('car', 0.3320297598838806), 
('the',  0.1573483943939209), 
('one', 0.1546170711517334), 
('million',  0.05099521577358246),
('over', -0.0021460093557834625), 
('is',  -0.02949431538581848),
('dollars', -0.03168443590402603), 
('flew', -0.08121247589588165),
('nest', -0.30139490962028503)]

Итак, слон в комнате. Является ли doc2vec тем, что мне нужно для выполнения описанного выше сценария, или мне следует вернуться в постель и хорошенько подумать о том, чего я пытаюсь достичь в жизни :)

Любая помощь очень ценится


person rogger2016    schedule 10.10.2017    source источник


Ответы (1)


Непонятно, какая у вас цель.

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

Если вы спросите model о сходстве, вы получите слова — если вам нужны doc-теги, вам придется запросить подсвойство docvecs модели. (То есть model.docvecs.most_similar().)

Что касается ваших тренировочных параметров, нет веских причин менять значение по умолчанию min_alpha, чтобы оно было равно начальной альфе. min_count=0, сохраняющий все слова, обычно делает векторы word2vec/doc2vec хуже. И алгоритму обычно требуется много проходов по данным — обычно 10 или более, а не один.

Но кроме того, word2vec/doc2vec действительно нуждается в массовых данных для достижения своих результатов — тесты игрушечного размера редко показывают те же полезные свойства, которые возможны с большими наборами данных.

person gojomo    schedule 10.10.2017
comment
Большое спасибо за ответ gojomo :), поэтому я исправил опечатки в приведенных выше фрагментах кода (список строк), также я попытался немного лучше понять min_count и min_alpha. :) Я повторно запускаю код, используя docvecs.most_similar(), и я действительно получаю правильные ранжированные метки, которые я ожидаю. Я довольно новичок в ML и очень ценю обратную связь. Не мне нужно получить больший набор данных с некоторыми хорошими данными для игры. Мой путь продолжается :) - person rogger2016; 11.10.2017
comment
Непонятно, какая у вас цель. › Я пытаюсь пометить предложение ярлыками из похожего предложения - person rogger2016; 11.10.2017
comment
Я также немного смущен тем, что если у меня есть 100 документов с уникальными предложениями и метками, если я запускаю запрос, который точно соответствует предложению, я ожидаю получить определенную метку... каждый раз, когда он дает мне другую метку. ..это должно произойти? - person rogger2016; 12.10.2017
comment
В обучении/выводе Doc2Vec используется неотъемлемая случайность, поэтому вы не получите идентичных векторов от прогона к прогону (без дополнительных усилий), но они должны быть похожими, и тем более, если модель/вывод выполняется с достаточными данными и хорошими параметрами. Когда повторный вывод обучающего текста не возвращает как most_similar() обучающие теги этого текста, распространенными причинами являются: (1) требуется больше усилий для вывода (особенно для небольших текстов) - по умолчанию steps также часто немного; (2) отсутствие предварительной обработки вывода, как при обучении; (3) слишком мало данных (или слишком большая/переоснащенная модель). - person gojomo; 12.10.2017
comment
(По сути, с «большой» моделью по сравнению с «маленькими» данными модель может хорошо справляться с задачей обучения без обобщающего принудительного «уплотнения» входного пространства... и, таким образом, те же/похожие тексты позже могут быть, с немного отличающимися начальными рандомизациями , получаются довольно разные векторы, особенно для коротких текстов или нескольких итераций. Больше итераций, больше данных или меньшие размеры векторов могут помочь... но на самом деле вам нужны десятки тысяч или миллионы примеров, даже для обучения более чем 100 многомерных векторов. 100 примеров в 20 измерениях, и особенно, если примеры короткие, растягивая их.) - person gojomo; 12.10.2017