美文网首页我爱编程
gensim训练word2vec语料库初探

gensim训练word2vec语料库初探

作者: hohoha | 来源:发表于2018-03-30 17:46 被阅读0次

    NLP技术已经非常成熟,各行各业都需要有专门的NLP技术。网上介绍gensim的材料很多,有几种类型:

    • 翻译,摘录的非原创,采用英文维基wiki语料库的
    • 中文训练,但是采用的现成语料库,比如中文维基,搜狐新闻等通用语料。
      真正动起手来,还是困难重重,下面我结合实践来介绍下怎么训练专业语料库。

    为什么需要专业语料库?

    专业语料库能够识别通用语料库中不突出的专业词汇。
    能够高效体现专业领域的专业信息相关度,用于问答系统的归一化,对话系统的专家库等方面。

    技术路线选择

    word2vec的实现各个语言版本都有,语料库的训练应考虑模型通用性,便于其他语言调用。Word2Vec 究竟选择Tensorflow还是 gensim这篇文章中介绍了我的观点。

    流程整体介绍

    1.语料准备,语料从哪来?能做什么用?这是基础,不在本文讲述。最近看到有人把电影字幕转成对话语料,实在让人大跌眼镜。
    2.语料过滤:去掉非中文字符,去掉空格,一句话一行,中文分词,当然还可以自定义词典。最后的list是这样的 ['eps', 'user', 'interface', 'system']。 剩下的步骤网上到处都是,这里不多讲了。
    3.开始训练
    4.及时保存模型
    5.模型加载使用
    6.迭代模型,对于增量部分重复。

    硬件平台

    word2vec 的训练和GPU无关,是CPU计算密集型应用。
    经过实际的对比,采用阿里云2vcpu的机器和双路16核服务器的速度相差10倍。推荐采用物理主机。

    关键代码

    -模型的重用
    'model = KeyedVectors.load(MODEL_NAME)
    'model.train(sentens, total_examples=model.corpus_count, epochs=model.iter)
    -语料从数据库中直接读取,采用迭代器降低内存占用
    '''
    class sentences:
    def iter(self):
    texts_set = set()
    docs=getDBCorupus()
    i=0
    if docs is None:
    exit
    for doc in docs:
    sentence=filterCorupus(doc)
    i+=1
    yield sentence

    word2vec = Word2Vec(sentences(), size=256, window=5, min_count=5, sg=1, hs=1, iter=10, workers=25)
    '''

    速度优化

    -考虑重复训练与增量训练的可能,所以原始数据仍然保存在数据库中,依靠数据库来识别增量部分。
    -为了避免数据读取后读写磁盘降低效率,直接通过迭代器模式把海量数据放在内存中。网上的例子大都是直接读取语料文件。

    踩过的坑

    bug1现象:保存的model 只有80k, log显示:collected 20 word types from a corpus of 371948 raw words and 10 sentences.
    原因:语料输入有问题,导致word types 太少。
    解决办法: print 少量语料,检查结构

    相关文章

      网友评论

        本文标题:gensim训练word2vec语料库初探

        本文链接:https://www.haomeiwen.com/subject/bnvicftx.html