开篇
最近在做相似度检测的项目,由于是公司的实战项目,所以处理的都是中文,自己也算个小白,所以写一个入门的教程吧。这是第一篇,中文词向量的训练。
gensim训练词向量
首先我们为什么要自己训练词向量呢?为什么不直接使用别人训练好的词向量呢。原因也很简单,当我们处理特定领域的数据的时候,很多领域词在其他公共语料里面是没有的,这就必须要求我们能够训练自己的词向量,来处理特定领域的数据。
数据来源于蚂蚁金服的人工智能比赛,数据不是公开的,所以我不放出数据,有兴趣的可以去参加比赛。
数据大概是这样,下图所示是没有经过分词处理的
当然这样的数据是不能直接训练词向量的,首先我们要做的还是分词,这边采用的哈工大开源的pyltp,为了保证有些业务新词不会被错分,我还加如了业务新词词典lexicon,里面包括了花呗之类的词,因为pyltp会把花呗分词为花、呗。
下面放出我分词的函数代码,大家有什么疑问可以在我的博客下面留言
1
2
3
4
5
6
7
8
9
10
11
12
13 1def word_cut(sentence):
2 LTP_DATA_DIR = 'C:\\Users\\d84105613\\ltp_data'
3 cws_model_path = os.path.join(LTP_DATA_DIR, 'cws.model')
4 segmentor = Segmentor() # 初始化实例
5 segmentor.load_with_lexicon(cws_model_path, 'lexicon') # 加载模型
6 words = segmentor.segment(sentence)
7 segmentor.release()
8 words = list(words)
9 print(len(set(words)))
10 words = [c for c in words if c not in punctuation]
11 return ' '.join(words)
12
13
下面是我处理完的数据
到这里,我们就可以来训练我们的词向量了,我们直接使用gensim来训练,简单快捷。
1
2
3
4
5 1def word2vecTrain(text):
2 model = Word2Vec(LineSentence(text), size=300, window=5, min_count=5, workers=multiprocessing.cpu_count())
3 model.save('Word2VecModel.m')
4 model.wv.save_word2vec_format('Word2VecModel.vector', binary=False)
5
这里有两篇比较好的参考博客,关于训练词向量的
gensim 词向量
gensim 词向量
加载词向量
1
2 1model = KeyedVectors.load_word2vec_format('Word2VecModel.vector',binary=False)
2