算法中最主要的是用到了gensim.models.doc2vec将信息存储成词典进行建模并将信息文件转存到数据库中供其他代码使用。因为注释写的比较清晰。所以逻辑不再赘述,直接上代码看看就知道啦~因为在前面的算法中已经对数据库操作类进行了描述,这里就不再黏贴出来,有需要的亲可以翻看以前的文章参考即可~算法代码如下:

import tensorflow as tf
import os
import gensim
import re
import jieba.posseg as pseg
from gensim.models.doc2vec import Doc2Vecfrom loadData import loadDatatf.flags.DEFINE_string("base_dir", ".", "files base_dir")
tf.flags.DEFINE_string("train_dir", ".\\train", "trainning files base_dir")
tf.flags.DEFINE_string("test_dir", ".\\test", "test files base_dir")
tf.flags.DEFINE_string("model_dir", "./doc2vecmodel", "Model directory from training run")
tf.flags.DEFINE_integer('vector_dim', 500,'dimensionality of characters')
tf.flags.DEFINE_integer('epoch_num', 70,'the number of epoch')
tf.flags.DEFINE_integer('min_count', 1,'ignore the words which freq lower than min_count')
tf.flags.DEFINE_integer('window', 3,'the max distance between relative content')
tf.flags.DEFINE_integer('negative', 5,'the number of negative that we can accept')
tf.flags.DEFINE_integer('workers', 4,'the module number of worker')
FLAGS = tf.flags.FLAGS
FLAGS.is_parsed()
print("\nParameters:")
for attr, value in sorted(FLAGS.__flags.items()):print("{}={}".format(attr.upper(), value))
print("")class Singleton(object):def __new__(cls, *args, **kw):if not hasattr(cls, '_instance'):orig = super(Singleton, cls)cls._instance = orig.__new__(cls, *args, **kw)return cls._instanceclass retrieve(Singleton):doc_dict = {}  # 由编号映射文章ID的字典doc_dict的key和value 分别为编号(数据库的id)和对应文章IDmodel_dm = None #生成的模型def __init__(self):self.load_doc_index()# 第一步,训练模型前,先将语料整理成规定的形式,这里用到TaggedDocument模型def get_trainset(self):x_train = []list_name = os.listdir(FLAGS.train_dir)  # 用于训练模型的语料先进行预处理TaggededDocument = gensim.models.doc2vec.TaggedDocument  # 输入输出内容都为 词袋 + tag列表, 作用是记录每一篇文章的大致内容,并给该文章编号load = loadData()for name in list_name:user_file = os.path.join(FLAGS.train_dir, name)# 语料预处理if not os.path.isdir(user_file):data = open(user_file,mode='rb').read()item = self.getInfoDetail(data.decode('utf-8'))index = self.getIndexFromDoct(name.strip(".txt"))#判断文章是否已经在字典中,如果在字典中默认已经存过数据库,不再执行数据库操作if index == -1:index = load.insertInfo(item)# 每一篇文章需要一个对应的编号self.doc_dict[index] = name.strip(".txt")line = ''if '公司名称' in item:line = line + item['公司名称']if '经营范围' in item:line = line + '/t' + item['经营范围']if line == '':line = data.decode('utf-8')words = self.seperate_line(self.clean_str(line))x_train.append(TaggededDocument(words, tags=[index]))return x_train# 第二步,初始化训练模型的参数,再保存训练结果以释放内存def train(self, x_train, size=500, epoch_num=1):self.model_dm = gensim.models.Doc2Vec(x_train, min_count=FLAGS.min_count, window=FLAGS.window, size=size, sample=1e-3, negative=FLAGS.negative, workers=FLAGS.workers)  # 模型的初始化,设置参数#  提供x_train可初始化, min_cout 忽略总频率低于这个的所有单词, window 预测的词与上下文词之间最大的距离, 用于预测  size 特征向量的维数 negative 接受杂质的个数 worker 工作模块数self.model_dm.train(x_train, total_examples=self.model_dm.corpus_count, epochs=epoch_num) # corpus_count是文件个数  epochs 训练次数self.model_dm.save(FLAGS.model_dir)  # 保存模型训练结果,释放内存空间,后续可用load加载return self.model_dm#第三步,利用训练好的模型计算一个文章内容的相似度def getMatchInfos(self, text):matchInfos = []load = loadData()self.load_doc_index()  # 加载index_fileself.model_dm = Doc2Vec.load(FLAGS.model_dir)  # 加载训练的模型   model_dm输出类似Doc2Vec(dm/m,d500,n5,w3,s0.001,t4)test_text = self.seperate_line(self.clean_str(text))inferred_vector_dm = self.model_dm.infer_vector(test_text)sims = self.model_dm.docvecs.most_similar([inferred_vector_dm], topn=5)for index, sim in sims:print(self.doc_dict[index])print(sim)# doc = x_train[int(index)]# doc = doc[0]  # doc包括词袋和编号,这里只要词袋# for word in doc:#     print(word)doc = load.getMatchInfo(index)#从数据库读取matchInfos.append(doc)return matchInfos# 第四步,将字典内容写入文档方便查阅,下次打开程序可以用另外的函数加载,不用重新def save_doc_index(self):index_file = os.path.join(FLAGS.base_dir, "index_file.txt")lines = ""for index in self.doc_dict:lines += str(index) + ' ' + self.doc_dict[index] + '\n'f = open(index_file, 'w')f.write(lines)f.close()def load_doc_index(self):self.doc_dict = {}index_file = os.path.join(FLAGS.base_dir, "index_file.txt")if os.path.exists(index_file):f = open(index_file)lines = f.readlines()# 把文件内容读出来存到lines 再关掉,不占内存f.close()for line in lines:line = line.strip()tokens = line.split(" ")self.doc_dict[int(tokens[0])] = tokens[1]return self.doc_dictdef setModel(self):x_train = self.get_trainset()  # 获取预处理的语料self.save_doc_index()  # 保存index_fileself.model_dm = self.train(x_train, epoch_num=FLAGS.epoch_num)  # 训练模型,若已经训练过可以省略这步return("set model success!")def clean_str(self, string):string = re.sub('\s+', "", string)r1 = u'[A-Za-z0-9’!"#$%&\'()*+,-./:;<=>?@,。?★、…【】《》?“”‘’![\\]^_`{|}~]+'string = re.sub(r1, ' ', string)return string.strip()def seperate_line(self, line):line = pseg.cut(line)new_line = []for words, flag in line:if flag == 'nr' or flag == 'ns':continueif len(flag) == 0:continueif flag[0:1] != 'n' and flag != 'v':continuenew_line.append(words)#return ''.join([word + " " for word in new_line])return new_linedef getInfoDetail(self, text):new_text = {}t_arr = text.split("$#&#$")for item in t_arr:i_arr = item.split(":",1)if len(i_arr) > 1:new_text[i_arr[0]] = i_arr[1]return new_textdef getIndexFromDoct(self, name):if len(self.doc_dict) > 0:for key, value in self.doc_dict.items():if value == name:return keyreturn -1if __name__ == '__main__':
# if __name__ == '__main__' 函数只有直接当作脚本执行时才有效,Import到其他模块时无效r = retrieve()x_train, doc_dict = r.get_trainset() # 获取预处理的语料r.save_doc_index(doc_dict) # 保存index_filedoc_dict = r.load_doc_index()# 加载index_filemodel_dm = r.train(x_train,epoch_num=FLAGS.epoch_num)  # 训练模型,若已经训练过可以省略这步

