gensim bm25模型保存与加载

gensim bm25模型保存与加载


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可以保存python object
刚好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)
## 算法原理程序使用 BM25算法原理参见我的博文:[【NLP】非监督文本匹配算法——BM25] 测试程序: ```python bm25 = BM25() result = bm25.cal_similarity("自然语言处理并不是一般地研究自然语言") for line, score in result: print(line, score) ``` 测试结果如下: ```python 自然语言处理是计算机科学领域人工智能领域中的一个重要方向。 1.012567843290477 它研究能实现人计算机之间用自然语言进行有效通信的各种理论和方法。 2.0911221271793545 自然语言处理是一门融语言学、计算机科学、数学于一体的科学。 1.012567843290477 因此,这一领域的研究将涉及自然语言,即人们日常使用的语言, 2.2068046420905443 所以它语言学的研究有着密切的联系,但又有重要的区别。 1.4616618736274032 自然语言处理并不是一般地研究自然语言, 3.2072055608059036 而在于研制能有效地实现自然语言通信的计算机系统, 1.201522188129132 特别是其中的软件系统。因而它是计算机科学的一部分。 0 在信息搜索中,我们做的第一步就是检索。 0 再延展一下,搜索这项功能在我们生活中也是太多太多。 0 大众一点就是搜索引擎,商品搜索等,在问题系统中可以匹配相似的问题,然后返回对应答案等。 0 文本匹配包括监督学习方法以及非监督学习方法。 0 或者分为传统方法和深度学习方法。 0 BM25 在 20 世纪 70 年代到 80 年代被提出,到目前为止已经过去二三十年了,但是这个算法依然在很多信息检索的任务中表现优异,是很多工程师首选的算法之一。 0 有时候全称是 Okapi BM25,这里的“BM”是“最佳匹配”(Best Match)的简称。 0 那么,当通过使用不同的语素分析方法,语素权重判定方法以及语素文档的相关性判定方法,可以衍生很多不同的搜索相关性计算方法,灵活性也比较大。 0 ``` -------- 该资源内项目源码是个人的毕设,代码都测试ok,都是运行成功后才上传资源,答辩评审平均分达到96分,放心下载使用! <项目介绍> 1、该资源内项目代码都经过测试运行成功,功能ok的情况下才上传的,请放心下载使用! 2、本项目适合计算机相关专业(如计科、人工智能、通信工程、自动化、电子信息等)的在校学生、老师或者企业员工下载学习,也适合小白学习进阶,当然也可作为毕设项目、课程设计、作业、项目初期立项演示等。 3、如果基础还行,也可在此代码基础上进行修改,以实现其他功能,也可用于毕设、课设、作业等。 下载后请首先打开README.md文件(如有),仅供学习参考, 切勿用于商业用途。 --------
### Gensim大型语言模型结合使用的方法 #### 介绍 Gensim 是一种强大的自然语言处理工具包,主要用于主题建模和文档相似度分析。当大型语言模型(LLMs)相结合时,可以显著提升文本理解和生成的能力。通过集成这两种技术,可以在诸如语义检索、对话系统增强等方面获得更佳的效果。 #### 安装依赖项 为了使 Gensim 和 LLMs 协同工作,首先需要安装必要的 Python 库: ```bash pip install gensim transformers torch ``` 这里 `transformers` 来自 Hugging Face, 提供了多种预训练的语言模型接口;而 PyTorch (`torch`) 则是支持这些模型运行所需的深度学习框架之一。 #### 加载预训练模型并准备数据 接下来展示一段简单的代码片段来加载一个预训练好的 BERT 模型,并将其应用于由 Gensim 准备的数据上: ```python from gensim.test.utils import common_texts from gensim.models.doc2vec import Doc2Vec, TaggedDocument from transformers import BertTokenizer, BertModel import torch # 使用 Gensim 的常见文本作为示例输入 documents = [TaggedDocument(doc, [i]) for i, doc in enumerate(common_texts)] # 初始化Doc2Vec模型 doc_model = Doc2Vec(vector_size=768, min_count=1, epochs=40) # 构建词汇表 doc_model.build_vocab(documents) # 训练Doc2Vec模型 doc_model.train(documents, total_examples=doc_model.corpus_count, epochs=doc_model.epochs) # 加载BERT tokenizer和model tokenizer = BertTokenizer.from_pretrained('bert-base-uncased') bert_model = BertModel.from_pretrained('bert-base-uncased') def encode_text(text): inputs = tokenizer(text, return_tensors="pt", padding=True, truncation=True) outputs = bert_model(**inputs)[0][:, 0, :] # 取CLS token的输出向量 return outputs.detach().numpy() for document in documents[:5]: text = ' '.join(document.words) embedding = encode_text(text) print(f"Text: {text}\nEmbedding shape: {embedding.shape}") ``` 上述过程展示了如何利用 Gensim 对原始文本进行初步处理后传递给基于 Transformer 的编码器获取更深一层特征表示[^3]。 #### 实际应用场景中的整合方式 除了直接嵌入之外,在某些特定情况下还可以考虑如下几种组合方案: - **混合架构**:先用 Gensim 抽取浅层特征再送入深层神经网络进一步加工; - **迁移学习**:借助于已经过良好调优的大规模参数初始化较小规模的新任务专用版本; - **联合微调**:同时调整两个组件内部权重以优化整体性能表现。 #### 总结 综上所述,虽然两者来自不同的背景和技术栈,但是合理搭配之后确实能带来意想不到的好处。值得注意的是,在实际开发过程中还需要关注具体业务逻辑以及硬件条件等因素的影响[^4]。
评论 10
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值