第一部分 词法
一、说明
Gensim是一种Python库,用于从文档集合中提取语义主题、建立文档相似性模型和进行向量空间建模。它提供了一系列用于处理文本数据的算法和工具,包括主题建模、相似性计算、文本分类、聚类等。在人工智能和自然语言处理领域,Gensim是一个流行的工具,用于处理大量的文本和语料库。
该模块使用高度优化的 C 例程、数据流和 Pythonic 接口来实现 word2vec 系列算法。
word2vec 算法包括skip-gram 和 CBOW 模型,使用分层 softmax 或负采样:Tomas Mikolov 等人:Efficient Estimation of Word Representations in Vector Space,Tomas Mikolov 等人:Distributed Representations of Words and Phrases and their Compositionality。
二、其他嵌入
在 Gensim 中训练词向量的方法有很多,而不仅仅是 Word2Vec。另请参见
- Doc2Vec:通过分布式内存和分布式词袋模型学习段落和文档嵌入
(models.doc2vec – Doc2vec paragraph embeddings — gensim (radimrehurek.com))
- FastText:该模块允许从训练语料库中训练词嵌入,并具有获取词汇表外单词的词向量的附加功能。
(models.fasttext – FastText model — gensim (radimrehurek.com))。
训练算法最初是从 C 包 https://code.google.com/p/word2vec/ 移植的,多年来通过附加功能和优化进行了扩展。
有关 Gensim word2vec 的教程以及在 GoogleNews 上训练的交互式网络应用程序,请访问 https://rare-technologies.com/word2vec-tutorial/。
三、使用示例
初始化模型,例如:
from gensim.test.utils import common_texts
from gensim.models import Word2Vec
>>>
model = Word2Vec(sentences=common_texts, vector_size=100, window=5, min_count=1, workers=4)
model.save("word2vec.model")
训练是流式传输的,因此“句子”可以是可迭代的,可以即时从磁盘或网络读取输入数据,而无需将整个语料库加载到 RAM 中。
请注意,可迭代的句子必须是可重新启动的(而不仅仅是生成器),以允许算法多次流式传输数据集。有关流式可迭代的一些示例,请参阅 BrownCorpus、Text8Corpus 或 LineSentence。
如果保存模型,您可以稍后继续训练它:
model = Word2Vec.load("word2vec.model")
model.train([["hello", "world"]], total_examples=1, epochs=1)
(0, 2)
训练好的词向量存储在 KeyedVectors 实例中,如 model.wv:
vector = model.wv['computer'] # get numpy vector of a word
sims = model.wv.most_similar('computer', topn=10) # get other similar words
将训练好的向量分离到 KeyedVector 中的原因是,如果您不再需要完整的模型状态(不需要继续训练),则可以丢弃其状态,只保留向量及其键。
这会产生一个更小、更快的对象,可以进行映射以实现闪电般的快速加载并在进程之间共享 RAM 中的向量:
from gensim.models import KeyedVectors
>>>
# Store just the words + their trained embeddings.
word_vectors = model.wv
word_vectors.save("word2vec.wordvectors")
>>>
# Load back with memory-mapping = read-only, shared across processes.
wv = KeyedVectors.load("word2vec.wordvectors", mmap='r')
>>>
vector = wv['computer'] # Get numpy vector of a word
Gensim 还可以加载“word2vec C 格式”的词向量,作为 KeyedVectors 实例:
from gensim.test.utils import datapath
>>>
# Load a word2vec model stored in the C *text* format.
wv_from_text = KeyedVectors.load_word2vec_format(datapath('word2vec_pre_kv_c'), binary=False)
# Load a word2vec model stored in the C *binary* format.
wv_from_bin = KeyedVectors.load_word2vec_format(datapath("euclidean_vectors.bin"), binary=True)
由于隐藏权重、词汇频率和二叉树缺失,无法继续训练从 C 格式加载的向量。要继续训练,您需要完整的 Word2Vec 对象状态(由 save() 存储),而不仅仅是 KeyedVector。
您可以使用经过训练的模型执行各种 NLP 任务。一些操作已经内置 - 请参阅 gensim.models.keyedvectors。
如果您完成了模型的训练(即不再更新,仅查询),您可以切换到 KeyedVectors 实例:
word_vectors = model.wv
del model
修剪不需要的模型状态 = 使用更少的 RAM 并允许快速加载和内存共享 (mmap)。
四、多词 Ngram 的嵌入
有一个 gensim.models.phrases 模块,可让您使用搭配统计自动检测长于一个单词的短语。使用短语,您可以学习 word2vec 模型,其中“单词”实际上是多词表达式,例如 new_york_times 或 Financial_crisis:
from gensim.models import Phrases
>>>
# Train a bigram detector.
bigram_transformer = Phrases(common_texts)
>>>
# Apply the trained MWE detector to a corpus, using the result to train a Word2vec model.
model = Word2Vec(bigram_transformer[common_texts], min_count=1)
五、预训练模型
Gensim 在 Gensim 数据存储库中附带了几个已经预先训练的模型:
import gensim.downloader
# Show all available models in gensim-data
print(list(gensim.downloader.info()['models'].keys()))
['fasttext-wiki-news-subwords-300','conceptnet-numberbatch-17-06-300','word2vec-ruscorpora-300','word2vec-google-news-300','glove-wiki-gigaword-50','glove-wiki-gigaword-100','glove-wiki-gigaword-200','glove-wiki-gigaword-300','glove-twitter-25','glove-twitter-50','glove-twitter-100','glove-twitter-200','__testing_word2vec-matrix-synopsis']
>>>
# Download the "glove-twitter-25" embeddings
glove_vectors = gensim.downloader.load('glove-twitter-25')
>>>
# Use the downloaded vectors as usual:
glove_vectors.most_similar('twitter')
[('facebook', 0.948005199432373),('tweet', 0.9403423070907593),('fb', 0.9342358708381653),('instagram', 0.9104824066162109),('chat', 0.8964964747428894),('hashtag', 0.8885937333106995),('tweets', 0.8878158330917358),('tl', 0.8778461217880249),('link', 0.8778210878372192),('internet', 0.8753897547721863)]
(系列文章后续: ...... )