Gensim

gensim-word2vec - 简书
https://www.jianshu.com/p/0702495e21de

word2vec词向量中文语料处理(python gensim word2vec总结)_shuihupo的博客-CSDN博客_word2vec.linesentence
https://blog.csdn.net/shuihupo/article/details/85162237

gensim初级教程

Gensim简介

Gensim 是一款开源的第三方Python工具包,用于从原始的非结构化的文本中,无监督地学习到文本隐层的主题向量表达。它支持包括 TF-IDF,LSA,LDA,和word2vec 在内的多种主题模型算法,支持流式训练,并提供了诸如相似度计算,信息检索等一些常用任务的API接口。

基本概念包括:

  • 语料(Corpus)
  • 向量(Vector)
  • 稀疏向量(Sparse Vector)
  • 模型(Model)

训练 BOW 模型

texts=[['A','a'],['B','b']]
from gensim import corpora
dictionary = corpora.Dictionary(texts)
corpus = [dictionary.doc2bow(text) for text in texts]

迭代器省内存

class MyCorpus(object):
    def __iter__(self):
        # assume there's one document per line, tokens separated by whitespace
    	with open('mycorpus.txt') as f:
            for line in f:
                yield dictionary.doc2bow(line.lower().split())

训练 TFIDF 模型

对文本向量的变换是 Gensim 的核心。通过挖掘语料中隐藏的语义结构特征,我们最终可以变换出一个简洁高效的文本向量。

tfidf = models.TfidfModel(MyCorpus)
# 将任意一段语料( bow 向量的迭代器)转化成 TFIDF 向量(的迭代器)
tfidf[bow_corpus]

存储

prepath='./'
tfidf.save(prepath+"tfidf")
tfidf = models.TfidfModel.load(prepath+"tfidf")

文档相似度

LSI模型

# 构造LSI模型并将待检索的query和文本转化为LSI主题向量
# 转换之前的corpus和query均是BOW向量
lsi_model = models.LsiModel(corpus, id2word=dictionary, num_topics=2)
documents = lsi_model[corpus]
query_vec = lsi_model[query]

计算

index = similarities.MatrixSimilarity(documents)
# 省内存
index = similarities.Similarity(documents)
# 计算
 # return: an iterator of tuple (idx, sim)
sims = index[query_vec]

存储

index.save(prepath+'lsi')
index = similarities.MatrixSimilarity.load(prepath+'lsi')

命令行

把压缩包保存为稀疏矩阵

python -m gensim.scripts.make_wiki source_wiki.bz2 zhwiki
# 生成5个文件
-rw-r--r-- 1 chenbingjin data 172M  7月  1 12:10 zhwiki_bow.mm
-rw-r--r-- 1 chenbingjin data 1.3M  7月  1 12:10 zhwiki_bow.mm.index
-rw-r--r-- 1 chenbingjin data 333M  7月  1 12:16 zhwiki_tfidf.mm
-rw-r--r-- 1 chenbingjin data 1.3M  7月  1 12:16 zhwiki_tfidf.mm.index
-rw-r--r-- 1 chenbingjin data 1.9M  7月  1 12:10 zhwiki_wordids.txt

训练 LDA 模型

from gensim import corpora, models

# 语料导入
id2word = corpora.Dictionary.load_from_text('zhwiki_wordids.txt')
mm = corpora.MmCorpus('zhwiki_tfidf.mm')

# 模型训练,耗时28m
lda = models.ldamodel.LdaModel(corpus=mm, id2word=id2word, num_topics=100)

查看词分布

# 打印前20个topic的词分布
lda.print_topics(20)
# 打印id为20的topic的词分布
lda.print_topic(20)

存储

lda.save('zhwiki_lda.model')
lda = models.ldamodel.LdaModel.load('zhwiki_lda.model')

集成 word2vec

Gensim进阶

Gensim 封装了 word2vec 工具的扩展,就不使用 word2vec 包了。

读取语料库

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()

sentences = MySentences(prepath+'copas')

训练

w2v = gensim.models.Word2Vec(sentences)
# online training
model = gensim.models.Word2Vec.load('/tmp/mymodel')
model.train(more_sentences)

参数说明

