gensim训练word2vec语料库初探

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)

速度优化

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

踩过的坑

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

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值