###Полезные ссылки:
- http://radimrehurek.com/2014/02/word2vec-tutorial
- https://radimrehurek.com/gensim/models/word2vec.html
- http://arxiv.org/pdf/1301.3781.pdf - как всё работает
Сам по себе модуль хорошо документирован.
###Описание Word2Vec - штука, принимающая на вход массив из предложений(являющихся массивом из слов) и возвращающая некий объект. Этот некий объект реализует интерфейс dict, где ключами являются слова. И несколько методов, о которых расскажу дальше.
Не факт, что установится быстрая версия:
pip install gensim
Узнать что установлена быстрая версия(как её установить так и не разобрался):
from gensim.models import word2vec
if word2vec.FAST_VERSION == 1:
print 'Fast version installed'
else:
print 'Slow version installed'
###Использование
>>> from gensim.models.word2vec import Word2Vec
>>> sentences = [['first', 'sentence'], ['second', 'sentence']]
>>> w2v = Word2Vec(sentences, min_count=0, size=5) # сразу обучится на данных предложениях
>>>
>>> # выдаст вектор данного слова
>>> print w2v['sentence']
[ 0.02182626 -0.03014402 -0.06414173 -0.01990378 0.00629869]
>>>
>>> # выдаст на сколько схожи данные слова.
>>> print w2v.similarity('first', 'second')
-0.0315916442588
>>>
>>> # выдаст на сколько схожи данные множества слов.
>>> print w2v.n_similarity(['first', 'second'], ['sentence'])
0.286853689395
>>>
>>> # выдаст топ наиболее схожих слов (похоже как-то используя косинусную меру)
>>> print w2v.most_similar(positive=['first'], negative=['second'], topn=3) # topn=10 по умолчанию
[('sentence', -0.2769932746887207)]
>>>
>>> # выдаст топ наиболее схожих слов но сосчитанных как-то по другому
>>> print w2v.most_similar_cosmul(positive=['first'], negative=['second'])
[('sentence', 0.7118682861328125)]
>>>
>>> # выдаст самое лишнее слово
>>> print w2v.doesnt_match(['first', 'second', 'sentence'])
first
Так можно распознавать биграммы:
bigram_transformer = gensim.models.Phrases(sentences)
model = Word2Vec(bigram_transformed[sentences], size=100, ...)
Модель можно дообучить:
w2v.build_vocab(sentences) # расширить словарь
w2v.train(new_sentences) # дообучить на новых предложениях
Модель можно сохранить и восстановить:
w2v.save('filename')
w2v = Word2Vec.load('filename')
Так же модель можно вытащить из файла сишного формата word2vec. Например, чтоб использовать словари с ресурса http://ling.go.mail.ru/misc/dialogue_2015.html, нужно использовать binary=True
w2v = Word2Vec.load_word2vec_format('/path/to/word2vec_c_format_file_name', binary=True)
И сохранить в этом же формате:
w2v.save_word2vec_format('/path/to/new_word2vec_c_format_file_name', binary=True)
#####Некоторые параметры конструктора Word2Vec:
Параметр | Зачем нужен |
---|---|
min_count | Слова, встретившиеся меньше min_count раз, в словарь не добавятся. |
sg | Алгоритм обучения: если sg=1, то используется skip-gram, иначе - cbow. skip-gram более точный, а cbow более быстрый. |
size | Размерность вектора, в который преобразуется слово. |
workers | Кол-во процессов, чтоб распараллелить обучение. |
max_vocab_size | Максимальный размер словаря. Если слов больше, наименее встречаемые слова в словарь не попадут. |
Для получения массива предложений существует gensim.models.word2vec.LineSentence. Инициализируется с помощью имени файла или объекта файла с текстом. Строки считает предложениями. Предложения разбивает на слова по пробелам.
w2v = Word2Vec(LineSentence('/path/to/file'))
В качестве токенизатора можно использовать text_tokenizer. Использование:
from text_tokenizer import text_tokenizer
w2v = Word2Vec(text_tokenizer('First sentence. Second sentence.'))