1、Gensim
官网: gensim: Topic modelling for humans
Gensim是一款开源的第三方Python工具包,用于从原始的非结构化的文本中,无监督地学习到文本隐层的主题向量表达。支持包括TF-IDF, LSA, LDA, Word2Vec在内的多种主题模型算法,支持分布式训练,提供了相似度计算、信息检索等一些常用的API接口。
上述算法是无监督的,意味着不需要人工输入,只需要一个纯文本语料库。
特点
- 内存独立性:任务时候都不需要整个训练语料库全部在RAM中(可以处理大型的WEB级语料库)
- 内存共享:经过训练的模型可以保存到硬盘并通过mmap加载回来。多个进程可以共享相同的数据,从而减少RAM占用空间。
- 包含几种流行的向量空间算法的实现,如Word2Vec, Doc2Vec, FastText, TF-IDF,潜在语义分析(LSI, LSA等),LDA等。
- 几种流程的数据格式的I/O 包装器和读取器。
- 对文档进行文本语义的相似性查询。
设计目标
- 简单的接口和API
- 内存独立性,所有中间步骤和算法以流式方式运行,一次访问一个文档。
2、保存与加载
注意区分:保存与加载模型,还是保存与加载词向量文件
- 模型的保存与加载:保留了模型训练的所有状态信息,如权重文件,二叉树和词汇频率等,加载后可以进行再/追加训练
- 词向量文件的保存与加载:丢弃了模型训练的状态信息,加载后不可以进行再/追加训练
具体的API可参考:gensim: API Reference
2.1 模型的保存与加载
保存模型
使用model.save()方法, 以该方式保存的模型可以在读取后进行再训练(追加训练),因为保存了训练的全部信息
from gensim.models import Word2Vec # 训练Word2Vec向量 model = Word2Vec(texts, size=100, window=5, min_count=1, workers=4) # 保存模型 model.save("word2vec.model") 复制代码
如果需要继续训练,需要完整的Word2Vec对象状态,由save()存储,而不仅仅是KeyedVectors。
加载模型
使用load方式加载模型,可以进行再训练
from gensim.models import Word2Vec model = Word2Vec.load("word2vec.model") model.train([["hello", "world"]], total_examples=1, epochs=1) 复制代码
训练后的词向量可以使用model.wv保存在一个KeyedVectors实例中,如下:
vector = model.wv['computer'] # numpy vector of a word 复制代码
如果已经完成模型的训练(即不再进行模型的更新,仅仅是查询),则可切换到KeyedVectors实例:
word_vectors = model.wv del model 复制代码
2.2 词向量文件的加载与保存
保存训练好的词向量文件
保存
- 使用mdoel.wv.save以KededVectors实例的形式保存词向量文件,以该方式保存的模型丢失了完整的模型状态,无法再训练,保存的对象更小更快。
model.wv.save("model.wv") 复制代码
- 使用wv.save_word2vec_format保存词向量文件(之前是model.save_word2vec_format(),已弃用)
model.wv.save_word2vec_format("model.bin", binary=True) 复制代码
加载
- 使用KeyedVectors.load加载词向量文件,保存在KeyedVectors实例中(适用于不需要完整的模型状态,不再进行训练)
from gensim.models import KeyedVectors wv = KeyedVectors.load("model.wv", mmap='r') vector = wv['computer'] # numpy vector of a word 复制代码
- 以word2vec C format加载词向量,保存在KeyedVectors实例中 使用KeyedVector.load_word2vec_format()可以加载两种格式的词向量文件:C 文本格式和C bin格式(二进制)
from gensim.models import KeyedVectors wv_from_text = KeyedVectors.load_word2vec_format("model_kv_c", binary=False) # C text format wv_from_bin = KeyedVectors.load_word2vec_format("model_kv.bin", binary=True) # C bin format 复制代码
由于权重文件,二叉树和词汇频率的缺失,无法从C格式加载的向量继续训练。
3、keyedVectors模块
models.keyedVectors模块实现了词向量及其相似性查找。训练好的此线路与训练方式无关,因此他们可以由独立结构表示。
该结构称为KeyedVectors,实质上是实体和向量之间的映射。每个实体由其字符串id标识,因此是字符串和1维数组之间的映射关系。 实体通常对应一个单词,因此是将单词映射到一维向量,对于某些某些,值也可以对应一篇文档,一个图像或其他。
KeyedVectors和完整模型的区别在于无法进一步的训练,及更小的RAM占用,更简单的接口。
3.1 如何获取词向量
训练一个完整的模型,然后获取它的model.wv属性,该属性包含独立的keyed vectors。如,使用word2vec训练向量。
from gensim.test.utils import common_texts from gensim.models import Word2Vec model = Word2Vec(common_texts, size=100, window=5, min_count=1, workers=4) word_vectors = model.wv 复制代码
从磁盘加载词向量文件
from gensim.models import KeyedVectors word_vectors.save("vectors_wv") word_vectors = KeyedVectors.load("vectors_wv", mmap='r') 复制代码
从磁盘加载原始Google’s word2vec C格式的词向量文件作为KeyedVectors实例
wv_from_text = KeyedVectors.load_word2vec_format(datapath('word2vec_pre_kv_c'), binary=False) # C text format wv_from_bin = KeyedVectors.load_word2vec_format(datapath('word2vec_vector.bin'), binary=True) # C text format 复制代码
3.2 使用这些词向量可以做什么?
可以执行各种NLP语法/语义的单词任务。
>>> import gensim.downloader as api >>> >>> word_vectors = api.load("glove-wiki-gigaword-100") # load pre-trained word-vectors from gensim-data >>> >>> result = word_vectors.most_similar(positive=['woman', 'king'], negative=['man']) >>> print("{}: {:.4f}".format(*result[0])) queen: 0.7699 >>> result = word_vectors.most_similar_cosmul(positive=['woman', 'king'], negative=['man']) >>> print("{}: {:.4f}".format(*result[0])) queen: 0.8965 >>> >>> print(word_vectors.doesnt_match("breakfast cereal dinner lunch".split())) cereal # 两个单词的相似度 >>> similarity = word_vectors.similarity('woman', 'man') >>> similarity > 0.8 True # 与指定单词最相近的词列表 >>> result = word_vectors.similar_by_word("cat") >>> print("{}: {:.4f}".format(*result[0])) dog: 0.8798 >>> >>> sentence_obama = 'Obama speaks to the media in Illinois'.lower().split() >>> sentence_president = 'The president greets the press in Chicago'.lower().split() # 两句话的WMD距离 >>> similarity = word_vectors.wmdistance(sentence_obama, sentence_president) >>> print("{:.4f}".format(similarity)) 3.4893 # 两个单词的距离 >>> distance = word_vectors.distance("media", "media") >>> print("{:.1f}".format(distance)) 0.0 # 两个句子相似度 >>> sim = word_vectors.n_similarity(['sushi', 'shop'], ['japanese', 'restaurant']) >>> print("{:.4f}".format(sim)) 0.7067 # 词向量 >>> vector = word_vectors['computer'] # numpy vector of a word >>> vector.shape (100,) >>> >>> vector = word_vectors.wv.word_vec('office', use_norm=True) >>> vector.shape (100,) 复制代码
参考文献:K码农-//kmanong.top/kmn/qxw/form/home?top_cate=28