从0构建AI推荐系统demo(数据处理与入库)
前言
通过上一篇文章数据准备,从网上下载数据集或爬虫爬取新闻(筹划ing...)后,可以得到基本的原始数据集,本篇文章主要介绍数据清洗与筛选,并存入数据库。代码见GitHub
注:本篇文章针对特定的文本数据进行清洗与筛选,对于不同类型的数据来说可以选用特定的工具,如:Pandas、Numpy
一、分析数据
针对特定的字段逐个分析,首先需要找到那些数据是有价值的内容,就像在爬虫中,需要针对性的选择哪些数据是我们想要的,分析的结果是有价值的一样。
二、筛选字段
针对此数据集,筛选如下字段:
"uuid": "245bd81f0ae706b4f18a43ede70ed85b80c581a8",
"url": "http://news.eastday.com/eastday/13news/auto/news/world/20161002/u7ai6083740.html",
"title": "韩国宣布“萨德”最终部署地引发新一轮抗议",
"text": "\n2016年10月2日 15:25 \n\n韩国民......(此处省略内容).....记者马菲 \n",
"published": "2016-10-02T08:00:00.000+03:00",
uuid代表此新闻的唯一标识;url代表此新闻的链接地址;title为标题;text为正文内容;published为发表时间。
三、数据清洗
3.1 标题
针对标题格式的不一致性,需要对标题进行多种操作处理,简单列举一种:
# title = "人权之花开遍神州 人权事业再奏华章-天山网"
originalTitle = text["title"]
title = originalTitle.split("-")[0]
后期将针对多种不同的标题类型进行更多方面的处理。
3.2 时间
import datetime# time = "2016-10-02T08:00:00.000+03:00"
originalTime = text["published"].split(".")[0].replace("T", " ")
# string to datetime
dateTime = datetime.datetime.strptime(originalTime, "%Y-%m-%d %H:%M:%S")
在时间的处理过程中,需要通过 datetime.strptime() 函数将字符串类型的时间变量转换成datetime类型。
3.3 正文
"text": "\n2016年10月2日 15:25 \n\n韩国民间团体30日在国防部门前举行抗议“萨德”示威活动。摄影:人民网记者马菲 \n人民网韩国10月2日电 韩国国防部30日宣布,将“萨德”反导系统(末段高空区域防御系统)的“最终”部署地确定为庆尚北道星州郡的星州
......(此处省略)......
门前举行抗议“萨德”示威活动。摄影:人民网记者马菲 \n上一页 下一页 \n\n位于韩国国防部对面的韩国战争纪念馆。摄影:人民网记者马菲 \n上一页 下一页 \n\n韩国小朋友在战争纪念馆广场上嬉戏。摄影:人民网记者马菲 \n",
对于正文来说,需要处理的内容很多,处理的结果也是直接影响后期分词、训练的因素之一。
在此,针对不同的问题与处理方式总结如下,会不定期的更新补充:
# originalContent 为正文内容# 1. 针对上一页、下一页的多余内容删除
originalContent[:originalContent.find("上一页")]
# find() 返回第一个目标字符串所在的index,否则返回-1# 2. 替换两个换行符 "\n\n" (在一个换行符之前处理)
originalContent.replace("\n\n", "。")# 3. 替换换行符 "\n"
originalContent.replace("\n", "")# 4. 替换空格
originalContent.replace(" ", "")
3.4 繁简转换
from langconv import *originalContent = Converter('zh-hans').convert(originalContent)
四、数据入库
数据库采用MySQL,数据量大概31万条左右。查询优化与数据去重将在后续考虑...
4.1 构建数据库表结构
数据库表结构构建如下:
pk_id int 30 自增ID
news_id int 30 新闻ID
title varchar 255 标题
time_publish data_time 发布时间
source varchar 255 来源(url)
abstract text 摘要
content text 内容
divide_words varchar 分词结果
tag varchar 255 类别标签
tag_score float 10 类别标签概率
lv1_tag varchar 255 一级分类结果
lv1_tag_score float 10 一级分类标签概率
lv2_tag varchar 255 二级分类结果
lv2_tag_score float 10 二级分类标签概率
time_create data_time 创建时间
time_modified data_time 修改时间
预留字段1
预留字段2
其中,tag类别标签代表最终该条咨询的分类类别,tag_score为该类别标签的概率;lv1_tag,lv2_tag分别为一级、二级分类的结果,该字段对应百度NLP分类。
4.2 数据批量入库(好的办法)
一般数据库的写入操作如下所示,对于特定的字段插入特定的内容即可。
def write2mysql(jsonData):conn = pymysql.connect(host="localhost", user='', password='', database = 'ai_recommendation', charset='utf8')cursor = conn.cursor();sql = "INSERT INTO news(news_id, title, time_publish, source, abstract, content, time_create) values " \"('%s','%s','%s','%s','%s','%s','%s')" % \(jsonData.uuid, jsonData.title, jsonData.dateTime, jsonData.url, None, jsonData.content, time.strftime("%Y-%m-%d %H:%M:%S", time.localtime()) )try:cursor.execute(sql)conn.commit()except:print(traceback.format_exc())conn.rollback()
虽然目前的数据量不多,但是随着后续的爬虫数据进入,很有必要考虑下数据入库的优化方式,循环的读取、清洗、入库对于性能来说有一定的影响,时间较慢。
导致节点插入时间非常慢的原因包括以下几点:
1、连接数据库的问题:主要因为建立连接和关闭连接的次数太多,导致IO访问次数过于频繁。
2、应该使用批量插入和批量修改的方法,而不是有一条数据就进行插入,这样会导致访问数据库的实际特别的慢。
3、在建立库的时候要建立适当的索引:如主键、外键、唯一等,优化查询效率。
经试验测试,1000条数据插入到数据库中耗时约60s,插入的正文内容大概三四百文字左右。
安装这种方式插入数据,效率是极低的。但是通过批量插入的方式,可以极大的提高效率,主要通过python的gevent模块。
gevent模块介绍如下:
gevent is a coroutine-based Python networking library that uses greenlet to provide a high-level synchronous API on top of libev event loop.
即gevent是基于协程的python网络库,更详细的文章参见:
基于协程的Python网络库gevent介绍
gevent官方文档
首先安装gevent库:
pip install gevent
采用gevent异步修改原代码如下:
"""!/usr/bin/env python3.6-*- coding: utf-8 -*---------------------------------------@Description : Store the processed data in the database--------------------------------------@File : data2database.py@Time : 2018/9/2 21:46@Software : PyCharm--------------------------------------@Author : lixj@Contact : lixj_zj@163.com--------------------------------------
"""import pymysql
import time
import gevent
from dataRelated import dataProcessing
import tracebackclass data2Mysql:def __init__(self):self.host = "localhost"self.user = ""self.password = ""self.database = "ai_recommendation"self.charset = "utf8"def DBConnect(self):self.conn = pymysql.connect(host = self.host, user = self.user, password = self.password, database = self.database, charset = self.charset)self.cursor = self.conn.cursor();def asynchronous(self, maxLineInsert, totalDataVolume, jsonData):taskList = [gevent.spawn(self.write2mysql(i, i+maxLineInsert, jsonData)) for i in range(1, totalDataVolume, maxLineInsert)]gevent.joinall(taskList)self.cursor.close()self.conn.close()def write2mysql(self, nmin, nmax, jsonData):list = []for i in range(nmin, nmax):list.append((jsonData.uuid, jsonData.title, jsonData.dateTime, jsonData.url, None,jsonData.content, time.strftime("%Y-%m-%d %H:%M:%S", time.localtime())))sql = "INSERT INTO news(news_id, title, time_publish, source, abstract, content, time_create) values " \"(%s, %s, %s, %s, %s, %s, %s)"try:affectedRows = self.cursor.executemany(sql, list)# 打印输出依然耗时# if affectedRows:# print("已完成:", affectedRows, "行.")self.conn.commit()except:print(traceback.format_exc())self.conn.rollback()# jsonData 作为参数传递的次数越少越好
if __name__ == '__main__':oneJsonData = dataProcessing.getOneJsonData()# 每次最大插入行数maxLineInsert = 100# 插入数据总数totalDataVolume = 1000beginTime = time.time()data2Mysql = data2Mysql()data2Mysql.DBConnect()data2Mysql.asynchronous(maxLineInsert, totalDataVolume, oneJsonData)print("used time:", (time.time()-beginTime))
经测试,同样插入1000条数据,耗时为:
之前的60s降低到0.67s.....提高了近100倍!!并且在当大数据量的时候,时间并不是以线性增加,测试一万条数据,耗时4.06秒。
五、总结
1. 本文主要介绍了基本的数据处理与入库的内容,考虑到数据的特殊性,针对已有的数据,进行同样的处理方式处理;
2. python协程极大的缩短IO操作、数据库操作的耗时;
3. 删除表中的大量数据时,可以采用 TRUNCATE news,但是需要重启表后显示后续的操作结果。
参考链接:
http://blog.51cto.com/haowen/2139510
从0构建AI推荐系统demo(数据处理与入库)相关推荐
- 从0构建AI推荐系统demo(数据准备)
前言 推荐系统一直以来都是人工智能领域中较为火热的研究方向之一,最近公司需要构建常见的资讯类推荐系统,本人也从无到有.从0开始构建AI推荐系统demo版.此篇主要讲述最基本的数据准备中,最最最最基本的 ...
- 王家林人工智能AI第19课:使用决策树在Social Network上构建汽车销售推荐系统老师微信13928463918
王家林人工智能AI第19课:使用决策树在Social Network上构建汽车销售推荐系统老师微信13928463918
- 「构建企业级推荐系统系列」深度学习在推荐系统中的应用
点击上方"数据与智能","星标或置顶公众号" 第一时间获取好内容 作者 | gongyouliu 编辑 | auroral-L 2016年DeepMind开发的 ...
- 「构建企业级推荐系统系列」实时个性化推荐介绍
作者 | gongyouliu 编辑 | auroral-L 随着互联网的深入发展和产品布局的多元化,越来越多的企业通过提供快节奏的产品及服务消耗用户的碎片化时间,从而赢得用户的青睐.这类产品通过便捷 ...
- GMIS 2017大会戴文渊演讲:构建AI商业大脑
GMIS 2017大会戴文渊演讲:构建AI商业大脑 2017-05-27 14:05:58 深度学习 0 0 0 全球机器智能峰会(GMIS 2017),是全球人工智能产业信息服务平台机器 ...
- 【机器学习】使用 Python 构建电影推荐系统
本文将余弦相似度与 KNN.Seaborn.Scikit-learn 和 Pandas 结合使用,创建一个使用用户评分数据的电影推荐系统. 在日常数据挖掘工作中,除了会涉及到使用Python处理分类或 ...
- Mahout构建图书推荐系统
前言 本文是Mahout实现推荐系统的又一案例,用Mahout构建图书推荐系统.与之前的两篇文章,思路上面类似,侧重点在于图书的属性如何利用.本文的数据在自于Amazon网站,由爬虫抓取获得. 目录 ...
- 开发者-ChatGPT meets Web3.0 用AI赋能去中心化应用
ChatGPT meets Web3.0: 用AI赋能去中心化应用 随着Web3.0的到来,去中心化应用(dApps)正在成为新的热点.与传统的Web2.0应用相比,Web3.0应用具有更高的安全性. ...
- NVIDIA DeepStream 5.0构建智能视频分析应用程序
NVIDIA DeepStream 5.0构建智能视频分析应用程序 无论是要平衡产品分配和优化流量的仓库,工厂流水线检查还是医院管理,要确保员工和护理人员在照顾病人的同时使用个人保护设备(PPE),就 ...
最新文章
- 模板 - 输入输出优化
- PostgreSQL 10.0 preview 功能增强 - 后台运行(pg_background)
- CSS——清除浮动的六种解决方案
- python数组中变化最大的值
- boost::msm::mpl_graph::adjacency_list_graph相关的测试程序
- 云上城之个服务器维护时间,云上城之歌寒冬边界开服时间表_云上城之歌新区开服预告_第一手游网手游开服表...
- WS-Security:使用BinarySecurityToken进行身份验证
- bufferedreader读取中文乱码_python之pandas模块关于csv文件乱码问题解决
- 梦聆轻量化音乐播放器源码
- linux-文件路径
- Android开发笔记(一百四十三)任务调度JobScheduler
- 海龟绘图两小时上手C语言 - 3 正方形螺旋线
- android之去掉空包合并
- python创建字典的两种方法
- InvokeRequired和Invoke
- 局域网文件共享服务器软件,局域网文件夹加密工具哪个好?文件共享服务器软件介绍...
- 搜狗输入法在别的屏幕
- 王者荣耀战区在线查询_王者战力查询工具
- matlab 显示程序进度条,matlab学习---------------进度条waitbar
- VMware版虚拟机怎么安装win7系统(详细教程)
热门文章
- Android牟利之道--广告平台的介绍
- 愣头青法学习openstack——零基础学习openstack的建议
- 1678. 设计 Goal 解析器
- cesium实现二三维分屏地图同步效果
- 【C语言】用C语言实现最大公约数和最小公倍数【超详细讲解】
- Geant4学习笔记(一)-运行Geant4实例
- jdk32位安装包下载_神灯地图大数据采集软件下载_神灯地图大数据采集软件 v4.6.0 官方版...
- 如何用指针的方法打印数组的元素
- 保研面试/考研复试概率论与数理统计问题整理
- 基于Verilog用状态机设计交通灯控制器