Gensim Word2Vec самый похожий другой результат python

У меня есть первая книга о Гарри Поттере в формате txt. Из этого я создал два новых файла txt: в первом все вхождения Hermione были заменены на Hermione_1; во втором, все встречающиеся Hermione были заменены на Hermione_2. Затем я объединил эти два текста, чтобы создать один длинный текст, и использовал его как ввод для Word2Vec. Это мой код:

import os
from gensim.models import Word2Vec
from gensim.models import KeyedVectors

with open("HarryPotter1.txt", 'r') as original, \
        open("HarryPotter1_1.txt", 'w') as mod1, \
        open("HarryPotter1_2.txt", 'w') as mod2:

    data=original.read()
    data_1 = data.replace("Hermione", 'Hermione_1')
    data_2 = data.replace("Hermione", 'Hermione_2')
    mod1.write(data_1 + r"\n")
    mod2.write(data_2 + r"\n")

with open("longText.txt",'w') as longFile:
    with open("HarryPotter1_1.txt",'r') as textfile:
        for line in textfile:
            longFile.write(line)
    with open("HarryPotter1_2.txt",'r') as textfile:
        for line in textfile:
            longFile.write(line)


model = ""
word_vectors = ""
modelName = "ModelTest"
vectorName = "WordVectorsTestst"

answer2 = raw_input("Overwrite  embeddig? (yes or n)")
if (answer2 == 'yes'):
    with open("longText.txt",'r') as longFile:
        sentences = []
        single= []
        for line in longFile:
            for word in line.split(" "):
                single.append(word)
            sentences.append(single)

    model = Word2Vec(sentences,workers=4, window=5,min_count=5)

    model.save(modelName)
    model.wv.save_word2vec_format(vectorName+".bin",binary=True)
    model.wv.save_word2vec_format(vectorName+".txt", binary=False)
    model.wv.save(vectorName)

    word_vectors = model.wv

else:
    model = Word2Vec.load(modelName)
    word_vectors = KeyedVectors.load_word2vec_format(vectorName + ".bin", binary=True)

    print(model.wv.similarity("Hermione_1","Hermione_2"))
    print(model.wv.distance("Hermione_1","Hermione_2"))
    print(model.wv.most_similar("Hermione_1"))
    print(model.wv.most_similar("Hermione_2"))

Как возможно, что model.wv.most_similar("Hermione_1") и model.wv.most_similar("Hermione_2") дают разные результаты? Их сосед совсем другой. Это результат четырех отпечатков:

0.00799602753634
0.992003972464
[('moments,', 0.3204237222671509), ('rose;', 0.3189219534397125), ('Peering', 0.3185565173625946), ('Express,', 0.31800806522369385), ('no...', 0.31678506731987), ('pushing', 0.3131707012653351), ('triumph,', 0.3116190731525421), ('no', 0.29974159598350525), ('them?"', 0.2927379012107849), ('first.', 0.29270970821380615)]
[('go?', 0.45812922716140747), ('magical', 0.35565727949142456), ('Spells."', 0.3554503619670868), ('Scabbets', 0.34701400995254517), ('cupboard."', 0.33982667326927185), ('dreadlocks', 0.3325180113315582), ('sickening', 0.32789379358291626), ('First,', 0.3245708644390106), ('met', 0.3223033547401428), ('built', 0.3218075931072235)]

Вы уверены, что longText.txt имеет ожидаемый результат, в частности, много отдельных предложений в строках, оканчивающихся на \n? (Попробуйте wc longText.txt и просмотрите его.) Если это всего одна строка или очень мало, то обучение будет происходить очень мало. (Word2Vec принимает только предложения с 10 000 токенов, игнорируя остальные.) Вы также можете получить подсказки, если включите ведение журнала на уровне ИНФОРМАЦИИ и во время обучения будете следить за выводом прогресса, который не имеет смысла - например, не отражает ожидаемое количество текста, количество слов или прошедшее время.

gojomo 24.03.2018 19:30
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
0
1
798
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Обучение моделей word2Vec в некоторой степени случайное. Поэтому результаты могут быть разными. Также Hermione_2 начинает появляться во второй половине текстовых данных. Насколько я понимаю, в процессе обработки данных, когда контекст Hermione_1 уже установлен, а также вектор для этого слова, вы вводите второе слово в точно таком же контексте, и алгоритм пытается найти, что отличает их. Во-вторых, вы используете очень короткий вектор, который может недооценивать сложность концептуального пространства. За счет упрощений вы получаете два вектора без какого-либо перекрытия.

Есть ли какие-то параметры, которые я должен изменить, чтобы попытаться улучшить процесс (Word2Vec ())? Я думаю об увеличении окна, уменьшении min_count или изменении как-то cbow_mean, sorted_vocab, sample, sg или trim_rule

Camilla8 23.03.2018 19:26

У вас была возможность просмотреть этот учебник?

sophros 16.04.2018 14:24

Другие вопросы по теме