class gensim.models.word2vec.Word2Vec(sentences=None, corpus_file=None, size=100, alpha=0.025, window=5, min_count=5,  max_vocab_size=None, sample=0.001, seed=1, workers=3, min_alpha=0.0001, sg=0, hs=0, negative=5, ns_exponent=0.75, cbow_mean=1, hashfxn=, iter=5, null_word=0, trim_rule=None, sorted_vocab=1, batch_words=10000, compute_loss=False, callbacks=(), max_final_vocab=None)
  • sentences (iterable of iterables, optional) – 供训练的句子,可以使用简单的列表,但是对于大语料库,建议直接从磁盘/网络流迭代传输句子。参阅word2vec模块中的BrownCorpus,Text8Corpus或LineSentence。
  • corpus_file (str, optional) – LineSentence格式的语料库文件路径。
  • size (int, optional) – word向量的维度。
  • window (int, optional) – 一个句子中当前单词和被预测单词的最大距离。
  • min_count (int, optional) – 忽略词频小于此值的单词。默认5。
  • workers (int, optional) – 训练模型时使用的线程数。
  • sg ({0, 1}, optional) – 模型的训练算法: 1: skip-gram; 0: CBOW.
  • hs ({0, 1}, optional) – 1: 采用hierarchical softmax训练模型; 0: 使用负采样,默认。
  • negative (int, optional) – > 0: 使用负采样,设置多个负采样(通常在5-20之间)。
  • ns_exponent (float, optional) – 负采样分布指数。1.0样本值与频率成正比,0.0样本所有单词均等,负值更多地采样低频词。
  • cbow_mean ({0, 1}, optional) – 0: 使用上下文单词向量的总和; 1: 使用均值,适用于使用CBOW。
  • alpha (float, optional) – 初始学习率。
  • min_alpha (float, optional) – 随着训练的进行,学习率线性下降到 in_alpha。
  • seed (int, optional) – 随机数发生器种子。
  • max_vocab_size (int, optional) – 词汇构建期间RAM的限制; 如果有更多的独特单词,则修剪不常见的单词。 每1000万个类型的字需要大约1GB的RAM。
  • max_final_vocab (int, optional) – 自动选择匹配的min_count将词汇限制为目标词汇大小。
  • sample (float, optional) – 高频词随机下采样的配置阈值,范围是(0,1e-5)。
  • hashfxn (function, optional) – 哈希函数用于随机初始化权重,以提高训练的可重复性。
  • iter (int, optional) – 迭代次数。
  • trim_rule (function, optional) – 词汇修剪规则,指定某些词语是否应保留在词汇表中,修剪掉或使用默认值处理。
  • sorted_vocab ({0, 1}, optional) – 如果为1,则在分配单词索引前按降序对词汇表进行排序。
  • batch_words (int, optional) – 每一个batch传递给线程单词的数量。
  • compute_loss (bool, optional) – 如果为True,则计算并存储可使用get_latest_training_loss()检索的损失值。
  • callbacks (iterable of CallbackAny2Vec, optional) – 在训练中特定阶段执行回调序列。

集成 doc2vec

Doc2vec 也是继承于 word2vec 的一个子类,用于计算长文本向量,与 word2vec 主要的区别是在对输入数据的预处理上。

Doc2vec 接受一个由 LabeledSentence 对象组成的迭代器作为其构造函数的输入参数。其中,LabeledSentence 是 Gensim 内建的一个类,它接受两个List作为其初始化的参数:word list 和 label list。

from gensim.models.doc2vec import LabeledSentence
sentence = LabeledSentence(words=[u'some', u'words', u'here'], tags=[u'SENT_1'])

将训练文本转换

class LabeledLineSentence(object):
    def __init__(self, filename):
        self.filename = filename
        
    def __iter__(self):
        for uid, line in enumerate(open(filename)):
            yield LabeledSentence(words=line.split(), labels=['SENT_%s' % uid])

训练

同时训练了 word 和 sentence label 的语义向量。

如果我们只想训练 label 向量,可以传入参数train_words=False以固定词向量参数。参考API文档

from gensim.models import Doc2Vec
d2v = Doc2Vec(dm=1, size=100, window=5, negative=5, hs=0, min_count=2, workers=4)

你可能感兴趣的:(Gensim)