相似词:用gensim实现word2vec和fasttext

  最近在看2019斯坦福NLP公开课,突然萌生一个想法,准备把课程所有涉及到的知识点,都用python实现一遍。由于第一课讲到word2vec,遂写下用gensim实现word2vec和fasttext的方法。其实gensim库官方文档已经介绍的很详细,想追根溯源的同学可参考gensim官方文档,本博文只记录具体的实现路径。

1.导入python所需要的包

from gensim.models import fasttext
from gensim.models import word2vec
import pandas as pd
import logging
import jieba

其中gensim和jieba需要单独安装,使用anaconda的同学可以参考Anaconda安装其他第三方库

2.数据导入与预处理

data = pd.read_csv("d:\\test.csv",sep="\t",encoding='gbk',header=None)
sentance  = list(data[0])
# 对每行句子进行中文分词
def segment_sen(sen):
    sen_list = []
    try:
    	# 可以考虑添加业务词库、去停用词,具体参考jieba官方文档
        sen_list = jieba.lcut(sen) 
    except:
            pass
    return sen_list   
# 将数据变成gensim中,word2wec函数的数据格式
sens_list = [segment_sen(i) for i in sentance]

数据集test.csv下载地址

3.训练word2vec模型

logging.basicConfig(format='%(asctime)s : %(levelname)s : %(message)s', level=logging.INFO)
model = word2vec.Word2Vec(sens_list,min_count=1,iter=20)
model.save("word2vec.model")

4.调用word2vec模型

model.wv.most_similar("手续费")

5.fasttext模型训练及调用
word2vec和fasttext算法最大的差异在,前者无法识别模型中未训练过的词,而后者可以解决未登录词的问题。

# 训练fasttext模型
logging.basicConfig(format='%(asctime)s : %(levelname)s : %(message)s', level=logging.INFO)
model1 = fasttext.FastText(sens_list,min_count=1,iter=20)
model1.save("fast_text.model")

# 调用fasttext模型
model1.wv.most_similar("账单分期")

附1.Gensim模型参数及再训练

# Gensim模型参数调整
model = gensim.models.Word2Vec(sentences,	#输入语料
                     window=2,	#窗口大小
                     size=100,	#维度
                     alpha=0.03,	#学习率
                     negative=20,	#负采样数量
                     min_count=2,	#最小出现次数
                     workers=10)	#进程数量
# Gensim模型再训练
new_model = gensim.models.Word2Vec.load('mymodel')
new_model.train(more_sentences)

参考代码:Gensim模型参数及再训练

附2.模型调优思路
1.保证训练数据集的量足够大,且文本中没有过多错误的词汇,例如手续费被翻译成水费;
2.数据预处理分词阶段,需要整理好对应的业务词库和停用词库;
3.若没有大量数据或高性能GUP去构建模型,可考虑已训练好的词向量模型,例如腾讯词向量模型

分类: 自然语言处理