最近在做一个问答系统,看了很多论文,主要学习作者是如何进行做问答的,大都是这个过程:
1、构建语料库;
2、训练词向量;
3、问题间和问答间的相似度对比;
4、在线搜索答案。
5、信息抽取;
6、生成答案。
网上大都是对wiki百科开源的中文语料进行训练的,很多作者都会对自己构建的语料进行向量模型计算,因此,我也需要进行训练,可供选择的两种算法一种是word2vec算法,一种是Glove算法,但是现在Glove算法还不能在windows系统上进行训练,因此,只能选择word2vec算法进行模型训练了。下面是训练自己中文语料步骤。
1、对语料进行分词、去除停用词
很明显,这两步对训练模型很重要,能提升很大的准确率,不多说,直接贴代码
def main():
logging.basicConfig(format='%(asctime)s : %(levelname)s : %(message)s', level=logging.INFO)
#以下是停用词,大家可以根据自己对停用词和具体的需求进行设置
stopword_set = ['的','得','地',',','。','?',':',';','、','!','@','#','¥','%','&'
, '*','(',')','-','=','+','[',']','{','}','1','2','3','4','5','6','7','8','9','0','~','`','$'
, '<','>','/','是']
#output接收处理好的文件
output = open('../resource/wiki_text.txt','w',encoding='utf-8')
#打开语料文本
with open('C:/Users\Administrator\Desktop/wikizh.txt','r',encoding='utf-8') as f:
for texts_num,line in enumerate(f):
line = line.strip('\n')
words = jieba.cut(line,cut_all=False)
for word in words:
if word not in stopword_set:
output.write(word + ' ')
output.write('\n')
if(texts_num + 1) % 10000 == 0:
logging.info('已完成前%d行的分词'%(texts_num + 1))
output.close()
2、对语料进行训练
网上有很多公开讲word2vec的使用方法的,在此,默认大家已经对算法有了基础的了解,如果实在不了解,可以联系我,我会进行讲解。代码如下:
if __name__ == '__main__':
program = os.path.basename(sys.argv[0])
logger = logging.getLogger(program)
logging.basicConfig(format='%(asctime)s: %(levelname)s: %(message)s')
logging.root.setLevel(level=logging.INFO)
logger.info("running %s" % ' '.join(sys.argv))
# check and process input arguments
if len(sys.argv) < 4:
print(globals()['__doc__'] % locals())
sys.exit(1)
inp, outp1, outp2 = sys.argv[1:4]
model = Word2Vec(LineSentence(inp), size=400, window=5, min_count=5,
workers=multiprocessing.cpu_count())
# trim unneeded model memory = use(much) less RAM
# model.init_sims(replace=True)
model.save(outp1)
model.wv.save_word2vec_format(outp2, binary=False)
python ***.py 训练语料路径 训练模型名称.model(以.model结尾) 训练词向量名称.vector(以.vevtor结尾)
以上的代码是使用word2vec训练自己的语料,但是如果想区得更好的效果,需要对算法进行深一步的改进,大家可以试试,如果能取得更好的效果,那么对接下来的问答效果也会产生很大的影响。