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 少量语料,检查结构