20210719修改:
python version:3.6.12
gensim version:3.8.3
使用bm25模型计算相似度的时候,发现用gensim.summarization.bm25.BM25
构建的模型,没有像TfidfModel
或者LsiModel
那样直接的model.save()方法保存模型,如果每次都重新训练又比较花时间,百度了一下没有直接的教程资源,所以写在这里记录备查。
主要使用的是pickle
包,关于pickle
的详情不在这里介绍。
通过pickle模块的序列化操作我们能够将程序中运行的对象信息保存到文件中去,永久存储;
通过pickle模块的反序列化操作,我们能够从文件中创建上一次程序保存的对象。
pickle
可以保存pythonobject
刚好gensim.summarization.bm25.BM25
构建的模型是一个object
:
<gensim.summarization.bm25.BM25 object at 0x7fc8ce935240>
<class ‘gensim.summarization.bm25.BM25’>
所以使用pickle
进行保存
1. 模型保存
from gensim.summarization import bm25
import pickle
def bm25save(obj, fpath):
f = open(fpath, 'wb')
pickle.dump(obj, f)
f.close()
if __name__ == '__main__':
# ...
bm25Model, docid2index = build_bm25(corpus)
bm25save(bm25Model, 'yourPath/testbm25.pkl')
2. 模型加载
from gensim.summarization import bm25
import pickle
def bm25load(fpath):
f = open(fpath, 'rb')
bm25Model = pickle.load(f)
f.close()
return bm25Model
if __name__ == '__main__':
bm25Model = bm25load('yourPath/testbm25.pkl')
import jieba
s1 = '我爱北京天安门'
s2 = '我爱上了,北京的天安门'
token1 = ' '.join(list(jieba.cut(s1)))
token2 = ' '.join(list(jieba.cut(s2)))
sim = cal_bm25_sim(bm25Modelnew, token1, token2)
print(sim)