Я пытаюсь получить ключ определенного слова из словаря Word2Vec

Word2Vec

В настоящее время я пытаюсь выполнить классификацию текста в текстовом корпусе. Для этого я решил выполнить word2vec с помощью gensim. Для этого у меня есть код ниже:

sentences = MySentences("./corpus_samples") # a memory-friendly iterator
model = gensim.models.Word2Vec(sentences, size=100, window=5, min_count=5, workers=4)

Мои предложения в основном представляют собой класс, который обрабатывает файл I/O.

class MySentences(object):
    def __init__(self, dirname):
        self.dirname = dirname

    def __iter__(self):
        for fname in os.listdir(self.dirname):
            for line in open(os.path.join(self.dirname, fname)):
                yield line.split()

Теперь мы можем получить словарь модели, которая была создана с помощью этих строк:

print(model.wv.vocab)

Результат которого ниже (пример):

t at 0x106f19438>, 'raining.': <gensim.models.keyedvectors.Vocab object at 0x106f19470>, 'fly': <gensim.models.keyedvectors.Vocab object at 0x106f194a8>, 'rain.': <gensim.models.keyedvectors.Vocab object at 0x106f194e0>, 'So…': <gensim.models.keyedvectors.Vocab object at 0x106f19518>, 'Ohhh,': <gensim.models.keyedvectors.Vocab object at 0x106f19550>, 'weird.': <gensim.models.keyedvectors.Vocab object at 0x106f19588>}

На данный момент словарь, который является словарем, содержит строку слов и объект <gensim.models.keyedvectors.Vocab object at 0x106f19588> или что-то подобное. Я хочу иметь возможность запрашивать индекс определенного слова. Чтобы сделать мои тренировочные данные такими:

w91874 w2300 w6 w25363 w6332 w11 w767 w297441 w12480 w256 w23270 w13482 w22236 w259 w11 w26959 w25 w1613 w25363 w111 __label__4531492575592394249
w17314 w5521 w7729 w767 w10147 w111 __label__1315009618498473661
w305 w6651 w3974 w1005 w54 w109 w110 w3974 w29 w25 w1513 w3645 w6 w111 __label__-400525901828896492
w30877 w72 w11 w2828 w141417 w77033 w10147 w111 __label__4970306416006110305
w3332 w1107 w4809 w1009 w327 w84792 w6 w922 w11 w2182 w79887 w1099 w111 __label__-3645735357732416904
w471 w14752 w1637 w12348 w72 w31330 w930 w11569 w863 w25 w1439 w72 w111 __label__-5932391056759866388
w8081 w5324 w91048 w875 w13449 w1733 w111 __label__3812457715228923422

Где wxxxx представляет индекс слова в словаре, а метка представляет класс.


Корпуса

Некоторые из решений, с которыми я экспериментировал, — это corpora утилита gensim:

corpora = gensim.corpora.dictionary.Dictionary(sentences, prune_at=2000000)
print(corpora)
print(getKey(corpora,'am'))

Это дает мне хороший словарь слов, но этот словарь корпусов отличается от словаря, созданного функцией word2vec, упомянутой выше.


person SDG    schedule 06.05.2018    source источник


Ответы (1)


TL;DR:

model.wv.vocab['my_word'].index

где 'my_word' — это слово, индекс которого вы хотите (например, 'hello', 'the' и т. д.).

Длинная история:

Это так, потому что gensim хранит объект Vocab в словаре model.wv.vocab.

Вот почему вы получаете такие результаты, как 'raining.': <gensim.models.keyedvectors.Vocab object at 0x106f19470>, когда пытаетесь распечатать словарь.

Объект Vocab инициализируется индексом следующим образом:

wv.vocab[word] = Vocab(count=v, index=len(wv.index2word))

и, таким образом, разрешает доступ к этому свойству.

Я не понимаю, почему вам нужно было бы представлять это так, но это должно сработать.

Более подробную информацию можно найти в их источнике.

person aneesh joshi    schedule 07.05.2018