到这里就能够完成基本的信息检索了。如果需要更复杂的功能,可以在这个代码的基础上进行改造和扩展,也欢迎小伙伴们找我一起交流。共同进步~

python根据关键词实现信息检索推荐(使用深度学习算法)相关推荐

  1. python关键词对联_如何用深度学习框架PaddlePaddle实现智能春联

    引言: 不知不觉春节假期马上到来,在今年的春节话题中,不难发现,除了七大姑八大姨亲切问候这些常规话题,人工智能的踪迹也是随处可见.AI在以全新的面貌向我们展示值得期待的未来,比如今天,我们可以用Pad ...

  2. 岗位推荐 | 实在智能招聘深度学习算法研究员(可实习)

    PaperWeekly 致力于推荐最棒的 AI 相关工作机会,精准地为其找到最佳求职者,做连接优质企业和优质人才的桥梁. 如果你需要我们来帮助你推广实习机会或全职岗位,请添加微信号「pwbot02」. ...

  3. 人工智能:深度学习算法及应用——简单理解CNN卷积神经网络并python实现(带源码)

    深度学习算法及应用 一. 实验目的 二. 实验要求 三. 实验的硬件.软件平台 四. 实验原理 1.1. 深度学习概述 1.2. 深度学习的常见结构 1.3. 卷积神经网络(CNN) **卷积** * ...

  4. 大数据基石python学习_资源 | 177G Python/机器学习/深度学习/算法/TensorFlow等视频,涵盖入门/中级/项目各阶段!...

    原标题:资源 | 177G Python/机器学习/深度学习/算法/TensorFlow等视频,涵盖入门/中级/项目各阶段! 这是一份比较全面的视频教程,基本上包括了市面上所有关于机器学习,统计学习, ...

  5. 推荐 | 一个统计硕士的深度学习算法工程师的成长之路

    公众号推荐 推荐人/文文 俗话说,一个人走得快,但一群人可以走的远.在数据科学和机器学习的道路上,相信每个人都不是闭门造车的人.技术学习除了在个人努力外,交流和分享也是很重要的一部分. 今天给大家推荐 ...

  6. 【重磅干货】Python、机器学习、深度学习算法实战和应用必备书籍

    [导读]首先祝大家中秋佳节快乐,乘此良辰美景,今天就给大家发一波福利干货!本文给大家分享机器学习.深度学习算法实战和应用必备的4本"宝藏"书.具体书籍展示如下:(文末提供下载方式! ...

  7. python开发需要掌握哪些知识-研究深度学习的开发者,需要对 Python 掌握哪些知识?...

    原标题:研究深度学习的开发者,需要对 Python 掌握哪些知识? 今天是918,一个对中国人来说非常特殊的日子.这一天,有些地方可能会拉响警笛,有的地方可能会有一些纪念活动. 但如论如何,今天都是一 ...

  8. 岗位推荐 | 百度招聘计算机视觉、深度学习算法工程师(可实习)

    PaperWeekly 致力于推荐最棒的工作机会,精准地为其找到最佳求职者,做连接优质企业和优质人才的桥梁. 如果你需要我们来帮助你推广实习机会或全职岗位,请添加微信号「pwbot02」. 工作地点: ...

  9. 回归素材(part9)--PYTHON机器学习手册-从数据预处理到深度学习

    学习笔记,仅供参考,有错必纠 PYTHON机器学习手册-从数据预处理到深度学习 通过正则化减少方差 我们可以使用岭回归或者Lasso回归,介绍回归模型的方差.

  10. 媒智科技--深度学习算法Python后台开发--热招中~

    点击我爱计算机视觉标星,更快获取CVML新技术 公司简介 媒智科技源起于上海交通大学,核心团队由上海交大.清华.斯坦福.乔治亚理工等顶尖高校的人工智能教授,以及来自雅虎.腾讯等科技精英组成,聚焦计算机 ...

最新文章

  1. 225.用队列实现栈
  2. 总结:二分法题目汇总 以及二分法模板
  3. python数组转换为列表_python - 将一系列数组转换为单个列表 - SO中文参考 - www.soinside.com...
  4. 计算机视野仪检测青光眼的操作,计算机视野仪检测青光眼的操作及体会
  5. 1.21 方法的可变参数(String...names)
  6. 【生成模型】关于无监督生成模型,你必须知道的基础
  7. Flex与.NET互操作(九):FluorineFx.NET的认证(Authentication )与授权(Authorization)
  8. SAP UI5 -all controls within the same view will share the same data Model
  9. Jerry Wang 2014年在SAP社区CRM板块的积分曾经一直占据第一
  10. opera9.6 的一个顽固的bug
  11. docker 配置文件:/etc/docker/daemon.json
  12. java订单类_基于Java创建一个订单类代码实例
  13. PAT——1074. 宇宙无敌加法器(20)
  14. python向it新增5个元素_Python序列、元组、列表、集合及字典笔记整理
  15. Git——版本管理工具(一)
  16. mac 生成公钥和私钥
  17. html怎么在搜索框中加图片,html – 如何在搜索框中添加图标
  18. word中取消链接上一节在哪_在WORD中怎样取消与上一节相同
  19. 1.1、什么是编程?
  20. C/C++ 如何构造出强悍的宏

热门文章

  1. Python个人快速入门学习(九)jieba库的使用
  2. [机器学习基石]台大林轩田笔记1 -- The Learning Problem
  3. ES学习笔记八-聚合搜索
  4. 内存操作函数:memcmp、memcpy、memmove、memset 的使用与模拟。
  5. 面试算法 香槟塔 ,算法:暴力算法
  6. 为何干电池是1.5v?而充电电池是1.2v?
  7. 2021-08-18-ideal配置github时报:insufficient scopes granted to the token
  8. 如何消除Permission is only granted to system apps报错
  9. alert获取输入框内容_Alert弹出框处理
  10. 跑马灯实现的三种方式